禁用XML中的自动“&”转义,或者相反,如何将Unicode编写为&#x1234 ;?

时间:2019-10-25 08:40:33

标签: java xml escaping

我有这段代码

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());

所以问题似乎出在变压器上。

1 个答案:

答案 0 :(得分:1)

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

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