ここで私が見逃している明らかなことを誰かが指摘してくれることを願っています。私はこれを何百回もやったような気がしますが、何らかの理由で今夜、これから起こる行動が私をループに投げ込んでいます.
パブリック API から XML を読み込んでいます。さまざまな子ノードも含む特定のノード (「本文」内のすべて) からすべてのテキストを抽出したいと考えています。簡単な例:
<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 オブジェクトの組み合わせが得られます。具体的には、同じ行のエンティティ内にない行は、文字列として返されます。別名、"This contains" および "and" です。それ以外はすべてノードです (予想どおり)。
これは簡単に回避できます。ただし、これは正しい動作のようには見えません。誰かが私を正しい方向に向けてくれることを願っています。