作为过滤过程的一部分,我想从 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=123
的 mytag
。
我在你的示例文件上测试了它并得到了你说你想要的输出。
现在,至于如何将 XSLT 与 Java 一起使用,看起来像 an entire book has been written on the subject .您可能可以使用您最喜欢的任何 XML 库。我以前从未真正将 XSLT 与 Java 结合使用,所以我无法告诉您哪个库最容易使用。
关于java - 在保留其结构的同时过滤 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239326/