Groovy Xml Parsing с пространствами имен

Я пытался внести некоторые изменения в XML с помощью Groovy XML Slurper.

В основном, я просматриваю 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>";

производит:

<Envelope/>

Вот отличный код, который я использую. Это действительно работает, когда я не использую пространство имен:

 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()
   }

person eric    schedule 03.09.2010    source источник


Ответы (1)


из отличной документации

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()
person Aaron Saunders    schedule 03.09.2010
comment
Спасибо, я видел это в документации, но проблема в том, что я просматриваю несколько строк XML, содержимое которых у меня нет. У них могут быть или не быть пространства имен и разные теги. То, что у меня есть, может найти элементы просто отлично, это не удается, когда я пытаюсь обновить его. - person eric; 03.09.2010
comment
я думаю, что первая проблема заключается в том, что ваш код получает только корневой узел, поэтому вы видите только ‹Envelope /› в качестве ответа - person Aaron Saunders; 03.09.2010