首先,我不是How to parse invalid (bad / not well-formed) XML?的副本,因为我没有给定的无效(或格式不正确)XML文件,而是给定的任意Java String
,它可能或可能不包含无效的XML字符。我想创建一个包含具有给定Document
的Text
节点的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使用"
,&
,'
,<
和>
,"
,&
,'
和<
自动转义了预定义的实体。解析文件时,结果文件中的>
由DOM API撤消。现在的问题是,其他无效字符(例如'\u0000'
)不是这种情况。
[可能我必须实现一种方法,该方法以独特的方式对给定String
中的那些字符进行转义,然后再将其提交给DOM API,并在稍后再获得String
时撤消该方法,对吗?有一个更好的方法吗?过去有人实施过这些或类似方法吗?请注意,除了DOM API,我不能使用其他库或API。
编辑:
此问题被标记为Best way to encode text data for XML in Java?的重复。我现在已经阅读了所有答案,但是没有一个能解决我的问题。所有答案都表明:"
,&
,'
,<
,>
和其他一些库之外,这些库中的任何一个都不会替代无效字符。] >"&#number;"
替换所有无效字符,这会导致无效字符(例如"�"
)的异常。"�"
(在某些库中被跳过)的XML编码方法)的第三方库。首先,我想提一下,这不是如何解析无效(不良/格式不正确)XML的副本?因为我没有给定的无效(或格式不正确)XML文件,而是给定的...
正如@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<text&text##</element>
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("test.xml"));
System.out.println(unescapeInvalidXmlCharacters(document.getDocumentElement().getTextContent()).equals(string));
// prints true