Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaSE删除XML节点_Java_Xml_Xerces_Domparser - Fatal编程技术网

使用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 =

如何在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 = 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转换,默认情况下复制所有内容,但有一个或多个模板对其输入不做任何操作,从而将其过滤掉
选项2是最简单的,根据我的经验,Java中的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>