Java DOM转换和解析具有无效XML字符的任意字符串?

问题描述 投票:0回答:1

首先,我不是How to parse invalid (bad / not well-formed) XML?的副本,因为我没有给定的无效(或格式不正确)XML文件,而是给定的任意Java String,它可能或可能不包含无效的XML字符。我想创建一个包含具有给定DocumentText节点的DOM String,然后将其转换为文件。当文件解析为DOM Document时,我想获得一个String,它等于初始给定的String。我用Text创建org.w3c.dom.Document#createTextNode(String data)节点,并用org.w3c.dom.Node#getTextContent()获得字符串。

您可以在https://stackoverflow.com/a/28152666/3882565中看到,XML文件中Text节点有一些无效字符。实际上,Text节点有两种不同类型的“无效”字符。 DOM API使用"&'<>&quot;&amp;&apos;&lt;自动转义了预定义的实体。解析文件时,结果文件中的&gt;由DOM API撤消。现在的问题是,其他无效字符(例如'\u0000')不是这种情况。

[可能我必须实现一种方法,该方法以独特的方式对给定String中的那些字符进行转义,然后再将其提交给DOM API,并在稍后再获得String时撤消该方法,对吗?有一个更好的方法吗?过去有人实施过这些或类似方法吗?请注意,除了DOM API,我不能使用其他库或API。

编辑:

此问题被标记为Best way to encode text data for XML in Java?的重复。我现在已经阅读了所有答案,但是没有一个能解决我的问题。所有答案都表明:
  • 使用我已经做过的XML库(例如DOM API),除了"&'<>和其他一些库之外,这些库中的任何一个都不会替代无效字符。] >
  • 在解析文件时,用"&#number;"替换所有无效字符,这会导致无效字符(例如"&#0;")的异常。
  • 使用带有不支持非法字符(例如"&#0;"(在某些库中被跳过)的XML编码方法)的第三方库。
  • 使用也不支持无效字符的CDATA部分。
  • 首先,我想提一下,这不是如何解析无效(不良/格式不正确)XML的副本?因为我没有给定的无效(或格式不正确)XML文件,而是给定的...

java xml dom escaping invalid-characters
1个回答
0
投票

正如@VGR和@kjhughes在问题下方的注释中指出的那样,Base64确实是我问题的可能答案。现在,我确实有一个基于转义的问题的进一步解决方案。我编写了2个函数escapeInvalidXmlCharacters(String string)unescapeInvalidXmlCharacters(String string),可以按以下方式使用。

    String string = "text#text##text#0;text" + '\u0000' + "text<text&text#";
    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    Element element = document.createElement("element");
    element.appendChild(document.createTextNode(escapeInvalidXmlCharacters(string)));
    document.appendChild(element);
    TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(new File("test.xml")));
    // creates <?xml version="1.0" encoding="UTF-8" standalone="no"?><element>text##text####text##0;text#0;text&lt;text&amp;text##</element>
    document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("test.xml"));
    System.out.println(unescapeInvalidXmlCharacters(document.getDocumentElement().getTextContent()).equals(string));
    // prints true
© www.soinside.com 2019 - 2024. All rights reserved.