Обработка пространства имен в Groovys XmlSlurper

Ситуация:

def str = """
  <foo xmlns:weird="http://localhost/">
    <bar>sudo </bar>
    <weird:bar>make me a sandwich!</weird:bar>
  </foo>
"""
def xml = new XmlSlurper().parseText(str)
println xml.bar

Вывод этого фрагмента

# sudo make me a sandwich!

Кажется, что парсер сливает содержимое <bar> а также <weird:bar>,

Желательно ли такое поведение, и если да, как я могу избежать этого и выбрать только <bar> или же <weird:bar>?

2 ответа

Решение

По умолчанию XMLSlurper не поддерживает пространство имен. Это можно включить, объявив пространства имен с declareNamespace Метод

def str = """ 
<foo xmlns:weird="http://localhost/">
  <bar>sudo </bar>
  <weird:bar>make me a sandwich!</weird:bar>
</foo>
""" 
def xml = new XmlSlurper().parseText(str).declareNamespace('weird':'http://localhost/')
println xml.bar // without namespace awareness, will print "sudo make me a sandwich!"
println xml.':bar' // will only print "sudo"
println xml.'weird:bar' // will only print "make me a sandwich!"

Выход:

sudo make me a sandwich!
sudo
make me a sandwich!

Первый println все еще не будет осведомлен о пространстве имен. Второй println будет печатать только тег без пространства имен. Если вы квалифицируете элемент с префиксом, показанным в третьем println Вы получаете только тег пространства имен.

Я знаю, что на это ответили некоторое время назад, но здесь есть альтернатива для тех, кто сталкивается с той же проблемой. XmlSlurper Класс имеет три конструктора, пара из которых позволяет вам указать, что вы хотите, чтобы он учитывал пространство имен.

public XmlSlurper(boolean validating, boolean namespaceAware)

Объявите бродягу по телефону new XmlSlurper(false, true), Я надеюсь, что это полезно для других.

Другие вопросы по тегам