在使用XMLSlurper迭代文件时,如何修改XML节点属性?

时间:2017-05-31 12:43:43

标签: xml groovy

this问题的扩展中,我现在正在尝试替换XML节点的属性。

我已经使用下面的代码写了XML的主体。

def root = new XmlSlurper().parseText(
'''<root>
     <service>
       <receiver>
         <endpoint type="type1">123</endpoint>
         <endpoint>456</endpoint>
       </receiver>
     </service>
 </root>''')

root.service.each { service ->
service.receiver.endpoint.each { endpoint ->
    endpoint.replaceBody("**"+endpoint.text())
    }
}

println groovy.xml.XmlUtil.serialize( root )

我想检查type属性是否存在。如果是的话我想改变它的值来说&#34; type2&#34;。

是否存在替换属性的replaceBody()的等效方法?

或者我必须以不同的方式实现这一点吗?

2 个答案:

答案 0 :(得分:2)

以下是更新所需属性的一行代码:

Snap.load

以下是基于参考先前问题数据的附加信息。 让我们假设有更多的端点,例如local_tst01,local_tst02,并且您希望具有不同的类型值(为了灵活性,不希望每个端点具有相同的类型值)。在这种情况下,您可以使用以下脚本。

在这里,您还可以使用端点名称和所需类型值的映射,如下所示:

root.'**'.findAll{it.name() == 'endpoint' && it.attributes().get('type') }*.@type= 'type_value'

但是,让我们假设端点没有类型,并且根据OP,typeBinding = ['local_tst01': 'type01', 'local_tst02': 'type02', 'local_tst03': 'type03'] 的输出中不应该有类型,例如:

endpoint whose name is local_tst03

这是完整的脚本:

<endpoint name='local_tst01' type='123'>URL1</endpoint>
<endpoint name='local_tst02' type='xyz'>URL2</endpoint>
<endpoint name='local_tst03'>URL3</endpoint>

您可以在线快速尝试 Demo

答案 1 :(得分:1)

def root = new XmlSlurper().parseText(
'''<root>
     <service>
       <receiver>
         <endpoint type="type1">123</endpoint>
         <endpoint>456</endpoint>
       </receiver>
     </service>
 </root>''')

root.service.each { service ->
    service.receiver.endpoint.each { endpoint ->
        endpoint.replaceBody("**"+endpoint.text())
        if(endpoint.@type=='type1')endpoint.@type='type-01'
        else endpoint.@type='type-99'
    }
}

println groovy.xml.XmlUtil.serialize( root )

或者您可以使用endpoint.attributes()

将所有属性作为地图获取