gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:46 25 4
gpt4 key购买 nike

作为过滤过程的一部分,我想从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com