Névtér kezelhetőség Groovys XmlSlurper

szavazat
38

A helyzet:

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

A kimenő e kódrészlet

# sudo make me a sandwich!

Úgy tűnik, az értelmező egyesíti a tartalmát <bar>és <weird:bar>.

Ez a viselkedés kívánt, és ha igen, hogyan lehet ezt elkerülni, és csak azokat <bar>vagy <weird:bar>?

A kérdést 29/12/2011 13:31
felhasználó
Más nyelveken...                            


2 válasz

szavazat
17

Alapértelmezésben XMLSlurper nem névtér tisztában. Ez lehet bekapcsolva nyilvánította névterek a declareNamespace módszer .

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

A kimenet:

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

Az első printlnsem lesz névtér tisztában. A második printlncsak nyomtatni a címke nélküli névtérben. Ha jogosult elem előtaggal jelenik meg a harmadik printlncsak akkor kap a névtér tag.

Válaszolt 29/12/2011 14:13
a forrás felhasználó

szavazat
2

Tudom, hogy ez volt a válasz egy ideje, de itt van egy alternatív másnak szembe ugyanezzel a kérdéssel. Az XmlSlurperosztályban három konstruktőri, egy pár, amely lehetővé teszi, hogy meghatározza azt szeretné, hogy legyen névtér-tudatos.

public XmlSlurper(boolean validating, boolean namespaceAware)

Állapítsa meg, slurper meghívásával new XmlSlurper(false, true). Remélem, ez hasznos másoknak.

Válaszolt 24/10/2017 16:32
a forrás felhasználó

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