我希望有人會指出我在這裏失蹤的事情。我覺得我已經完成了這一百次,而今晚由於某種原因,這種行爲正在讓我陷入一個循環。Groovy Node.depthFirst()返回一個節點和字符串列表?
我正在閱讀一些公共API的XML。我想從某個節點(「body」中的所有內容)中提取所有文本,其中還包括各種子節點。簡單的例子:
<xml>
<metadata>
<article>
<body>
<sec>
<title>A Title</title>
<p>
This contains
<italic>italics</italic>
and
<xref ref-type="bibr">xref's</xref>
.
</p>
</sec>
<sec>
<title>Second Title</title>
</sec>
</body>
</article>
</metadata>
</xml>
所以,最後我想遍歷樹所需的節點(再次,「體」)內提取包含在它的自然秩序中的所有文本。夠簡單了,所以我就寫了這個小Groovy腳本......
def xmlParser = new XmlParser()
def xml = xmlParser.parseText(rawXml)
xml.metadata.article.body[0].depthFirst().each { node ->
if(node.children().size() == 1) {
println node.text()
}
}
...它繼續進行炸燬「法無簽名:java.lang.String.children()」。所以我在想我自己:「等等,什麼?我瘋了嗎?」 Node.depthFirst()應該只返回一個節點列表。我添加了一個'instanceof'檢查,果然,我得到了一個Node對象和String對象的組合。具體而言,不在同一行的實體內的行將以String的形式返回,即「This contains」和「and」。其他一切都是節點(如預期)。
我可以輕鬆解決這個問題。但是,這看起來不是正確的行爲,我希望有人能指出我的方向。
據正如我所知道的那樣,Node.depthFirst的表現正如您在Groovy 1.7中期望的那樣。在groovy 2.0+中,我看到了Nodes/Strings的相同結果。 – Joseph