χειρισμό namespace στο 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 δεν namespace γνωρίζουν. Αυτό μπορεί να ενεργοποιηθεί με τη δήλωση ονομάτων με τη 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μπορείτε να πάρετε μόνο το namespaced ετικέτα.

Απαντήθηκε 29/12/2011 στις 14:13
πηγή χρήστη

ψήφοι
2

Ξέρω ότι αυτό απαντήθηκε πριν από λίγο καιρό, αλλά εδώ είναι μια εναλλακτική λύση για κανέναν άλλο που αντιμετωπίζουν το ίδιο πρόβλημα. Η XmlSlurperτάξη έχει τρεις κατασκευαστές, μερικά από τα οποία σας επιτρέπουν να καθορίσετε εσείς θέλετε να είναι namespace-aware.

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