2016-08-30 15 views
0

私は次の問題について助けに感謝します。 (私はGroovyを初めて使用しているので、私の問題に取り組んでいる特定の例は見つかりません)。Groovy XmlSlurperはノードを与えられた子ノードの値で置き換えます

XmlSlurperを使用して、特定の値を持つ子を持つXMLノードを置き換えようとしています。例えば、私が変換したい:へ

<assets> 
    <!--zero to many asset nodes beforehand--> 
    <asset> 
     <name>MyPackageName</name> 
     <data> 
      <stringValue>my string value</stringValue> 
     </data> 
    </asset> 
    <!--zero to many asset nodes afterwards--> 
</assets> 

<assets> 
    <!--zero to many asset nodes beforehand--> 
    <asset> 
     <name>MyPackageName</name> 
     <data/> 
    </asset> 
    <!--zero to many asset nodes afterwards--> 
</assets> 

私は名前mypackagenameのと私の資産を見つけるためにナビゲートし、コードのいずれかの例を見つけることができません。

私の失敗の試みは、次のとおりです。

def assets = new XmlSlurper().parseText(deviceXml) 
    assets.asset[name.text()=="MyPackageName"].replaceNode{ 
     asset{ 
      name("MyPackageName") 
      data() 
     } 
    } 

私は「資産」のために不足しているプロパティのgroovy.lang.MissingPropertyException例外はそれほど明確に私のノードを見つけるために、私の構文が間違って取得します。

答えて

2

次の例では、仕事をしていません:それを更新する

import groovy.xml.XmlUtil 
import groovy.xml.StreamingMarkupBuilder 

def input = '''<assets> 
    <!--zero to many asset nodes beforehand--> 
    <asset> 
     <name>MyPackageName</name> 
     <data> 
      <stringValue>my string value</stringValue> 
     </data> 
    </asset> 
    <!--zero to many asset nodes afterwards--> 
</assets>''' 

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

xml.asset.data.replaceNode {} 

println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
    mkp.yield xml 
}) 

第二の方法:

import groovy.xml.XmlUtil 
import groovy.xml.StreamingMarkupBuilder 

def input = '''<assets> 
    <!--zero to many asset nodes beforehand--> 
    <asset> 
     <name>MyPackageName</name> 
     <data> 
      <stringValue>my string value</stringValue> 
     </data> 
    </asset> 
    <!--zero to many asset nodes afterwards--> 
</assets>''' 

def assets = new XmlSlurper().parseText(input) 
assets.asset.replaceNode { 
    asset { 
     name("MyPackageName") 
     data() 
    } 
} 

println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
    mkp.yield assets 
}) 

特定のノードを探し付:

import groovy.xml.XmlUtil 
import groovy.xml.StreamingMarkupBuilder 

def input = '''<assets> 
    <!--zero to many asset nodes beforehand--> 
    <asset> 
     <name>MyPackageName</name> 
     <data> 
      <stringValue>my string value</stringValue> 
     </data> 
    </asset> 
    <!--zero to many asset nodes afterwards--> 
</assets>''' 

def assets = new XmlSlurper().parseText(input) 
assets.asset.find {it.name.text() == 'MyPackageName' }. replaceNode { 
    asset { 
     name("MyPackageName") 
     data() 
    } 
} 

println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
    mkp.yield assets 
}) 
+0

申し訳ありませんが、多分私は持っています質問を正しく説明していない。私は、異なる名前のアセットノードをたくさん持っています。特定の名前を値MyPackageNameで検索し、データ値を空のノードに置き換え、残りのXMLをそのままにしておく必要があります。 – Gordon

+0

@Gordon、私は答えを更新しました。 3番目のオプションは、あなたが探しているもののようです。 – Opal

+0

それは素晴らしいです、ありがとう。 – Gordon

関連する問題