Groovy“找到”闭包......遍历递归xml

时间:2013-04-02 21:44:39

标签: xml parsing loops groovy gpath

如果我有这样的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闭包来实现这一目标?

提前谢谢

1 个答案:

答案 0 :(得分: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"