【问题标题】:Disable automatic ampersand escaping in XML?禁用 XML 中的自动 & 符号转义?
【发布时间】: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é,则getEscapedFromgetEscapedTo 返回(在我的代码中)类似finké 的内容。以便对大于 127 的字符进行 Unicode 转义。

问题是最终的 XML 有以下行 <elem from="finke" to="finké" />fromfinketofinké)我希望它是 <elem from="finke" to="finké" />

在 StackOverflow 中的另一个响应之后,我尝试在创建 doc 之后禁用 & 符号的转义,但没有成功。

我如何“告诉 XML”不要转义 & 符号?或者,反过来,我怎么能让“XML”从é,或\\u00E9,转换为é

更新

我设法解决了问题:在写入文件之前,节点(通过调试)似乎包含正确的字符串。一旦我打电话给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 字符。
  • 如果没有其他方法可以做到这一点,这将很有用...必须打开生成的文件以将所有 & 替换为 & 似乎不是正确的方法要做的事情:如果有一个&没有被转换成&怎么办?

标签: java xml escaping


【解决方案1】:

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

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

【讨论】:

  • 够近了!一旦我设置了transformer.setOutputProperty(OutputKeys.ENCODING, StandardCharsets.US_ASCII.name());,我就获得了finké。它不是十六进制的,但我认为读取此 xml 的程序不会抱怨。谢谢!
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多