我想知道如何获得只有具有指定属性的子节点的xml节点:
例如,如果我有一个节点,如:
<mode name="name" >
<data dataname="STO">data</data>
<file dataname="FO">file</file>
<file dataname="STO">file</file>
<file dataname="STO">file</file>
<data dataname="FO">data</data>
<data dataname="STO">data</data>
<data dataname="FO">data</data>
</mode>
我希望只使用dataname attribut等于&#34; STO&#34;:
的孩子获得相同的结构<mode name="name" >
<data dataname="STO">data</data>
<file dataname="STO">file</file>
<file dataname="STO">file</file>
<data dataname="STO">data</data>
</mode>
我尝试了这段代码,但我没有达到预期效果:
def xmlTest = new XmlParser().parse(xmlFile)
def nodetest= xmlTest.mode.find {it.'@name' == 'name'}
nodetest.children().findAll { it.'@dataname'== "STO"}
结果是:
<data dataname="STO">data</data>
<file dataname="STO">file</file>
<file dataname="STO">file</file>
<data dataname="STO">data</data>
答案 0 :(得分:1)
你走了:
def txt = """<mode name="name" >
<data dataname="STO">data</data>
<file dataname="FO">file</file>
<file dataname="STO">file</file>
<file dataname="STO">file</file>
<data dataname="FO">data</data>
<data dataname="STO">data</data>
<data dataname="FO">data</data>
</mode>"""
def xml = new XmlSlurper().parseText(txt)
xml.depthFirst().findAll{ it.@dataname == 'STO' }
使用XmlParser
它也可以。
<强>更新强>
以下代码返回带有过滤内容的xml:
import groovy.xml.XmlUtil
def txt = """<mode name="name" >
<data dataname="STO">data</data>
<file dataname="FO">file</file>
<file dataname="STO">file</file>
<file dataname="STO">file</file>
<data dataname="FO">data</data>
<data dataname="STO">data</data>
<data dataname="FO">data</data>
</mode>"""
def xml = new XmlParser().parseText(txt)
xml.depthFirst().findAll{ it.@dataname == 'STO' }.each {
xml.remove(it)
}
XmlUtil.serialize(xml)