2011-01-27 2 views
3

Скажем, я хочу, чтобы разобрать номер телефона из XML-строки, как это:Странное поведение с TagSoup и XmlSlurper Groovy,

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() 

Это не печатает номер телефона.

Если изменить элемент «Див», чтобы «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() 

Тогда его умелым разобрать и напечатать номер телефона.

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

Btw Я использую заводную 1.7.5 и TagSoup 1,2

ответ

1

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

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

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

+0

ваше объяснение кажется правдоподобным, но ваш код предложение не работает для меня в заводной консоли. –

+0

Да, извините, не проверяя его с точной конфигурацией. Похоже, он отлично работает при использовании стандартного парсера JDK, поэтому проблема может быть в парсере TagSoup. –

0

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

println parser.ADDRESS.DIV.text() 

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

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

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

parser.'**'.findAll { it.name() == 'div' && [email protected]() == 'phone' }.each { div -> 
    println div.text() 
} 
  1. Использование depthFirst найти все теги
  2. Фильтр по имени сНу, который имеет класс телефон;
  3. печати значение (212) 212-0001

Groovy версия 2,4