obsługa nazw w Groovys XmlSlurper

głosy
38

Sytuacja:

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

Wyjście z tego fragmentu jest

# sudo make me a sandwich!

Wydaje się, że parser scala zawartość <bar>i <weird:bar>.

Takie zachowanie jest pożądane, a jeśli tak, to w jaki sposób można tego uniknąć i wybrać tylko <bar>lub <weird:bar>?

Utwórz 29/12/2011 o 13:31
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
17

Domyślnie XMLSlurper nie jest świadoma przestrzeni nazw. To może być włączony deklarując nazw z declareNamespace Method .

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!"

Wyjście jest:

sudo make me a sandwich!
sudo
make me a sandwich!

Pierwszy printlnnadal nie jest świadoma przestrzeni nazw. Drugi printlnbędzie tylko wydrukować etykietę bez nazw. Jeśli kwalifikujesz elementu z przedrostkiem pokazanej w trzecim printlnmożna dostać tylko w przestrzeni nazw tag.

Odpowiedział 29/12/2011 o 14:13
źródło użytkownik

głosy
2

Znam ten odpowiedział jakiś czas temu, ale tutaj jest alternatywą dla nikogo innego stoi ten sam problem. XmlSlurperKlasa ma trzy konstruktory, para, która pozwoli Ci określić chcesz go mieć przestrzenie nazw.

public XmlSlurper(boolean validating, boolean namespaceAware)

Zadeklarować slurper dzwoniąc new XmlSlurper(false, true). Mam nadzieję, że jest to przydatne dla innych.

Odpowiedział 24/10/2017 o 16:32
źródło użytkownik

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