Mam nadzieję, że ktoś po prostu wskaże coś oczywistego, czego mi tu brakuje. Czuję, że zrobiłem to setki razy i z jakiegoś powodu dzisiejszego wieczoru zachowanie z tego powodu rzuca mnie na pętlę.Groovy Node.depthFirst() zwraca listę węzłów i ciągów znaków?
Czytam w jakimś XML z publicznego API. Chcę wyodrębnić cały tekst z określonego węzła (wszystko w obrębie "treści"), który obejmuje również wiele węzłów potomnych. Prosty przykład:
<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>
Więc ostatecznie chcę przechodzić przez drzewo w pożądanym węzła (znowu, „ciała”) i wyodrębnić cały tekst zawarty w swojej naturalnej kolejności. dość proste, więc po prostu napisać ten mały Groovy skrypt ...
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()
}
}
... po czym udają się wysadzić z „No podpisania metoda: java.lang.String.children()”. Więc myślę sobie "poczekaj, co? Czy zwariowałem?" Node.depthFirst() powinien zwrócić tylko listę węzłów. Dodaję małą próbkę "instanceof" i na pewno otrzymuję kombinację obiektów Node i obiektów String. W szczególności linie spoza jednostek znajdujących się w tej samej linii są zwracane jako ciągi, zwane także "To zawiera" i "i". Cała reszta to węzeł (zgodnie z oczekiwaniami).
Potrafię to obejść łatwo. To jednak nie wydaje się być właściwym zachowaniem i mam nadzieję, że ktoś może wskazać mi właściwy kierunek.
Jak daleko jak mogę powiedzieć, Node.depthFirst zachowywał się tak, jak można by oczekiwać w groovy 1.7. W wersji 2.0+ widzę takie same wyniki węzłów/ciągów. – Joseph