2013-04-10 25 views
2

我想分析一個XML樹使用XmlSlurper和GPath,並且findAll方法的行爲混淆了我。嵌套的GPath表達式與XmlSlurper和findAll

說,例如,你有以下的XML樹:

<html> 
    <body> 
     <ul> 
      <li class="odd"><span>Element 1</span></li> 
      <li class="even"><span>Element 2</span></li> 
      <li class="odd"><span>Element 3</span></li> 
      <li class="even"><span>Element 4</span></li> 
      <li class="odd"><span>Element 5</span></li> 
     </ul> 
    </body> 
</html> 

假設xml已通過的XmlSlurperparse方法之一初始化,下面的代碼執行正如人們所預料:

// Prints: 
// odd 
// odd 
// odd 
xml.body.ul.li.findAll {[email protected] == 'odd'}[email protected] {println it.text()} 

在另一方面:

// Doesn't print anything. 
xml.body.ul.li.findAll {[email protected] == 'odd'}.span.each {println it.text()} 

我很努力去理解爲什麼我可以使用特殊的@屬性(以及其他的,如**),但不是'普通'屬性。

我已經看了API代碼,更讓我困惑的是getProperty實現(發現於GPathResult)似乎支持我正在嘗試做的事情。

我錯過了什麼?

回答

2

您需要遍歷每個span,這樣你就可以使用擴點經營者:

xml.body.ul.li.findAll {[email protected] == 'odd'}*.span.each {println it.text()} 
+0

+1的傳播點運算符,它解決特定的問題很好!它沒有解釋'@ class'屬性和'span'屬性之間的行爲差​​異,或者我錯過了什麼? – 2013-04-10 14:17:00

+0

@NicolasRinaudo不是100%肯定的,深入研究代碼並沒有大規模幫助。 '。@ class'遵循[不同的路徑](https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/slurpersupport/GPathResult。 java#L124)只是[訪問屬性](https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/slurpersupport/GPathResult。 java#L136)雖然...就好像FilteredNodeList丟失了一些東西......當我得到時間時,我會進一步調查...... – 2013-04-10 14:35:36

+0

感謝您沉入其中的時間。我自己也得出同樣的結論 - [this](https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/slurpersupport/GPathResult .java#L136)看起來像是支持'.span'調用,但似乎不起作用。如果這是一種我認爲更自信的語言,那麼我可能會提交一份錯誤報告,但Groovy傾向於不像我期望的那樣以完美的邏輯和正確的方式行事。 – 2013-04-10 14:48:23