java - 在保留其结构的同时过滤 XML

标签 java xml parsing

作为过滤过程的一部分,我想从 XML 文档中删除某些标记,但我不能以其他方式修改 XML 的外观或结构。

输入的 XML 以字符串形式出现,例如:

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <mytag myattr="123"/>
    <mytag myattr="456"/>
</main>

并且输出需要删除属性值为 456 的 mytag:

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <mytag myattr="123"/>
</main>

diff 应该仅将删除的标签显示为输入和输出之间的差异

我研究过 SAX、StAX 和 JAXB,但看起来不可能以与使用这些 API 输入时相同的格式输出 XML。相反,它们将形成具有适当缩进和空格的结构良好的 XML,这有时会显示出与输入的差异。

我当前的方法使用正则表达式,但不是很可靠,因为它没有考虑构建上述 XML 的所有可能方式。例如匹配属性值:

myAttr\s*=\s*"([^"]*)"

这适用于上面的示例,但不适用于此 XML 标记:

<mytag myattr=
    123></mytag>

在这种情况下正则表达式真的是最好的选择吗?

最佳答案

不要使用正则表达式来解析 XML!您已经知道尝试时会发生什么,并且 I have a spiel on why this is .

在您的情况下,您应该使用 XSLT .一个 XSLT 文件来做你想做的事非常简单易懂。基本上是这样的:

<xsl:template match="mytag[@myattr=123]">
</xsl:template>
<xsl:template match="*|@*">
  <xsl:copy>
    <xsl:apply-templates select="*|@*" />
  </xsl:copy>
</xsl:template>

它将复制任何元素,只要它不是具有属性 myattr=123mytag

我在你的示例文件上测试了它并得到了你说你想要的输出。

现在,至于如何将 XSLT 与 Java 一起使用,看起来像 an entire book has been written on the subject .您可能可以使用您最喜欢的任何 XML 库。我以前从未真正将 XSLT 与 Java 结合使用,所以我无法告诉您哪个库最容易使用。

关于java - 在保留其结构的同时过滤 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239326/

相关文章:

c# - Linq to Xml 到 Datagridview

java - ANTLR:循环与字符 '%' 处的任何内容都不匹配

c++ - 从字符串中解析复数,考虑语法变化

java - 如何关闭在我的java应用程序中运行的所有线程?

java - Java 中的希伯来语编码

java - 扩展泛型

parsing - protobuf 文本格式解析映射

java - 在 OOP 中,Private 成员对谁来说是私有(private)的?

Java Selenium : How to validate xpath?

javascript - 用于 Ajax PUT 或 POST 请求的 XML