2017-10-31 3 views
1

ich ein XML-Dokument, dasErhalten Sie alle Elemente zwischen zwei Elementen, einschließlich anderer Elemente, Werte und Attribute in Groovy

<home> 
    <address> 
     <address1 city="asd"> 
      <Language spoken="English"> 
       <SubLanguages>true</SubLanguages> 
      </Language> 
     </address1> 
     <address1 city="asd1"> 
      <Language spoken="Spanish"/> 
     </address1> 
     <address1 city="asd"> 
      <Language spoken="Hebrew"/> 
     </address1> 
    </address> 
</home> 

wie folgt aussieht Wie Sie sehen können, die address1 city = „asd“ Tag erscheint zweimal in das XML. Ich weiß, dass der ideale Weg, um ein einzelnes address1 Element mit den beiden Sprachelemente unter ihm haben, aber leider, das ist jetzt nicht möglich.

Was ich suche ist eine Möglichkeit, dass alle address1 Tags mit city = „asd“ und das Kind alle Elemente darunter in einen String kopieren Sie dann identifizieren. Also im Grunde, was ich suche ist ein String, der wie

<address1 city="asd"> 
    <Language spoken="English"> 
     <SubLanguages>true</SubLanguages> 
    </Language> 
    <Language spoken="Hebrew"/> 
</address1> 

(die ideale Art und Weise zu repräsentieren diese XML)

Gerade jetzt schauen, ich XMLSlurper bin mit durch die XML zu analysieren und mit findAll, um alle Knoten zu identifizieren, bei denen der Wert des city-Tags in Adresse1 "asd" ist. Wo ich feststecke ist, wie man den Rest der Unterelemente alle innerhalb jedes Tags als Strings

kopiert Dies ist meine erste Frage auf SO, so entschuldige ich mich im Voraus, wenn ich nicht klar genug bin/habe verpasst einige richtige Formatierungen/Stile! Vielen Dank für Ihr Verständnis!

Antwort

1

können Sie StreamingMarkupBuilder verwenden, um die Kinder in ein neues Dokument einzufügen (vorausgesetzt, Ihr xml bestehenden in einer Variablen ist xml genannt):

import groovy.xml.* 

def home = new XmlSlurper().parseText(xml) 

def newXml = new StreamingMarkupBuilder().bind { 
    address1(city: 'asd') { 
     home.address.address1 
      .findAll { [email protected]() == 'asd' } 
      .each { mkp.yield it.children() } 
    } 
}.toString() 
+0

Vielen Dank, genau das tut, was ich gesucht habe! –

Verwandte Themen