在 XML 中禁用自动转义符号?

Disable automatic ampersand escaping in XML?

考虑:

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 return(在我的代码中)如果原始单词是 finké,则类似于 finké。以便对大于127的字符进行Unicode转义。

问题是最后的XML有下面一行<elem from="finke" to="fink&amp;#xE9;" />fromfinketofinké)我希望它是 <elem from="finke" to="fink&#xE9;" />

根据 Whosebug 中的另一个响应,我已尝试在创建 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,在这种情况下有一个序列化选项来控制它)。

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