我希望有人会指出我在这里遗漏的一些明显的东西。我觉得我已经这样做了一百次了,今晚出于某种原因,由此产生的行为让我陷入了困境。
我正在从公共 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>
所以最终我想遍历所需节点内的树(再次,'body')并提取其自然顺序中包含的所有文本。很简单,所以我只写了这个 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 对象的组合。具体来说,不在同一行的实体内的行将作为字符串返回,即“This contains”和“and”。其他一切都是节点(如预期的那样)。
我可以轻松解决这个问题。但是,这似乎不是正确的行为,我希望有人能指出我正确的方向。