【发布时间】:2019-10-25 08:40:33
【问题描述】:
考虑:
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 文件)
如果原始单词是finké,则getEscapedFrom 和getEscapedTo 返回(在我的代码中)类似finké 的内容。以便对大于 127 的字符进行 Unicode 转义。
问题是最终的 XML 有以下行 <elem from="finke" to="fink&amp;#xE9;" />(from 是 finke,to 是 finké)我希望它是 <elem from="finke" to="fink&#xE9;" />
在 StackOverflow 中的另一个响应之后,我尝试在创建 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());
问题似乎出在变压器上。
【问题讨论】:
-
这样的转义并不是特别有用,Java 的 Document 模型也没有提供任何东西来做这件事。您可以先生成 XML,然后按照通常的方式替换所有非 ascii 字符。
-
如果没有其他方法可以做到这一点,这将很有用...必须打开生成的文件以将所有
&amp;替换为&amp;似乎不是正确的方法要做的事情:如果有一个&amp;没有被转换成&amp;怎么办?