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

голоса
38

Ситуация:

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>?

Задан 29/12/2011 в 13:31
пользователем
На других языках...                            


2 ответов

голоса
17

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

Ответил 29/12/2011 в 14:13
источник пользователем

голоса
2

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

public XmlSlurper(boolean validating, boolean namespaceAware)

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

Ответил 24/10/2017 в 16:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more