使用JavaSE删除XML节点
如何在JavaSE中删除XML节点?我正在使用使用JavaSE删除XML节点,java,xml,xerces,domparser,Java,Xml,Xerces,Domparser,如何在JavaSE中删除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 =
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)));
}
}
DOMParser=newdomparser();
System.out.println(DIR_字符串+“/”+jmsFileNameString);
parse(DIR_STRING+“/”+jmsFileNameString);
Document doc=parser.getDocument();
节点列表=doc.getElementsByTagName(“*”);
对于(int i=0;i
它确实有效;但是,它不会保存到XML文件中。更改保存在文档对象中
要保存到文件中的文档对象,请执行以下操作:
OutputFormat of = new OutputFormat("XML","UTF-8",true);
XMLSerializer serializer = new XMLSerializer();
serializer.setOutputFormat(of);
serializer.setOutputByteStream(new FileOutputStream(PATH));
serializer.serialize(doc);
快速看一眼,我说不出原因。 尝试使用eclipse中的调试器为我们提供更多信息。 在方法和步骤中设置调试点,并检查每一行
使用调试表达式检查循环,以验证所有内容都具有缩小问题范围所需的状态。为此创建一个完整的DOM太过分了。您将在内存中保存整个XML树,对于大型文档来说,这可能会相当繁重。我建议采取以下措施之一:
- 使用SAX或StAX进行解析,只需将内容复制到输出,除非您希望将其过滤掉
- 应用XSLT转换,默认情况下复制所有内容,但有一个或多个模板对其输入不做任何操作,从而将其过滤掉
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/><xsl:copy>
</xsl:template>
“过滤器”:
编辑:我刚刚注意到,您不仅过滤掉了特定的名称,还过滤掉了与正则表达式匹配的名称。XPath函数足以让谓词选择目标节点。但如果需要,可以通过扩展在XSLT中使用Java字符串函数。它确实使这个解决方案稍微复杂一些,但仍然值得,因为它使XML解析脱离了您的控制。好的,那么您需要将树保存回XML。您可以使用org.w3c.dom.ls包中的LSSerializer
<xsl:template match="//*[your predicate here]">
<!-- Don't do a thing -->
</xsl:template>