在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()
的等效方法?
或者我必须以不同的方式实现这一点吗?
答案 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()