为了账号安全,请及时绑定邮箱和手机立即绑定

禁用 XML 中的自动 & 转义?

禁用 XML 中的自动 & 转义?

达令说 2023-12-30 16:05:57
考虑:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.newDocument();Element root = doc.createElement("list");doc.appendChild(root);for(CorrectionEntry correction : dictionary){    Element elem = doc.createElement("elem");    elem.setAttribute("from", correction.getEscapedFrom());    elem.setAttribute("to", correction.getEscapedTo());    root.appendChild(elem);}(然后将文档写入 XML 文件)wheregetEscapedFrom并getEscapedTo返回(在我的代码中)类似于fink&#xE9;如果原始单词是finké. 从而对大于127的字符进行Unicode转义。问题是最终的 XML 有以下行<elem from="finke" to="fink&amp;#xE9;" />(fromis finke,tois finké),我希望它位于<elem from="finke" to="fink&#xE9;" />我已经尝试按照 StackOverflow 中的另一个响应来禁用 & 符号的转义,并将该行放在doc.appendChild(doc.createProcessingInstruction(StreamResult.PI_DISABLE_OUTPUT_ESCAPING, "&"));创建之后,doc但没有成功。我如何“告诉 XML”不要转义 & 符号?é或者,相反,我怎样才能让“XML”从, 或,转换\\u00E9为&#xE9;?更新我设法解决了这个问题:直到写入文件为止,节点(通过调试)似乎包含正确的字符串。一旦我打电话,transformer.transform(domSource, streamResult);一切都会变得疯狂。DOMSource domSource = new DOMSource(doc);ByteArrayOutputStream baos = new ByteArrayOutputStream();StreamResult streamResult = new StreamResult(baos);Transformer transformer = TransformerFactory.newInstance().newTransformer();transformer.transform(domSource, streamResult);System.out.println(baos.toString());问题似乎出在变压器上。
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

尝试setOutputProperty("encoding", "us-ascii")在变压器上进行设置。这告诉序列化器仅使用 ASCII 字符生成输出,这意味着任何非 ASCII 字符都将被转义。但是您无法控制它是十进制还是十六进制转义(除非您使用 Saxon-PE 或更高版本作为您的Transformer,在这种情况下有一个序列化选项来控制它)。

尝试“手动”进行序列化从来都不是一个好主意。至少有三个原因:(a) 你会弄错(我们看到很多这样的问题是由人们以这种方式生成糟糕的 XML 引起的),(b) 你应该使用这些工具,而不是反对它们,(c )编写序列化程序的人比您更了解 XML,并且他们知道对他们的期望。您可能正在处理由对 XML 的理解非常肤浅的人编写的需求。


查看完整回答
反对 回复 2023-12-30
  • 1 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信