Обработка пространства имен в 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 вы получаете только тег namespaced.


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

public XmlSlurper(boolean validating, boolean namespaceAware)

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