【问题标题】:Remove XML node using Java SE使用 Java SE 删除 XML 节点
【发布时间】:2011-08-25 12:05:46
【问题描述】:

如何在 Java SE 中移除 XML 节点?我正在使用org.apache.xerces。谢谢。下面的代码不起作用。

DOMParser parser = new DOMParser();
System.out.println(DIR_STRING + "/" + jmsFileNameString);
parser.parse(DIR_STRING + "/" + jmsFileNameString);
Document doc = parser.getDocument();
NodeList list = doc.getElementsByTagName("*");
for (int i = 0; i < list.getLength(); i++) {
    if (list.item(i).getNodeName().matches(HEADER_REGEXP)) {
        list.item(i).getParentNode().removeChild(list.item(i)));
    }
}

【问题讨论】:

    标签: java xml xerces domparser


    【解决方案1】:

    为此创建一个完整的 DOM 有点过头了。您将在内存中拥有整个 XML 树,这对于大型文档来说可能相当繁重。我建议以下之一:

    • 使用 SAX 或 StAX 进行解析,只需将内容复制到输出,除非您希望将其过滤掉。
    • 应用默认复制所有内容的 XSLT 转换,但有一个或多个模板不对其输入做任何事情,从而将其过滤掉。

    选项 2 是最简单的,根据我的经验,Java 中的 XSLT 快速且节省内存,尤其是对于像这样的简单用例。

    这两个模板将是您所需要的:

    默认副本

    <xsl:template match="node()|@*">
        <xsl:copy><xsl:apply-templates select="node()|@*"/><xsl:copy>
    </xsl:template>
    

    “过滤器”:

    <xsl:template match="//*[your predicate here]">
        <!-- Don't do a thing -->
    </xsl:template>
    

    编辑:我刚刚注意到您不只是过滤掉特定的名称,而是那些匹配正则表达式的名称。 XPath 函数足以使谓词选择目标节点。但是如果需要,可以通过扩展在 XSLT 中使用 Java 字符串函数。它确实使这个解决方案稍微复杂了一些,但仍然值得您不用自己进行 XML 解析。

    【讨论】:

      【解决方案2】:

      确实有效;但是,它不会保存到 XML 文件中。更改保存在 Document 对象中。

      保存到文件中的 Document 对象:

          OutputFormat of = new OutputFormat("XML","UTF-8",true);
          XMLSerializer serializer = new XMLSerializer();
          serializer.setOutputFormat(of);
          serializer.setOutputByteStream(new FileOutputStream(PATH));
          serializer.serialize(doc);
      

      【讨论】:

      • 好的,那么您需要将树保存回 XML。您可以使用 org.w3c.dom.ls 包中的 LSSerializer
      【解决方案3】:

      快速浏览一下,我说不出为什么。 尝试使用 Eclipse 中的调试器为我们提供更多信息。 在您的方法中设置一个调试点并逐步检查并检查每一行。

      使用调试表达式检查循环以验证所有内容都具有您希望缩小问题范围的状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多