2013-04-02 54 views
0

如果我有我的GPATH这样的:Groovy的“查找”关闭......通过递归遍历XML

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

为了得到一个芒果其中有5一个ID,我会做,

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'可以在任何级别的递归),我需要找到与'5'的ID芒果。我怎样才能实现这个封闭?

先感谢

+0

似乎是http://stackoverflow.com/questions/6185746/愚弄的人groovy-map-find-recursive这有一个合理的好答案。 –

+0

嗨比尔,我是一个时髦的新手......并不完全理解该主题中的答案。我们可以在不使用地图的情况下做同样的事吗? – user1717230

+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 [email protected] == "correct"