java - 使用 Java SE 删除 XML 节点

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

最佳答案

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

关于java - 使用 Java SE 删除 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190028/

相关文章:

java - 在扩展类构造函数中错误使用 'super'

java - 构建java项目时出错

Java 流 : Grouping a list by a value that is not in the list returns a map containing non-exiting value as a key and an original list as a value?

java - Deorg.apache.xerces.parsers.XIncludeAwareParserConfiguration无法转换为org.apache.xerces.xni.parser.XMLParserConfiguration

java - Selenium 新的等待条件不起作用被迫使用 Thread.Sleep

php - 如何将分隔字符串拆分为 XML 节点树

java - jaxb 枚举到字符串自定义映射

xml - 如何从 ec2 实例中的用户数据编辑 xml 行?

java - 获取 xml 模式中定义的元素属性的数量

javax.xml.transform.TransformerException : java. io.FileNotFoundException:<file_name>(访问被拒绝)