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

Ale*_*ing 2 java xml parsing

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

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

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <mytag myattr="123"/>
    <mytag myattr="456"/>
</main>
Run Code Online (Sandbox Code Playgroud)

并且输出需要删除mytag属性值的位置,例如456:

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <mytag myattr="123"/>
</main>
Run Code Online (Sandbox Code Playgroud)

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

我已经研究过SAX,StAX和JAXB,但它看起来不像使用任何这些API输入的格式输出XML.它们将形成结构良好的XML,具有适当的缩进和空格,有时似乎显示与输入的差异.

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

myAttr\s*=\s*"([^"]*)"
Run Code Online (Sandbox Code Playgroud)

这适用于上面的示例,但在给定此XML标记时无效:

<mytag myattr=
    123></mytag>
Run Code Online (Sandbox Code Playgroud)

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

Wel*_*bog 5

不要使用正则表达式来解析XML!你已经知道当你尝试时会发生什么,而且我对此有所了解.

在您的情况下,您应该使用XSLT.用于执行所需操作的XSLT文件非常简单易懂.它基本上如下:

<xsl:template match="mytag[@myattr=123]">
</xsl:template>
<xsl:template match="*|@*">
  <xsl:copy>
    <xsl:apply-templates select="*|@*" />
  </xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

只要它不mytag属于属性,它将复制任何元素myattr=123.

我在你的示例文件上测试了它并获得了你想要的输出.

现在,关于如何在Java中使用XSLT,看起来整本书都写在这个主题上.您可以使用您喜欢的任何XML库.我之前从未实际使用过XSLT,所以我无法告诉你哪个库最容易使用.