2

如何删除 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)));
    }
}
4

3 回答 3

3

为此创建一个完整的 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 解析。

于 2011-08-25T12:14:57.103 回答
0

它确实有效;但是,它不会保存到 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);
于 2011-08-25T12:13:44.547 回答
-1

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

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

于 2011-08-25T12:14:33.503 回答