Μεταμόρφωση
Τώρα ας επιχειρήσουμε τον μετασχηματισμό. Εκτελέστε την ακόλουθη εντολή:
java XSLTDemo books.xml books.xsl
Δυστυχώς, αυτός ο μετασχηματισμός αποτυγχάνει: θα πρέπει να παρατηρήσετε έξοδο που προσδιορίζει το Apache Xalan ως εργοστάσιο μετασχηματιστή και ένα μήνυμα σφάλματος που δηλώνει ότι xsl: για κάθε ομάδα
δεν υποστηρίζεται.
Ας δοκιμάσουμε ξανά. Υποθέτοντας ότι saxon9he.jar
και XSLTDemo.class
βρίσκονται στον τρέχοντα κατάλογο, εκτελέστε την ακόλουθη εντολή:
java -cp saxon9he.jar ;. XSLTDemo books.xml books.xsl
Αυτή τη φορά, θα πρέπει να παρατηρήσετε την ακόλουθη ταξινομημένη και σωστά ομαδοποιημένη έξοδο:
Προσθήκη στο Κεφάλαιο 11: Επεξεργασία του JSON με τον Τζάκσον
Μετατροπή XML σε JSON με τον Τζάκσον
Java XML και JSON, Κεφάλαιο 11, εισάγει το Jackson, το οποίο παρέχει API για την ανάλυση και τη δημιουργία αντικειμένων JSON. Είναι επίσης δυνατό να χρησιμοποιήσετε το Jackson για να μετατρέψετε έγγραφα XML σε έγγραφα JSON.
Σε αυτήν την ενότητα, θα σας δείξω δύο τρόπους για να μετατρέψετε το XML σε JSON, πρώτα με δέσμευση δεδομένων και μετά με διέλευση δέντρων. Θα υποθέσω ότι έχετε διαβάσει το Κεφάλαιο 11 και είστε εξοικειωμένοι με τον Τζάκσον. Για να ακολουθήσετε αυτές τις επιδείξεις, θα πρέπει να έχετε κατεβάσει τα ακόλουθα αρχεία JAR από το αποθετήριο Maven:
jackson-annotations-2.9.7.jar
jackson-core-2.9.7.jar
jackson-databind-2.9.7.jar
Θα χρειαστείτε επίσης μερικά επιπλέον αρχεία JAR. τα περισσότερα είναι κοινά και στις δύο τεχνικές μετατροπής. Θα παράσχω πληροφορίες σχετικά με τη λήψη αυτών των αρχείων JAR σύντομα.
Μετατροπή XML σε JSON με σύνδεση δεδομένων
Δεσμευτικά δεδομένα σας επιτρέπει να αντιστοιχίσετε σειριακά δεδομένα σε ένα αντικείμενο Java. Για παράδειγμα, ας υποθέσουμε ότι έχετε ένα μικρό έγγραφο XML που περιγράφει έναν μόνο πλανήτη. Η λίστα 4 παρουσιάζει αυτό το έγγραφο.
Λίστα 4. planet.xml
Γη 3 9
Η λίστα 5 παρουσιάζει μια ισοδύναμη Java Πλανήτης
τάξη στην οποία αντιστοιχούν τα αντικείμενα planet.xml
το περιεχόμενο.
Λίστα 5. Planet.java
Δημόσια τάξη Planet {public String name; δημόσιος Integer planet_from_sun; δημόσια Integer φεγγάρια? }
Η διαδικασία μετατροπής απαιτεί να αναλύσετε πρώτα το XML σε ένα Πλανήτης
αντικείμενο. Μπορείτε να ολοκληρώσετε αυτήν την εργασία συνεργαζόμενοι με το com.fasterxml.jackson.dataformat.xml.XmlMapper
τάξη, ως εξής:
XmlMapper xmlMapper = νέο XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = νέο FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planet planet = xmlMapper.readValue (xmlsr, Planet.class);
XmlMapper
είναι μια προσαρμοσμένη com.fasterxml.jackson.databind.ObjectMapper
που διαβάζει και γράφει XML. Παρέχει πολλά readValue ()
μέθοδοι για την ανάγνωση μιας μεμονωμένης τιμής XML από μια πηγή εισόδου ειδικά για XML · για παράδειγμα:
T readValue (XMLStreamReader r, Τύπος τιμής κλάσης)
Καθε readValue ()
μέθοδος απαιτεί ένα javax.xml.stream.XMLStreamReader
αντικείμενο ως το πρώτο επιχείρημά του. Αυτό το αντικείμενο είναι ουσιαστικά ένα πρόγραμμα ανάλυσης ροής βασισμένο σε StAX για αποτελεσματική ανάλυση κειμένου με προώθηση.
Το δεύτερο επιχείρημα είναι ένα java.lang.Class
αντικείμενο για τον τύπο προορισμού που δημιουργείται, συμπληρώνεται με δεδομένα XML και του οποίου η παρουσία επιστρέφεται στη συνέχεια από τη μέθοδο.
Η ουσία αυτού του τμήματος κώδικα είναι ότι το περιεχόμενο της Καταχώρισης 4 διαβάζεται σε ένα Πλανήτης
αντικείμενο αυτό readValue ()
επιστρέφει στον καλούντα.
Μόλις δημιουργηθεί το αντικείμενο, είναι εύκολο να το γράψετε ως JSON δουλεύοντας με ObjectMapper
και είναι String writeValueAsString (τιμή αντικειμένου)
μέθοδος:
ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (πλανήτης);
Απόσπασα αυτά τα τμήματα κώδικα από ένα XML2JSON
εφαρμογή της οποίας ο πλήρης πηγαίος κώδικας εμφανίζεται στη Λίστα 6.
Λίστα 6. XML2JSON.java (Έκδοση 1)
εισαγωγή java.io.FileReader; εισαγωγή javax.xml.stream.XMLInputFactory; εισαγωγή javax.xml.stream.XMLStreamReader; εισαγωγή com.fasterxml.jackson.databind.ObjectMapper; εισαγωγή com.fasterxml.jackson.dataformat.xml.XmlMapper; εισαγωγή στατικού java.lang.System. *; δημόσια τάξη XML2JSON {public static void main (String [] args) ρίχνει την Εξαίρεση {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = νέο FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planet planet = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (πλανήτης); out.println (json); }}
Για να μπορέσετε να μεταγλωττίσετε τις λίστες 5 και 6, θα πρέπει να κατεβάσετε το Jackson Dataformat XML, το οποίο υλοποιεί XMLMapper
. Έκανα λήψη της έκδοσης 2.9.7, η οποία ταιριάζει με τις εκδόσεις των άλλων τριών πακέτων Jackson.
Υποθέτοντας ότι έχετε κατεβάσει με επιτυχία jackson-dataformat-xml-2.9.7.jar
, εκτελέστε την ακόλουθη εντολή (απλωμένη σε δύο γραμμές για αναγνωσιμότητα) για να μεταγλωττίσετε τον πηγαίο κώδικα:
javac -cp jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar ;. XML2JSON.java
Για να μπορέσετε να εκτελέσετε την εφαρμογή που προκύπτει, θα πρέπει να κάνετε λήψη του Jackson Module: JAXB Annotations και επίσης να κάνετε λήψη του StAX 2 API. Κατέβασα JAXB Annotations έκδοση 2.9.7 και StAX 2 API έκδοση 3.1.3.
Υποθέτοντας ότι έχετε κατεβάσει με επιτυχία jackson-module-jaxb-annotations-2.9.7.jar
και stax2-api-3.1.3.jar
, εκτελέστε την ακόλουθη εντολή (απλωμένη σε τρεις γραμμές για αναγνωσιμότητα) για να εκτελέσετε την εφαρμογή:
java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar; jackson-module-jaxb-annotations-2.9.7.jar; stax2-api-3.1.3.jar ;. XML2JSON
Εάν όλα πάνε καλά, θα πρέπει να παρατηρήσετε την ακόλουθη έξοδο:
{"name": "Earth", "planet_from_sun": 3, "moon": 9}
Μετατροπή XML σε JSON με διέλευση δέντρων
Ένας άλλος τρόπος για να μετατρέψετε από XML σε JSON είναι πρώτα να αναλύσετε το XML σε ένα δέντρο των κόμβων JSON και στη συνέχεια να γράψετε αυτό το δέντρο σε ένα έγγραφο JSON. Μπορείτε να ολοκληρώσετε την πρώτη εργασία καλώντας ένα από ένα XMLMapper
κληρονομείται readTree ()
μέθοδοι:
XmlMapper xmlMapper = νέο XmlMapper (); JsonNode node = xmlMapper.readTree (xml.getBytes ());
ObjectMapper
'μικρό JsonNode readTree (περιεχόμενο byte [])
Η μέθοδος απολυμαίνει το περιεχόμενο JSON σε ένα δέντρο jackson.databind.JsonNode
αντικείμενα και επιστρέφει τη ρίζα JsonNode
αντικείμενο αυτού του δέντρου. Σε ένα XmlMapper
πλαίσιο, αυτή η μέθοδος απολυμαίνει το περιεχόμενο XML στο δέντρο. Και στις δύο περιπτώσεις, το περιεχόμενο JSON ή XML μεταβιβάζεται σε αυτήν τη μέθοδο ως πίνακας byte.
Η δεύτερη εργασία - μετατροπή του δέντρου των αντικειμένων σε JSON - πραγματοποιείται με παρόμοιο τρόπο με αυτό που έδειξα προηγουμένως. Αυτή τη φορά, είναι το JsonNode
αντικείμενο ρίζας στο οποίο μεταβιβάστηκε writeValueAsString ()
:
ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (κόμβος);
Απόσπασα αυτά τα τμήματα κώδικα από ένα XML2JSON
εφαρμογή της οποίας ο πλήρης πηγαίος κώδικας εμφανίζεται στη Λίστα 7.
Λίστα 7. XML2JSON.java (έκδοση 2)
εισαγωγή com.fasterxml.jackson.databind.JsonNode; εισαγωγή com.fasterxml.jackson.databind.ObjectMapper; εισαγωγή com.fasterxml.jackson.dataformat.xml.XmlMapper; εισαγωγή στατικού java.lang.System. *; δημόσια τάξη XML2JSON {public static void main (String [] args) ρίχνει την Εξαίρεση {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ ν "; XmlMapper xmlMapper = νέο XmlMapper (); JsonNode node = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (κόμβος); out.println (json); }}
Εκτελέστε την ακόλουθη εντολή (απλωμένη σε δύο γραμμές για αναγνωσιμότητα) για να μεταγλωττίσετε την Καταχώριση 7:
javac -cp jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar XML2JSON.java
Για να μπορέσετε να εκτελέσετε την εφαρμογή που προκύπτει, θα πρέπει να κάνετε λήψη του Woodstox, ο οποίος είναι ένας επεξεργαστής XML υψηλής απόδοσης που εφαρμόζει StAX, SAX2 και StAX2. Έκανα λήψη του Woodstox 5.2.0. Στη συνέχεια, εκτελέστε την ακόλουθη εντολή (απλωμένη σε τρεις γραμμές για αναγνωσιμότητα) για να εκτελέσετε την εφαρμογή:
java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar; stax2-api-3.1.3.jar; woodstox-core-5.2.0.jar ;. XML2JSON
Εάν όλα πάνε καλά, θα πρέπει να παρατηρήσετε την ακόλουθη έξοδο:
{"name": "Earth", "planet_from_sun": "3", "moon": "1"}
Παρατηρήστε ότι οι αριθμοί που έχουν εκχωρηθεί στο planet_from_sun
και φεγγάρια
Τα στοιχεία XML σειριοποιούνται σε συμβολοσειρές JSON αντί για αριθμούς. ο readTree ()
Η μέθοδος δεν συμπεραίνει τον τύπο δεδομένων ελλείψει ρητού ορισμού τύπου.
Η υποστήριξη του Τζάκσον για τη διέλευση δέντρων XML έχει επιπλέον περιορισμούς:
- Ο Τζάκσον δεν μπορεί να κάνει διάκριση μεταξύ αντικειμένων και συστοιχιών. Επειδή η XML δεν παρέχει κανένα μέσο για τη διαφοροποίηση ενός αντικειμένου από μια λίστα (πίνακας) αντικειμένων, ο Τζάκσον συγκεντρώνει επαναλαμβανόμενα στοιχεία σε μία μόνο τιμή.
- Ο Τζάκσον δεν υποστηρίζει μικτό περιεχόμενο (περιεχόμενο κειμένου και στοιχεία ως παιδιά ενός στοιχείου). Αντ 'αυτού, χαρτογραφεί κάθε στοιχείο XML σε ένα
JsonNode
αντικείμενο. Κάθε κείμενο χάνεται.
Δεδομένων αυτών των περιορισμών, δεν προκαλεί έκπληξη το γεγονός ότι η επίσημη τεκμηρίωση του Τζάκσον συνιστά να μην αναλυθεί το XML JsonNode
- δέντρα με βάση Καλύτερα να χρησιμοποιήσετε την τεχνική μετατροπής δέσμευσης δεδομένων.
συμπέρασμα
Το υλικό που παρουσιάζεται σε αυτό το άρθρο πρέπει να θεωρηθεί ως προσθήκη στα κεφάλαια 6 και 11 στη δεύτερη έκδοση του Java XML και JSON. Αντιθέτως, το επόμενο άρθρο μου θα σχετίζεται με το βιβλίο, αλλά εντελώς νέο υλικό. Παρακολουθήστε το επερχόμενο άρθρο μου σχετικά με τη σύνδεση αντικειμένων Java σε έγγραφα JSON με το JSON-B
Αυτή η ιστορία, "Java XML και JSON: Επεξεργασία εγγράφων για Java SE, Μέρος 1: SAXON και Jackson" δημοσιεύθηκε αρχικά από την JavaWorld.