2013-04-02 49 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"