使用Java SE删除XML节点

时间:2011-08-25 12:05:47

标签: java xml xerces domparser

如何在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)));
    }
}

3 个答案:

答案 0 :(得分: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 String函数。它确实使这个解决方案稍微复杂一点,但仍然值得将XML解析从你手中解放出来。

答案 1 :(得分: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);

答案 2 :(得分:-1)

快看,我不能说为什么。 尝试在eclipse中使用调试器为我们提供更多信息。 在方法和步骤槽中设置调试点并检查每一行。

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