0

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)
4

1 に答える 1