【问题标题】:Groovy "find" closure...Traversing through recursive xmlGroovy“查找”闭包...遍历递归 xml
【发布时间】:2013-04-02 21:44:39
【问题描述】:

如果我有这样的 GPath:

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

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

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 闭包来实现这一点?

提前谢谢

【问题讨论】:

  • 似乎是 stackoverflow.com/questions/6185746/groovy-map-find-recursive 的骗子,答案相当不错。
  • 嗨,比尔,我是一个时髦的新手......并且不太明白那个线程中的答案。我们可以不使用地图做同样的事情吗?
  • 你应该可以,结构应该是相同的,但我还没有确定。试一试——复制代码,首先让它工作,然后将类型更改为你想要的,看看你是否能让它工作。即使它没有直接帮助,它也应该教给你足够的知识,让你自己解决问题。

标签: xml parsing loops groovy gpath


【解决方案1】:

您可以使用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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2016-03-12
    • 2014-03-24
    • 1970-01-01
    • 2018-07-12
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多