我想从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>
在这种情况下,正则表达式真的是最佳选择吗?
答案 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,所以我无法告诉你哪个库最容易使用。