使用Java SE删除XML节点

问题描述:

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

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))); 
    } 
} 

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

要保存到文档对象文件:

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

好的,那么你需要将树保存回XML。您可以使用org.w3c.dom.ls包中的LSSerializer –

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

用调试表达式检查循环,以验证所有事情都具有希望缩小问题的状态。

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