我正在读取从外部系统检索到的 Java 中的 XML 文件,然后对其进行处理并最终将其保存在本地并重新部署。
外部系统给了我一个包含这个节点的 XML 文件:
<customApplications>
<label><!-- GDPR Management --></label>
<name>GDPR_Management</name>
</customApplications>
问题是评论节点。当我读取文件然后保存它时,结果如下所示:
<customApplications>
<label>
<!-- GDPR Management -->
</label>
<name>GDPR_Management</name>
</customApplications>
这是一个问题,因为当我将文件部署回外部系统时,它现在认为标签有一些文本内容。所以我需要和原来一样的结果,即评论节点周围没有换行符。
我尝试删除所有注释节点,这在部署文件时效果很好,但是文件也使用 git 进行版本控制,并且它会产生许多合并冲突,因为文件可以随时从外部系统再次检索(检索到的文件是再次使用注释节点,如您在第一个示例中所见)。
然后我尝试在保存之前将所有评论节点更改为文本节点。结果又是不可接受的,因为标签又多了一些文字内容:
<customApplications>
<label><!-- GDPR Management --></label>
<name>GDPR_Management</name>
</customApplications>
我如何阅读文件:
var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
var document = docBuilder.parse(inputStream);
document.getDocumentElement().normalize();
var xp = XPathFactory.newInstance().newXPath();
var nl = (NodeList) xp.evaluate("//text()[normalize-space(.)='']", document, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); ++i) {
var node = nl.item(i);
node.getParentNode().removeChild(node);
}
我如何保存文档:
var result = new StreamResult(outputStream);
var transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(document), result);
我确实需要与第一个示例相同的结果,但我不关心在处理文件时注释节点将如何在 dom 中表示。
感谢您的任何提示!