如何在使用XMLSlurper迭代文件时修改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

我目前正在遍历一个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)

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。是的,如果明天没有其他答案提交,我将接受这个答案。乔纳斯,谢谢你提供的细节,如果你认为我的答案适合你的需要,请看我的答案。