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