0

如果我有这样的 GPath:

<Apple>
    <Mango>
        <id>5 </id>
    </Mango>
    <Mango>
        <id>10 </id>
    </Mango>
</Apple>

要获得一个 ID 为 5 的芒果,我会这样做,

GPathResult result = Apple.find{
it.Mango.id=5
}

但是如果我的 GPath 是递归的。我的意思是,一个苹果可以有一个芒果。芒果里面又可以放一个苹果。例如:

<Apple>
    <Mango>
        <id>10</id>
        <Apple>
            <Mango>
                <id>5 </id>
            </Mango>
         </Apple>
    </Mango>
</Apple>

如何获得 id 为“5”的芒果。无论递归,GPath 可能是(ID 为“5”的芒果可以处于任何递归级别),我需要找到 ID 为“5”的芒果。我怎样才能通过 find 闭包来实现这一点?

提前谢谢

4

1 回答 1

2

根据最匹配您的结构的内容,您可以使用breadthFirstdepthFirst :

def xml = '''<Apple>
    <Mango>
        <id>10</id>
        <Apple>
            <Mango found="correct">
                <id>5</id>
            </Mango>
         </Apple>
    </Mango>
</Apple>'''

nodes = new XmlParser().parseText xml

mango = nodes.breadthFirst().find { it.id.text() == "5" }

assert mango.@found == "correct"
于 2013-04-03T16:10:40.097 回答