2009-08-06 61 views
2

我想从XML文档中删除某些标记作为过滤过程的一部分,但我无法修改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> 

一个diff应显示只有被删除的标签作为输入和输出之间的差异

我已经看过SAX,StAX和JAXB,但它看起来并不像输入任何这些API那样可以输出XML格式。它们将形成具有适当缩进和空白的结构良好的XML,有时会显示出与输入不同的结果。

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

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

这适用于上面的例子,但将无法正常工作给予这个XML标签:

<mytag myattr= 
    123></mytag> 

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

回答

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库是你最喜欢的。我从来没有真正使用Java的XSLT,所以我不能告诉你哪个库最容易使用。

+0

我会看看XSLT,但它会保留输入XML的结构。我给出的例子格式很好,但想象一下,示例XML全部在一行上。输出是否也在一条线上? – 2009-08-06 14:54:45

+0

@Alex Spurling:这个*应该*完全不相关,XML是关于数据的,而不是关于序列化格式。为什么对你很重要? – Tomalak 2009-08-06 15:10:49

+0

因为他使用的是不支持XML的diff工具。 – 2009-08-06 16:31:54

相关问题