XML ツリーを解析しようとしています。したい:
- 各項目へのパスの表現を出力します。パスを作成するよりスマートな方法はありますか?
- primaryType="content" を持つノードの名前と値を出力します (content-nodes)
- よりスマートで優れたアプローチを見つけました。フィルター?よりスマートな閉鎖?
- 別の方法で先読みできますか
- この例は、私が持っているより複雑な実際のケースの単純な例です。primaryType="text" でプロパティ要素を検索する
以下のコードを実行すると、次のようになります。
root/
--folder1/
----folder2/
metadataitem: <- "Wrong" = not what I want
found value: findme
でも私はしたい:
root/
--folder1/
----folder2/
------item: <- Without "metadata"
found value: findme
- 「メタデータ」->「」で文字列置換を行うのは簡単ですが、それは良い解決策ではありません。
- 時間があれば、よりスマートなソリューションもお願いします。
前もって感謝します!
例:
def example = '''
<node name="root">
<property name="primaryType">
<value>folder</value>
</property>
<node name="metadata">
<property name="primaryType">
<value>metadata</value>
</property>
<property name="other">
<value>...</value>
</property>
</node>
<node name="folder1">
<property name="primaryType">
<value>folder</value>
</property>
<node name="metadata">
<property name="primaryType">
<value>metadata</value>
</property>
<property name="other">
<value>...</value>
</property>
</node>
<node name="folder2">
<property name="primaryType">
<value>folder</value>
</property>
<property name="other">
<value>...</value>
</property>
<node name="metadata">
<property name="primaryType">
<value>metadata</value>
</property>
<property name="other">
<value>...</value>
</property>
</node>
<node name="item">
<property name="primaryType">
<value>content</value>
</property>
<property name="text">
<value>findme</value>
</property>
<property name="other">
<value>...</value>
</property>
</node>
</node>
</node>
</node>
'''
def xml = new XmlSlurper().parseText(example);
def listContent(node,pad) {
node.node.property.find { it.@name == "primaryType" && it.text() == "content" }.each {
it.parent().property.each { property ->
if(property.@name == "text") {
println "" + property.parent().@name + ":"// Want: "item". Gets: "metadataitem" due to parent()
println "found value: " + property.text()
}
}
}
}
def listFolders(node,pad) {
node.property.find { it.text() == "folder" }.each { property ->
println "-".multiply(pad) + property.parent().@name + "/"
listContent(property.parent(),pad)
}
node.children().each { child ->
listFolders(child, pad+2)
}
}
listFolders(xml,0)