У меня вопрос к следующему вопросу: Groovy XmlSlurper get value of the node without children.Groovy XmlParser/XmlSlurper: node.localText() позиция?
Это объясняет, что для получения локального внутреннего текста (HTML) узла без рекурсивного получения вложенного текста потенциальных внутренних дочерних узлов необходимо использовать #localText()
вместо #text()
.
Например, слегка повышена пример из оригинального вопроса:
<html>
<body>
<div>
Text I would like to get1.
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</div>
<span>
<a href="http://intro.com">extra stuff</a>
Text I would like to get2.
<a href="http://example.com">link to example</a>
Text I would like to get3.
</span>
</body>
</html>
с раствором прикладной:
def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()
def slurper = new XmlSlurper(tagsoupParser)
def htmlParsed = slurper.parseText(stringToParse)
println htmlParsed.body.div[0].localText()[0]
вернется:
[Text I would like to get1., Text I would like to get2., Text I would like to get3.]
Однако при разборе <span>
часть в этом примере
println htmlParsed.body.span[0].localText()
выход
[Text I would like to get2., Text I would like to get3.]
Проблема я столкнулся в настоящее время является то, что это, видимо, не представляется возможным точно определить местоположение («между которыми ребенок узлов») текстов. Я бы ожидал, что второй вызов, чтобы получить
[, Text I would like to get2., Text I would like to get3.]
Это было бы ясно дал понять: Положение 0 (перед ребенком 0) пусто, положение 1 (между ребенком 0 и 1) «Текст Я хотел бы get2 . », а позиция 2 (между дочерними 1 и 2) -« Текст, который я хотел бы получить3 ». Но с учетом API работает так же, как и у него, по-видимому, нет способа определить, действительно ли текст, возвращаемый при индексе 0, позиционируется в индексе 0 или в любом другом индексе, и то же самое верно для всех остальных индексов.
Я пробовал его как с XmlSlurper
, так и с XmlParser
, давая те же результаты.
Если я не ошибаюсь здесь, то также невозможно полностью воссоздать оригинальный HTML-документ, используя информацию из анализатора, потому что эта информация «текстового индекса» теряется.
Мой вопрос: есть ли способ узнать эти текстовые позиции? Ответ, требующий меня изменить парсер, также будет приемлемым.
UPDATE/РЕШЕНИЕ:
Для дальнейшей ссылки, здесь ответ будет P, обращался к исходному коду:
def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()
def slurper = new XmlParser(tagsoupParser)
def htmlParsed = slurper.parseText(stringToParse)
println htmlParsed.body.div[0].children().collect {it in String ? it : null}
Это дает:
[Text I would like to get1., null, Text I would like to get2., null, Text I would like to get3.]
One должен использовать XmlParser
вместо XmlSlurper
с node.children()
.
Вот именно! По-видимому, он работает только с XmlParser, а не с XmlSlurper. Спасибо. Я обновляю свой вопрос с помощью решения. Я только хочу, чтобы Groovy более четко документировал различия между этими двумя классами ... – SputNick