Обработка пространства имен в 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)
, Я надеюсь, что это полезно для других.