2017-10-31 5 views
1

の属性私はあなたが見ることができるように、アドレス1市=「ASD」タグが中に2回出現し、他の要素を含む2つの要素間のすべての要素を取得した値と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> 

このようなXML文書を持っていますXML。理想的なやり方は、両方のLanguage要素の下にある1つのaddress1要素を持つことですが、残念ながら現時点では不可能です。

私が探しているのは、すべてのaddress1タグをcity = "asd"で識別する方法です。次に、その下のすべての子要素を文字列にコピーします。 だから基本的に、私は何を探していますと、

今、私はXMLを解析するためにXMLSlurperを使用し、使用しています

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

(このXMLを表現する理想的な方法)のようになります。文字列でありますfindAllは、address1のcityタグの値が "asd"であるすべてのノードを識別する。私が立ち往生しているところでは、各タグの残りの部分を文字列としてすべてのタグの中にコピーする方法です

これは私の最初の質問ですので、十分にはっきりしない場合は事前にお詫びします。いくつかの適切な書式/スタイル! ご理解いただきありがとうございます。

答えて

1

あなたは(あなたの既存のXMLを仮定すると、xmlという変数にある)新しい文書に子供を挿入するためにStreamingMarkupBuilderを使用することができます。

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

おかげで多くのことを、私が探していたまさに行います! –

関連する問題