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
已通過的XmlSlurper
的parse
方法之一初始化,下面的代碼執行正如人們所預料:
// 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
)似乎支持我正在嘗試做的事情。
我錯過了什麼?
+1的傳播點運算符,它解決特定的問題很好!它沒有解釋'@ class'屬性和'span'屬性之間的行爲差異,或者我錯過了什麼? – 2013-04-10 14:17:00
@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
感謝您沉入其中的時間。我自己也得出同樣的結論 - [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