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