如何在使用XMLSlurper迭代文件时修改XML节点值
我目前正在遍历一个XML文件,如下所示:如何在使用XMLSlurper迭代文件时修改XML节点值,xml,groovy,Xml,Groovy,我目前正在遍历一个XML文件,如下所示: def root = new XmlSlurper().parseText(xml) root.service.each { service -> service.receiver.endpoint.each { endpoint -> println "\t\tEndpoint: ${endpoint.text()}" } } def root = new XmlSlurper().parseText(xml) r
def root = new XmlSlurper().parseText(xml)
root.service.each { service ->
service.receiver.endpoint.each { endpoint ->
println "\t\tEndpoint: ${endpoint.text()}"
}
}
def root = new XmlSlurper().parseText(xml)
root.service.each { service ->
service.receiver.endpoint.each { endpoint ->
println "\t\tEndpoint: ${endpoint.text()}"
// ****WRITE TO NODE****
}
}
我想先读取endpoint.text(),然后修改节点的值,使文件包含一个新值。
我正在很好地读取节点属性,事实就是这样。但是我以后怎么给它写信呢
我看了这个,了解了如何写入现有文件。但我想问的是,当我已经在迭代文件以读取其中的一些内容时,是否可以用更优雅的方式来完成?我希望有一个更有效的方式,适合我通过文件的方式
所以我希望有一种方法可以做到这一点:
def root = new XmlSlurper().parseText(xml)
root.service.each { service ->
service.receiver.endpoint.each { endpoint ->
println "\t\tEndpoint: ${endpoint.text()}"
}
}
def root = new XmlSlurper().parseText(xml)
root.service.each { service ->
service.receiver.endpoint.each { endpoint ->
println "\t\tEndpoint: ${endpoint.text()}"
// ****WRITE TO NODE****
}
}
希望它有意义
此外,以下是一些XML示例:
<project name='Common'>
<service name='name' pattern='something' isReliable='maybe'>
<receiver name='name' isUsingTwoWaySsl='maybe' isWsRmDisabled='maybe'
targetedByTransformation='maybe'>
<endpoint name='local_tst01'>URL</endpoint>
<endpoint name='local_tst02'>URL</endpoint>
<endpoint name='local_tst03'>URL</endpoint>
<environment name='dev' default='local_dev' />
<environment name='tst01' default='test' />
<environment name='tst02' default='local_tst02' />
</receiver>
<operation name='name'>
<sender>sender</sender>
<attribute name='operation' type='String'>name</attribute>
</operation>
</service>
</project>
统一资源定位地址
统一资源定位地址
统一资源定位地址
发件人
名称
不知道为什么方法受到保护,但它可以工作:
def root = new XmlSlurper().parseText(
'''<root>
<service>
<receiver>
<endpoint>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 )
def root=new XmlSlurper().parseText(
'''
123
456
''')
root.service.each{service->
service.receiver.endpoint.each{endpoint->
endpoint.replaceBody(“**”+endpoint.text())
}
}
println groovy.xml.XmlUtil.serialize(根)
以下是更新端点的小变体
这是灵活的,因此您可以根据以下endpointBinding
映射中定义的name属性
选择需要新url的端点。当然,您可以根据需要更改这些值
//Set your endpoint name attribute value and new endpoint url in a map
//This would be flexible to have the respective url
def endpointBinding = ['local_tst01': 'http://example01.com', 'local_tst02': 'http://example02.com', 'local_tst03': 'http://example03.com']
pXml = new XmlSlurper().parseText(xml)
//Update the values in xml as per the binding defined above
endpointBinding.collect { k, v -> pXml.'**'.find{it.name() == 'endpoint' && it.@name == k }.replaceBody(v) }
println groovy.xml.XmlUtil.serialize( pXml )
您可以快速在线尝试相同的方法对不起,问题不清楚-
我想先读取endpoint.text(),然后再写入节点
-什么意思?。您在哪里面临问题?我在向节点写信时面临问题?我不知道有什么误解。我很乐意对其进行编辑以使其更清楚。您的意思是说,对于上述xml中的3次出现,url值都需要更改?您是否有要更新的新值列表?下面的答案有用吗。是的,没错,2。那有关系吗?只需在其中插入“test”,3。是的,如果明天没有其他答案提交,我将接受这个答案。乔纳斯,谢谢你提供的细节,如果你认为我的答案适合你的需要,请看我的答案。