gpt4 book ai didi

java - 禁用 XML 中的自动 & 转义?

转载 作者:行者123 更新时间:2023-12-02 09:22:54 24 4
gpt4 key购买 nike

考虑:

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 文件)

哪里getEscapedFromgetEscapedTo返回(在我的代码中)类似 finké 的内容如果原始单词是 finké 。从而对大于127的字符进行Unicode转义。

问题是最终的 XML 具有以下行 <elem from="finke" to="fink&amp;#xE9;" /> ( fromfinketofinké )我希望它是 <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());

问题似乎出在变压器上。

最佳答案

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

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

关于java - 禁用 XML 中的自动 & 转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com