Navnerom håndtering i Groovys XmlSlurper

stemmer
38

Situasjonen:

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

Utgangen av denne tekstutdrag er

# sudo make me a sandwich!

Det virker som parser fusjonerer innholdet i <bar>og <weird:bar>.

Er dette problemet ønsket, og hvis ja, hvordan kan jeg unngå dette, og bare velge <bar>eller <weird:bar>?

Publisert på 29/12/2011 klokken 12:31
bruker
På andre språk...                            


2 svar

stemmer
17

Som standard XMLSlurper ikke namespace klar. Dette kan slås på ved å erklære navnerom med 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!"

Utgangen er:

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

Den første printlnvil likevel ikke være navne klar. Den andre printlnvil bare skrive koden uten navnerommet. Hvis du kvalifiserer element med prefikset vist i den tredje printlnfår du bare namespaced tag.

Svarte 29/12/2011 kl. 13:13
kilden bruker

stemmer
2

Jeg vet dette ble besvart en stund siden, men her er et alternativ for noen andre står overfor det samme problemet. Den XmlSlurperklassen har tre konstruktører, et par som lar deg spesifisere at du vil den skal være navnerom-aware.

public XmlSlurper(boolean validating, boolean namespaceAware)

Erklærer slurper ved å ringe new XmlSlurper(false, true). Jeg håper dette er nyttig for andre.

Svarte 24/10/2017 kl. 16:32
kilden bruker

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