保存时如何读写XML文件并将注释节点视为Java中的文本节点

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

我正在读取从外部系统检索到的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>&lt;!--  GDPR Management  --&gt;</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中表示注释节点。

感谢任何提示!

java xml dom transformer
1个回答
0
投票

如果您希望输出与原始输出相同,请不要使用indent =“ yes”。指定indent="yes"可使序列化程序在所需的任何位置插入空白。

© www.soinside.com 2019 - 2024. All rights reserved.