Обработка пространства имен в Groovys XmlSlurper - PullRequest
10 голосов
/ 29 декабря 2011

Ситуация:

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 ]

17 голосов
/ 29 декабря 2011

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

4 голосов
/ 24 октября 2017

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

public XmlSlurper(boolean validating, boolean namespaceAware)

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

...