Transformácia
Teraz sa pokúsime o transformáciu. Vykonajte nasledujúci príkaz:
java XSLTDemo books.xml books.xsl
Táto transformácia bohužiaľ zlyhala: mali by ste pozorovať výstup, ktorý identifikuje Apache Xalan ako továreň na transformátory, a chybové hlásenie, že xsl: pre každú skupinu
nie je podporované.
Skúsme to opäť. Za predpokladu, že saxon9he.jar
a XSLTDemo.class
sa nachádzajú v aktuálnom adresári, vykonajte nasledujúci príkaz:
java -cp saxon9he.jar ;. XSLTDemo books.xml books.xsl
Tentokrát by ste mali sledovať nasledujúci zoradený a správne zoskupený výstup:
Dodatok k kapitole 11: Spracovanie JSON s Jacksonom
Prevod XML na JSON s Jacksonom
Java XML a JSON, kapitola 11, predstavuje Jackson, ktorý poskytuje API na analýzu a vytváranie objektov JSON. Je tiež možné použiť Jackson na konverziu dokumentov XML na dokumenty JSON.
V tejto časti si ukážeme dva spôsoby prevodu XML na JSON, najskôr pomocou dátovej väzby a potom cez stromový priechod. Budem predpokladať, že ste si prečítali 11. kapitolu a poznáte Jacksona. Ak chcete postupovať podľa týchto ukážok, mali ste si stiahnuť nasledujúce súbory JAR z úložiska Maven:
jackson-annotations-2.9.7.jar
jackson-core-2.9.7.jar
jackson-databind-2.9.7.jar
Budete tiež potrebovať niekoľko ďalších súborov JAR; väčšina je spoločná pre obidve techniky konverzie. Čoskoro poskytnem informácie o získaní týchto súborov JAR.
Preveďte XML na JSON pomocou dátovej väzby
Väzba údajov umožňuje mapovať serializované údaje na objekt Java. Predpokladajme napríklad, že máte malý dokument XML, ktorý popisuje jednu planétu. Zoznam 4 predstavuje tento dokument.
Zoznam 4. planet.xml
Zem 3 9
Zoznam 5 predstavuje ekvivalentnú Javu Planéta
trieda, ktorej objekty sa mapujú na planet.xml
obsah.
Výpis 5. Planet.java
public class Planet {public Názov reťazca; public Integer planet_from_sun; verejné celé mesiace; }
Proces konverzie vyžaduje, aby ste najskôr analyzovali XML na a Planéta
objekt. Túto úlohu môžete dosiahnuť spoluprácou s com.fasterxml.jackson.dataformat.xml.XmlMapper
triedy nasledovne:
XmlMapper xmlMapper = nový XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = nový FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planéta planéta = xmlMapper.readValue (xmlsr, Planet.class);
XmlMapper
je prispôsobený com.fasterxml.jackson.databind.ObjectMapper
ktorý číta a píše XML. Poskytuje niekoľko readValue ()
metódy na čítanie jednej hodnoty XML zo vstupného zdroja špecifického pre XML; napríklad:
T readValue (XMLStreamReader r, trieda valueType)
Každý readValue ()
metóda vyžaduje a javax.xml.stream.XMLStreamReader
objekt ako prvý argument. Tento objekt je v podstate syntaktický analyzátor založený na toku StAX na efektívnu analýzu textu dopredu.
Druhým argumentom je a java.lang.Class
objekt pre cieľový typ, ktorý sa vytvára inštanciou, je vyplnený údajmi XML a ktorého inštancia je následne vrátená z metódy.
Záverom tohto fragmentu kódu je, že obsah záznamu 4 sa načíta do a Planéta
namietajte proti tomu readValue ()
vráti volajúcemu.
Po vytvorení objektu je ľahké ho pomocou spolupráce zapísať ako JSON ObjectMapper
a jeho String writeValueAsString (hodnota objektu)
metóda:
ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (planéta);
Vyňal som tieto fragmenty kódu z XML2JSON
aplikácia, ktorej celý zdrojový kód sa nachádza v zozname 6.
Zoznam 6. XML2JSON.java (verzia 1)
import java.io.FileReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovať statický java.lang.System. *; public class XML2JSON {public static void main (String [] args) throws Exception {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = nový FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planéta planéta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (planéta); out.println (json); }}
Predtým, ako budete môcť zostaviť zoznamy 5 a 6, musíte si stiahnuť Jackson Dataformat XML, ktorý implementuje XMLMapper
. Stiahol som si verziu 2.9.7, ktorá sa zhoduje s verziami ďalších troch balíkov Jackson.
Za predpokladu, že ste sa úspešne stiahli jackson-dataformat-xml-2.9.7.jar
, vykonajte nasledujúci príkaz (z dôvodu čitateľnosti rozložený na dva riadky), aby ste zostavili zdrojový kód:
javac -cp jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar ;. XML2JSON.java
Pred spustením výslednej aplikácie si musíte stiahnuť Jackson Module: JAXB Annotations a tiež stiahnuť StAX 2 API. Stiahol som si JAXB Annotations verzie 2.9.7 a StAX 2 API verzie 3.1.3.
Za predpokladu, že ste sa úspešne stiahli jackson-module-jaxb-annotations-2.9.7.jar
a stax2-api-3.1.3.jar
, spustite nasledujúci príkaz (kvôli čitateľnosti rozdelený do troch riadkov):
java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databind-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
Ak všetko pôjde dobre, mali by ste sledovať nasledujúci výstup:
{"name": "Zem", "planet_from_sun": 3, "mesiace": 9}
Preveďte XML na JSON pomocou prechodu stromom
Ďalším spôsobom, ako previesť z XML na JSON, je najskôr analyzovať XML na strom uzlov JSON a potom tento strom zapísať do dokumentu JSON. Prvú úlohu môžete splniť zavolaním jedného z nich XMLMapper
je zdedený readTree ()
metódy:
XmlMapper xmlMapper = nový XmlMapper (); Uzol JsonNode = xmlMapper.readTree (xml.getBytes ());
ObjectMapper
je JsonNode readTree (obsah bajtov [])
metóda deserializuje obsah JSON na strom jackson.databind.JsonNode
objekty a vráti koreň JsonNode
objekt tohto stromu. V XmlMapper
súvislosti táto metóda deserializuje obsah XML do stromu. V obidvoch prípadoch sa obsah JSON alebo XML odovzdá tejto metóde ako pole bajtov.
Druhá úloha - konverzia stromu objektov na JSON - sa vykonáva podobným spôsobom, aký som predtým ukázal. Tentokrát je to JsonNode
koreňový objekt, ktorý je odovzdaný writeValueAsString ()
:
ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (uzol);
Vyňal som tieto fragmenty kódu z XML2JSON
aplikácia, ktorej celý zdrojový kód sa nachádza v zozname 7.
Zoznam 7. XML2JSON.java (verzia 2)
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovať statický java.lang.System. *; public class XML2JSON {public static void main (String [] args) throws Exception {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = nový XmlMapper (); Uzol JsonNode = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (uzol); out.println (json); }}
Vykonajte nasledujúci príkaz (kvôli čitateľnosti rozložený na dva riadky), aby ste zostavili záznam č. 7:
javac -cp jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar XML2JSON.java
Pred spustením výslednej aplikácie si musíte stiahnuť Woodstox, čo je vysoko výkonný procesor XML, ktorý implementuje StAX, SAX2 a StAX2. Stiahol som si Woodstox 5.2.0. Potom spustite nasledujúci príkaz (pre lepšiu čitateľnosť rozdelený do troch riadkov):
java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar; stax2-api-3.1.3.jar; woodstox-core-5.2.0.jar ;. XML2JSON
Ak všetko pôjde dobre, mali by ste sledovať nasledujúci výstup:
{"name": "Earth", "planet_from_sun": "3", "moons": "1"}
Všimnite si, že čísla priradené k planet_from_sun
a mesiace
Prvky XML sa namiesto čísel serializujú do reťazcov JSON. The readTree ()
Metóda neodvodzuje dátový typ pri absencii explicitnej definície typu.
Jacksonova podpora prechodu stromom XML má ďalšie obmedzenia:
- Jackson nie je schopný rozlišovať medzi objektmi a poľami. Pretože XML neposkytuje žiadne prostriedky na odlíšenie objektu od zoznamu (poľa) objektov, Jackson zhromažďuje opakované prvky do jednej hodnoty.
- Jackson nepodporuje zmiešaný obsah (textový obsah a prvky ako podradené prvky). Namiesto toho mapuje každý prvok XML na a
JsonNode
objekt. Stratí sa akýkoľvek text.
Vzhľadom na tieto obmedzenia nie je prekvapujúce, že oficiálna dokumentácia spoločnosti Jackson odporúča parsovať XML na JsonNode
- založené stromy. Lepšie je vám použiť techniku prevodu viazania údajov.
Záver
Materiál uvedený v tomto článku by sa mal považovať za dodatok k kapitolám 6 a 11 v druhom vydaní Java XML a JSON. Naproti tomu môj ďalší článok bude súvisieť s knihou, ale s úplne novým materiálom. Dávajte pozor na môj nadchádzajúci článok o viazaní objektov Java na dokumenty JSON pomocou JSON-B.
Tento príbeh, „Java XML a JSON: Spracovanie dokumentov pre Java SE, časť 1: SAXON a Jackson“, bol pôvodne publikovaný spoločnosťou JavaWorld.