2015-09-12 6 views
1

У меня вопрос к следующему вопросу: 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().

ответ

1

Я не знаю jsoup, и я надеюсь, что он не вмешивается в решениях, но с чистым XmlParser вы можете получить массив children() который содержит необработанную строку:

html = '''<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 root = new XmlParser().parseText html 

root.body.div[0].children().with { 
    assert get(0).trim() == 'Text I would like to get1.' 
    assert get(0).getClass() == String 

    assert get(1).name() == 'a' 
    assert get(1).getClass() == Node 

    assert get(2) == ''' 
      Text I would like to get2. 
      ''' 
} 
+0

Вот именно! По-видимому, он работает только с XmlParser, а не с XmlSlurper. Спасибо. Я обновляю свой вопрос с помощью решения. Я только хочу, чтобы Groovy более четко документировал различия между этими двумя классами ... – SputNick