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

时间:2009-08-06 14:40:20

标签: java xml parsing

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

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

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

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

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

差异应仅显示已删除的代码作为输入和输出之间的差异

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

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

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

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

<mytag myattr=
    123></mytag>

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

1 个答案:

答案 0 :(得分:5)

不要使用正则表达式来解析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>

只要不是mytag属性myattr=123,它就会复制任何元素。

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

现在,关于如何在Java中使用XSLT,看起来像an entire book has been written on the subject。您可以使用您喜欢的任何XML库。我之前从未实际使用过XSLT,所以我无法告诉你哪个库最容易使用。