Muutos
Yritetään nyt muuttaa. Suorita seuraava komento:
java XSLTDemo books.xml books.xsl
Valitettavasti tämä muunnos epäonnistuu: sinun tulisi tarkkailla lähtöä, joka tunnistaa Apache Xalanin muuntajatehtaaksi, ja virheilmoituksen xsl: jokaiselle ryhmälle
ei ole tuettu.
Yritetään uudestaan. Olettaen että saxon9he.jar
ja XSLTDemo.class
sijaitsevat nykyisessä hakemistossa, suorita seuraava komento:
java -cp saxon9he.jar ;. XSLTDemo books.xml books.xsl
Tällä kertaa sinun on noudatettava seuraavaa lajiteltuja ja oikein ryhmiteltyjä lähtöjä:
Lisäys kappaleeseen 11: JSON: n käsittely Jacksonin kanssa
XML: n muuntaminen JSON: ksi Jacksonin avulla
Java XML ja JSON, luku 11, esittelee Jacksonin, joka tarjoaa API: t JSON-objektien jäsentämiseen ja luomiseen. Jacksonilla on myös mahdollista muuntaa XML-asiakirjat JSON-asiakirjoiksi.
Tässä osiossa näytän sinulle kaksi tapaa muuntaa XML JSON: ksi ensin tietojen sitomisella ja sitten puiden läpikäynnillä. Oletan, että olet lukenut luvun 11 ja tunnet Jacksonin. Näiden demojen seuraamiseksi sinun on ladattava seuraavat JAR-tiedostot Maven-arkistosta:
jackson-annotations-2.9.7.jar
jackson-core-2.9.7.jar
jackson-databind-2.9.7.jar
Tarvitset myös muutaman ylimääräisen JAR-tiedoston; useimmat ovat yhteisiä molemmille muuntotekniikoille. Annan tietoja näiden JAR-tiedostojen hankkimisesta pian.
Muunna XML JSON: ksi tietojen sitomisella
Tietojen sitominen voit yhdistää sarjoitetut tiedot Java-objektiin. Oletetaan, että sinulla on esimerkiksi pieni XML-asiakirja, joka kuvaa yhtä planeettaa. Listaus 4 esittää tämän asiakirjan.
Listaus 4. planet.xml
Maa 3 9
Luettelossa 5 on vastaava Java Planeetta
luokka, jonka objektit kartoittavat planet.xml
sisällön.
Listaus 5. Planet.java
julkinen luokka Planeetta {julkinen merkkijono nimi; public Integer planet_from_sun; julkiset kokonaislukut; }
Muunnosprosessi edellyttää, että ensin jäsennät XML: n a: ksi Planeetta
esine. Voit suorittaa tämän tehtävän työskentelemällä com.fasterxml.jackson.dataformat.xml.XmlMapper
luokka seuraavasti:
XmlMapper xmlMapper = uusi XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = uusi FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planeetan planeetta = xmlMapper.readValue (xmlsr, Planet.class);
XmlMapper
on räätälöity com.fasterxml.jackson.databind.ObjectMapper
joka lukee ja kirjoittaa XML: ää. Se tarjoaa useita readValue ()
menetelmät yksittäisen XML-arvon lukemiseksi XML-spesifisestä tulolähteestä; esimerkiksi:
T readValue (XMLStreamReader r, luokan arvoTyyppi)
Jokainen readValue ()
menetelmä edellyttää a javax.xml.stream.XMLStreamReader
esine ensimmäisenä argumenttinaan. Tämä objekti on pohjimmiltaan StAX-pohjainen stream-pohjainen jäsennin tekstin tehokkaaseen jäsentämiseen eteenpäin.
Toinen argumentti on a java.lang.luokka
kohde kohdetyypille, joka on instantioitu, täytetty XML-tiedoilla ja jonka ilmentymä palautetaan myöhemmin menetelmästä.
Tämän koodinpätkän viimeinen rivi on, että Listing 4: n sisältö luetaan a Planeetta
vastustaa sitä readValue ()
palaa soittajalle.
Kun objekti on luotu, on helppo kirjoittaa se JSON-muotoon työskentelemällä ObjectMapper
ja se on Merkkijono writeValueAsString (objektiarvo)
menetelmä:
ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (planeetta);
Otin nämä koodinpätkät XML2JSON
sovellus, jonka täydellinen lähdekoodi näkyy luettelossa 6.
Listing 6. XML2JSON.java (Versio 1)
tuo java.io.FileReader; tuo javax.xml.stream.XMLInputFactory; tuo javax.xml.stream.XMLStreamReader; tuo com.fasterxml.jackson.databind.ObjectMapper; tuo com.fasterxml.jackson.dataformat.xml.XmlMapper; tuo staattinen java.lang.System. *; public class XML2JSON {public static void main (String [] args) heittää poikkeuksen {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = uusi FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planeetan planeetta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (planeetta); out.println (json); }}
Ennen kuin voit koota luettelot 5 ja 6, sinun on ladattava Jackson Dataformat XML, joka toteutetaan XMLMapper
. Latasin version 2.9.7, joka vastaa kolmen muun Jackson-paketin versiota.
Olettaen, että lataus onnistui jackson-dataformat-xml-2.9.7.jar
, suorita seuraava komento (jaettu kahteen riviin luettavuuden vuoksi) lähdekoodin kääntämiseksi:
javac -cp jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar ;. XML2JSON.java
Ennen kuin voit suorittaa tuloksena olevan sovelluksen, sinun on ladattava Jackson Module: JAXB Annotations ja ladattava myös StAX 2 -sovellusliittymä. Latasin JAXB-merkinnät version 2.9.7 ja StAX 2 API-version 3.1.3.
Olettaen, että lataus onnistui jackson-module-jaxb-annotations-2.9.7.jar
ja stax2-api-3.1.3.jar
, suorita seuraava komento (jaettu kolmeen riviin luettavuuden vuoksi) sovelluksen ajamiseksi:
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
Jos kaikki menee hyvin, sinun on noudatettava seuraavaa tulosta:
{"name": "Earth", "planet_from_sun": 3, "moons": 9}
Muunna XML JSON: ksi puun läpi kulkemalla
Toinen tapa muuntaa XML: stä JSON: ksi on ensin jäsentää XML JSON-solmujen puuksi ja sitten kirjoittaa tämä puu JSON-asiakirjaan. Voit suorittaa ensimmäisen tehtävän soittamalla johonkin XMLMapper
on peritty readTree ()
menetelmät:
XmlMapper xmlMapper = uusi XmlMapper (); JsonNode-solmu = xmlMapper.readTree (xml.getBytes ());
ObjectMapper
on JsonNode readTree (tavu [] -sisältö)
menetelmä deserialisoi JSON-sisällön jackson.databind.JsonNode
ja palauttaa juuren JsonNode
tämän puun esine. Vuonna XmlMapper
kontekstissa tämä menetelmä deserialisoi XML-sisällön puuhun. Kummassakin tapauksessa JSON- tai XML-sisältö välitetään tähän menetelmään tavuina.
Toinen tehtävä - objektipuun muuntaminen JSON: ksi - suoritetaan samalla tavalla kuin aiemmin. Tällä kertaa se on JsonNode
pääobjekti, joka välitetään writeValueAsString ()
:
ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (solmu);
Otin nämä koodinpätkät XML2JSON
sovellus, jonka täydellinen lähdekoodi näkyy luettelossa 7.
Listaus 7. XML2JSON.java (versio 2)
tuo com.fasterxml.jackson.databind.JsonNode; tuo com.fasterxml.jackson.databind.ObjectMapper; tuo com.fasterxml.jackson.dataformat.xml.XmlMapper; tuo staattinen java.lang.System. *; public class XML2JSON {public static void main (String [] args) heittää poikkeuksen {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = uusi XmlMapper (); JsonNode-solmu = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (solmu); out.println (json); }}
Suorita seuraava komento (hajautettu kahdelle riville luettavuuden vuoksi) luettelon 7 kokoamiseksi:
javac -cp jackson-core-2.9.7.jar; jackson-databaseind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar XML2JSON.java
Ennen kuin voit suorittaa tuloksena olevan sovelluksen, sinun on ladattava Woodstox, joka on erittäin suorituskykyinen XML-prosessori, joka toteuttaa StAX: n, SAX2: n ja StAX2: n. Latasin Woodstox 5.2.0: n. Suorita sitten seuraava komento (jaettu kolmeen riviin luettavuuden vuoksi) sovelluksen ajamiseksi:
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
Jos kaikki menee hyvin, sinun on noudatettava seuraavaa tulosta:
{"name": "Earth", "planet_from_sun": "3", "moons": "1"}
Huomaa, että planet_from_sun
ja kuut
XML-elementit sarjoitetaan JSON-merkkijonoihin numeroiden sijaan. readTree ()
method ei johda tietotyyppiä, jos nimenomaista tyypin määritelmää ei ole.
Jacksonin tuella XML-puun läpikululle on muita rajoituksia:
- Jackson ei pysty erottamaan esineitä ja taulukoita. Koska XML ei tarjoa keinoja erottaa objekti objektiluettelosta (taulukosta), Jackson kerää toistuvat elementit yhdeksi arvoksi.
- Jackson ei tue sekoitettu sisältö (tekstisisältö ja elementit elementin lapsina). Sen sijaan se kartoittaa jokaisen XML-elementin a-kohtaan
JsonNode
esine. Kaikki teksti menetetään.
Näiden rajoitusten vuoksi ei ole yllättävää, että virallisissa Jackson-ohjeissa suositellaan XML: n jäsentämistä JsonNode
-pohjaiset puut. Sinun on parempi käyttää datan sitomisen muuntotekniikkaa.
Johtopäätös
Tässä artikkelissa esitettyä materiaalia on pidettävä vuoden 2005 toisen painoksen 6 ja 11 luvun lisäyksenä Java XML ja JSON. Sen sijaan seuraava artikkeli liittyy kirjaan, mutta täysin uuteen materiaaliin. Pidä silmällä tulevaa artikkeliani Java-objektien sitomisesta JSON-asiakirjoihin JSON-B: llä.
Tämän tarinan "Java XML ja JSON: Asiakirjojen käsittely Java SE: lle, osa 1: SAXON ja Jackson" julkaisi alun perin JavaWorld.