Странное поведение с tagoup и Groovy's XmlSlurper - PullRequest
3 голосов
/ 27 января 2011

Допустим, я хочу разобрать номер телефона из строки xml следующим образом:

str = """ <root> 
            <address>123 New York, NY 10019
                <div class="phone"> (212) 212-0001</div> 
            </address> 
        </root> 
    """
parser = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText (str)
println parser.address.div.text()

Номер телефона не печатается.

Если я изменю "div"element to" foo "вот так

str = """ <root> 
            <address>123 New York, NY 10019
                <foo class="phone"> (212) 212-0001</foo> 
            </address> 
        </root> 
    """
parser = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText (str)
println parser.address.foo.text()

Затем он может проанализировать и напечатать номер телефона.

Что, черт возьми, происходит?

Кстати, я использую Groovy 1.7.5 и tagoup 1.2

Ответы [ 3 ]

1 голос
/ 01 февраля 2011

Просто измените код на

println parser.address.'div'.text()

Это проклятие Groovy и многих других динамических языков - «div» является зарезервированным именем метода, поэтому вы не получаете узел, а вместо этого пытаетесь разделить «адресный» узел:)

0 голосов
/ 22 июля 2016

Я знаю, что этот вопрос очень старый. Но я недавно столкнулся и вот что я использовал:

parser.'**'.findAll { it.name() == 'div' && it.@class.text() == 'phone' }.each { div ->
    println div.text()
}
  1. С помощью глубины поиска найдите все теги
  2. Фильтр по имени div с классом телефон ;
  3. Распечатать значение (212) 212-0001

Groovy версия 2.4

0 голосов
/ 01 августа 2011

Кажется, я вспоминаю, что tagoup нормализует HTML-теги - то есть прописные буквы. Таким образом, выражение GPath, которое вы хотите, вероятно,

println parser.ADDRESS.DIV.text()

Мне удобно распечатывать результаты анализа - тогда вы можете понять, почему ваш GPath не работает. Используйте это ..

println groovy.xml.XmlUtil.serialize(parser)
...