使用名称空间进行Groovy Xml解析

使用名称空间进行Groovy Xml解析,groovy,xmlslurper,Groovy,Xmlslurper,我一直在尝试使用groovy的xml Slurper对xml进行一些修改 基本上,我正在浏览xml并查找具有以下特性的标记或属性:?作为值,然后将其替换为某个值 我已经让它适用于没有名称空间的xml,但一旦我包含它们,事情就会变得不稳定。例如,这: String foo = "<xs:test xmlns:xs="http://schemas.xmlsoap.org/soap/envelope/" xmlns:foo="http://myschema/xmlschema"

我一直在尝试使用groovy的xml Slurper对xml进行一些修改

基本上,我正在浏览xml并查找具有以下特性的标记或属性:?作为值,然后将其替换为某个值

我已经让它适用于没有名称空间的xml,但一旦我包含它们,事情就会变得不稳定。例如,这:

   String foo = "<xs:test xmlns:xs="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:foo="http://myschema/xmlschema" name='?'>
        <foo:tag1>?</foo:tag1>
        <foo:tag2>?</foo:tag2>
    </xs:test>";
来自groovy

def wsdl=''
'''
def xml=new XmlSlurper().parseText(wsdl).declareNamespace(ns1:'http://www.example.org/NS1“,ns2:”http://www.example.org/NS2')
println xml.'ns1:message'.'ns1:part'.size()
println xml.'ns2:message'.'ns2:part'.size()

谢谢,我在文档中看到了这一点,但问题是我正在运行多个XML字符串,而我不知道这些字符串的内容。它们可能有名称空间,也可能没有名称空间,它们有不同的标记。我所拥有的可以很好地找到元素,当我尝试更新它时,它失败了。我认为第一个问题是您的代码只获取根节点,这就是为什么您只将其视为响应
 public def populateRequest(xmlString, params) {

     def slurper = new XmlSlurper().parseText(xmlString)
     //replace all tags with ?
     def tagsToReplace = slurper.depthFirst().findAll{ foundTag ->
        foundTag.text() == "?"
     }.each { foundTag ->
        foundTag.text = {webServiceOperation.parameters[foundTag.name()]}
       foundTag.replaceNode{
            "${foundTag.name()}"(webServiceOperation.parameters[foundTag.name()])
        }
      }
      //replace all attributes with ?
      def attributesToReplace = slurper.list().each{
          it.attributes().each{ attributes ->
          if(attributes.value == '?')
          {
            attributes.value = webServiceOperation.parameters[attributes.key]
          }
        }
      }

      new StreamingMarkupBuilder().bind { mkp.yield slurper }.toString()
   }
def wsdl = '''
<definitions name="AgencyManagementService"
    xmlns:ns1="http://www.example.org/NS1"
    xmlns:ns2="http://www.example.org/NS2">
    <ns1:message name="SomeRequest">
        <ns1:part name="parameters" element="SomeReq" />
    </ns1:message>
    <ns2:message name="SomeRequest">
        <ns2:part name="parameters" element="SomeReq" />
    </ns2:message>
</definitions>
'''

def xml = new XmlSlurper().parseText(wsdl).declareNamespace(ns1: 'http://www.example.org/NS1', ns2: 'http://www.example.org/NS2')
println xml.'ns1:message'.'ns1:part'.size()
println xml.'ns2:message'.'ns2:part'.size()