1

次の XML があるとします。

<list version="1.0">
    <meta>...</meta>
    <resources start="0" count="167">
        <resource classname="Quote">
            <field name="name">USD/KRW</field>
            <field name="price">1024.400024</field>
            <field name="symbol">KRW=X</field>
        </resource>
        ...
     </resources>
</list>

正しいものを見つけて<resource>取得するためにprice、次のことを行います。

def slurper = new XmlSlurper()
def result = slurper.parse(XML_URL)
def node = result.depthFirst().find { it.text() == "KRW=X" }
println node.parent().find { it['@name'] == "price" }.text()

ただし、結果は、ドキュメントと完全に一致しparent()ない実装されていません: http://groovy.codehaus.org/gapi/groovy/util/slurpersupport/GPathResult.htmlfind(Closure)

node.parent().size()上記の XML に従って 3 を返すと予想される場合、さらに奇妙な1 が返されます。

私の質問:

  1. 私のコードは正しいですか?なぜ機能しないのですか?

  2. これは、期待される結果を達成するための最短の方法ですか?

  3. なぜnode.parent().size()1 を返すのですか? node.parent().parent().size()などについて も同様node.parent().parent().parent().size()です...

4

3 に答える 3

1

試してみませんか

def resource = result.'**'.find { 
    it.field.@name == 'symbol' &&
    it.field.text() == 'KRW=X'
}

println resource?.'**'.find {
    it.@name == 'price'
}?.text()
于 2014-07-23T20:09:03.500 に答える
0

素早く汚いものですが、これはうまくいくはずです:

new XmlSlurper().parseText("""
<list version="1.0">
    <meta>...</meta>
    <resources start="0" count="167">
        <resource classname="Quote">
            <field name="name">USD/KRW</field>
            <field name="price">1024.400024</field>
            <field name="symbol">KRW=X</field>
        </resource>

        <resource classname="Quote">
            <field name="name">USD/KRW</field>
            <field name="price">2222</field>
            <field name="symbol">KRW=Y</field>
        </resource>

     </resources>
</list>
""").resources.resource.find{ 
    it.field.find {it.@name == "symbol" && it.text() == "KRW=X"}
}.field.find {it.@name == "price"}.text()
于 2014-07-23T20:10:26.760 に答える