【发布时间】:2012-12-07 13:16:33
【问题描述】:
我希望有人能指出我在这里遗漏的一些明显的东西。我觉得我已经这样做了一百次了,今晚出于某种原因,由此产生的行为让我陷入了循环。
我正在从公共 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”。其他一切都是节点(正如预期的那样)。
我可以轻松解决这个问题。但是,这似乎不是正确的行为,我希望有人能指出我正确的方向。
【问题讨论】:
-
据我所知,Node.depthFirst 的行为与您在 groovy 1.7 中所期望的一样。在 groovy 2.0+ 中,我看到节点/字符串的结果相同。
标签: xml groovy xml-parsing xmlnode xmlslurper