groovy / xml - 获取节点中的特定属性

时间:2014-04-15 07:03:26

标签: xml groovy

我想知道如何获得只有具有指定属性的子节点的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>

1 个答案:

答案 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)