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

标签 java xml dom transformer-model

我正在读取从外部系统检索的 Java XML 文件,然后对其进行处理,最终将其保存在本地并将其部署回来。

外部系统给我一个包含此节点的 XML 文件:

    <customApplications>
        <label><!-- GDPR Management --></label>
        <name>GDPR_Management</name>
    </customApplications>

问题出在评论节点上。 当我读取文件然后保存它时,结果如下所示:

    <customApplications>
        <label>
            <!-- GDPR Management -->
        </label>
        <name>GDPR_Management</name>
    </customApplications>

这是一个问题,因为当我将文件部署回外部系统时,它现在认为标签有一些文本内容。所以我需要与原来相同的结果,即注释节点周围没有换行符。

我尝试删除所有注释节点,这在部署文件时效果很好,但是该文件也使用 git 进行版本控制,并且它会产生许多合并冲突,因为该文件可以随时从外部系统再次检索(检索到的文件再次带有注释节点,如第一个示例中所示)。

然后我尝试在保存之前将所有注释节点更改为文本节点。结果再次 Not Acceptable ,因为标签再次包含一些文本内容:

    <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 中表示。

感谢您的任何提示!

最佳答案

如果您希望输出与原始内容相同,请不要使用 indent="yes"。指定 indent="yes" 允许序列化程序在任何需要的地方很好地插入空格。

关于java - Java中如何读写XML文件并在保存时将注释节点视为文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58149533/

相关文章:

javascript - 使用嵌套(?) anchor 标记在页面上定位内容?

java - 为什么在 while 循环中使用 foreach 循环会出错?

java - 没有 java 就无法运行 izpack 安装程序

xml - 将科学计数法中的字符串转换为 XPath 中的数字格式

javascript - Instagram 自动评论

c# - C# 中的 mshtml.HTMLDocumentClass

java - selenium Webdriver 在页面上找不到元素

java - @RequestMapping是如何实现支持灵活签名的

c# - USPS 地址验证 API : If & or # symbol in address field then API returns error response

java - 在没有根架构的情况下验证 XML