java - 解析 XML 中存在的垂直制表符编码字符

标签 java xml parsing dom

我正在处理一个从输入生成 XML 的遗留系统。此输入有时包含垂直制表符 控制字符。这些字符然后在生成的 XML 中进行编码。垂直制表符可以用 Java 字符串写成 \u000B。下面是一个示例代码,说明发生了什么(原始过程从输入中获取字符串,并在没有任何预处理的情况下创建文本节点):

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document doc = documentBuilder.parse(new InputSource(new StringReader("<xml></xml>")));
    Element sample = doc.createElement("sample");
    sample.appendChild(doc.createTextNode("Hello\u000BWorld"));
    doc.getDocumentElement().appendChild(sample);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));

这会产生一个无效的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?><xml>
    <sample>Hello&#11;World</sample>
</xml>

现在我需要使用相同的解析器,即:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(theResultFromAbove)));

并再次生成 Document 实例。但这失败了:

[Fatal Error] :2:23: Character reference "&#
org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 23; Character reference "&#
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)

我控制了第二个解析器,因此我可以在它解析输出之前搜索并替换 。我还对首先生成 XML 的代码有一定的控制权,因此我可以在所有这些发生之前简单地删除垂直制表符。

但是,我可以做些什么来添加实现 实体,这样解析器不仅会对其进行编码,还能正确解码?

最佳答案

不确定这是否适合您,但是将 XML 版本从 1.0 更改为 1.1 会打开有效字符列表以包括除 0x00 之外的所有控制字符,从而使文档包含 0x0BVT 有效。

要将版本设置为 1.1,请在转换器中添加以下配置:

transformer.setOutputProperty(OutputKeys.VERSION, "1.1");

关于java - 解析 XML 中存在的垂直制表符编码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42358784/

相关文章:

java - 启动 Java 桌面应用程序并摆脱 Commander

java - 我如何使用 JUnit 在 DAO 层中激发 SQLExcetpion

运行 testng selenium 测试用例时出现 java.lang.ExceptionInInitializerError

c# - 如何从 wcf 服务发送大型 xml 文件

c++ - 使用 boost::spirit 解析 Newick 语法

java.lang.NoSuchMethodError : org. mockito.Mockito.framework()Lorg/mockito/MockitoFramework

xml - 有效地访问对象模型中的父元素

javascript - XPath根据另一个节点的位置按位置选择一个节点

javascript - 解析标签javascript的html属性

objective-c - 解析 Objective-C 代码进行静态分析