在我的应用程序中,我使用LSSerializer
将XML文档转换为具有漂亮打印格式的字符串:
public static String convertDocumentToString(Document doc) {
DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); // Set this to true if the output needs to be beautified.
return lsSerializer.writeToString(doc);
}
在我的页面上,我有以下漂亮的XML字符串:
<result>
<category catKey="school_level">
<category catKey="primary">
<category catKey="primary_1">
<category catKey="math_primary_1"/>
<category catKey="chinese_primary_1"/>
</category>
<category catKey="primary_2"/>
<category catKey="primary_3"/>
</category>
<category catKey="jc"/>
</category>
</result>
我使用以下方法解析上面的字符串:
public static Document parseXml(String xml)
throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(false);
docFactory.setValidating(false);
docFactory.setFeature("http://xml.org/sax/features/namespaces", false);
docFactory.setFeature("http://xml.org/sax/features/validation", false);
docFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
docFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));
return doc;
}
这是我的测试功能:
public void test() {
Document doc = Test.parseXml("pretty-print-XML-string");
NodeList childList = result.getDocumentElement().getChildNodes();
for (int j = 0 ; j < childList.getLength() ; j++) {
System.out.println("TEST: " + childList.item(j));
}
}
我希望只能看到1个category
子节点。但是,在控制台上,我看到以下几行:
INFO: TEST 2: [#text:
]
INFO: TEST 2: [category: null]
INFO: TEST 2: [#text:
]
INFO: TEST 2: [#text:
]
如果我从lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
函数中删除convertDocumentToString
,那么所有[#text:]
个节点都不再出现。
如果有人能向我解释为什么解析文档中有一些[#text:]
个节点,我将非常感激。另外,请给我一个关于如何解析漂亮的XML字符串的建议。
答案 0 :(得分:0)
为了进行漂亮的打印,我们为您提供的内容添加了新的行和空格。
解析漂亮的打印XML时,会得到包含这些新行和空格的其他文本节点。
如果我没记错,你可以告诉DocumentBuilderFactory忽略空格节点。
答案 1 :(得分:0)
空白(\n\t
)是#text
只需跳过字符串值与\\s+
匹配的文本节点和/或执行类似
public String unPretty(String pretty) {
return pretty.replaceAll(">\\s+<","><");
}