2010-09-03 4 views
2

J'ai essayé de faire des modifications xml avec XML Slurper de groovy.Analyse Xml Groovy avec des espaces de noms

Fondamentalement, je traverse le xml et cherche des balises ou des attributs qui ont? comme la valeur, puis en le remplaçant par une certaine valeur.

Je l'ai eu travailler pour xml qui n'a pas d'espaces de noms, mais une fois que je les inclus les choses deviennent bancales. Par exemple, ceci:

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>"; 

produit:

<Envelope/>

Voici le code Groovy j'utilise. Cela ne semble travailler quand je ne suis pas en utilisant un espace de noms:

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

Répondre

2

de groovy documentation

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() 
+0

Merci, je l'ai vu dans la documentation, mais le problème avec c'est que je suis en cours d'exécution à travers plusieurs Les chaînes XML dont je n'ai pas le contenu. Ils peuvent ou non avoir des espaces de noms, et ils ont des tags différents. Ce que je peux trouver des éléments très bien, il échoue lorsque je tente de le mettre à jour. – eric

+0

Je pense que le premier problème est que votre code n'obtient que le nœud racine, c'est pourquoi vous ne voyez que en réponse –

Questions connexes