Proměna
Zkusme nyní transformaci. Proveďte následující příkaz:
java XSLTDemo books.xml books.xsl
Bohužel tato transformace selže: měli byste sledovat výstup, který identifikuje Apache Xalan jako továrnu na transformátory a chybová zpráva uvádějící, že xsl: pro každou skupinu
není podporováno.
Pojď to zkusit znovu. Za předpokladu, že saxon9he.jar
a XSLTDemo.class
jsou umístěny v aktuálním adresáři, proveďte následující příkaz:
java -cp saxon9he.jar ;. XSLTDemo books.xml books.xsl
Tentokrát byste měli dodržovat následující seřazený a správně seskupený výstup:
Dodatek ke kapitole 11: Zpracování JSON s Jacksonem
Převod XML na JSON s Jacksonem
Java XML a JSON, kapitola 11, představuje Jackson, který poskytuje API pro analýzu a vytváření objektů JSON. Je také možné použít Jackson k převodu dokumentů XML na dokumenty JSON.
V této části vám ukážu dva způsoby, jak převést XML na JSON, nejprve s datovou vazbou a poté s procházením stromu. Předpokládám, že jste četli kapitolu 11 a znáte Jacksona. Chcete-li sledovat tato ukázka, měli byste si stáhnout následující soubory JAR z úložiště Maven:
jackson-annotations-2.9.7.jar
jackson-core-2.9.7.jar
jackson-databind-2.9.7.jar
Budete také potřebovat několik dalších souborů JAR; většina je společná pro obě techniky převodu. Brzy poskytnu informace o získání těchto souborů JAR.
Převést XML na JSON s datovou vazbou
Vazba dat umožňuje mapovat serializovaná data na objekt Java. Předpokládejme například, že máte malý dokument XML, který popisuje jednu planetu. Výpis 4 představuje tento dokument.
Výpis 4. planet.xml
Země 3 9
Výpis 5 představuje ekvivalentní prostředí Java Planeta
třída, jejíž objekty se mapují na planet.xml
obsah.
Výpis 5. Planet.java
public class Planet {public Název řetězce; veřejné celé číslo planet_from_sun; veřejné celé číslo měsíce; }
Proces převodu vyžaduje, abyste nejprve analyzovali XML na Planeta
objekt. Tohoto úkolu můžete dosáhnout prací s com.fasterxml.jackson.dataformat.xml.XmlMapper
třídy, takto:
XmlMapper xmlMapper = nový XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = nový FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planet planet = xmlMapper.readValue (xmlsr, Planet.class);
XmlMapper
je přizpůsobený com.fasterxml.jackson.databind.ObjectMapper
který čte a zapisuje XML. Poskytuje několik readValue ()
metody pro čtení jedné hodnoty XML ze vstupního zdroje specifického pro XML; například:
T readValue (XMLStreamReader r, Class valueType)
Každý readValue ()
metoda vyžaduje a javax.xml.stream.XMLStreamReader
objekt jako jeho první argument. Tento objekt je v podstatě syntaktický analyzátor založený na toku StAX pro efektivní analýzu textu dopředu.
Druhým argumentem je a java.lang.Class
objekt pro cílový typ, který je vytvářen instancemi, naplněn daty XML a jehož instance je následně vrácena z metody.
Závěrem tohoto fragmentu kódu je, že obsah výpisu 4 je načten do a Planeta
namítněte proti tomu readValue ()
se vrátí ke svému volajícímu.
Jakmile byl objekt vytvořen, je snadné jej pomocí práce zapsat jako JSON ObjectMapper
a jeho String writeValueAsString (hodnota objektu)
metoda:
ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (planeta);
Vyňal jsem tyto fragmenty kódu z XML2JSON
aplikace, jejíž úplný zdrojový kód je uveden v seznamu 6.
Výpis 6. XML2JSON.java (verze 1)
importovat 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; importovat 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); Planet planet = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (planeta); out.println (json); }}
Než budete moci kompilovat výpisy 5 a 6, budete si muset stáhnout Jackson Dataformat XML, který implementuje XMLMapper
. Stáhl jsem si verzi 2.9.7, která odpovídá verzím dalších tří Jacksonových balíčků.
Za předpokladu, že jste úspěšně stáhli jackson-dataformat-xml-2.9.7.jar
, proveďte následující příkaz (pro lepší čitelnost rozložený na dva řádky) a zkompilujte 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
Než budete moci spustit výslednou aplikaci, budete si muset stáhnout Jackson Module: JAXB Annotations a také stáhnout StAX 2 API. Stáhl jsem si JAXB Annotations verze 2.9.7 a StAX 2 API verze 3.1.3.
Za předpokladu, že jste úspěšně stáhli jackson-module-jaxb-annotations-2.9.7.jar
a stax2-api-3.1.3.jar
, spusťte následující příkaz (pro lepší čitelnost rozložený na tři řádky) a spusťte aplikaci:
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
Pokud vše půjde dobře, měli byste dodržovat následující výstup:
{"name": "Země", "planet_from_sun": 3, "měsíce": 9}
Převeďte XML na JSON pomocí procházení stromu
Dalším způsobem, jak převést z XML na JSON, je nejprve analyzovat XML na strom uzlů JSON a poté tento strom zapsat do dokumentu JSON. První úkol můžete splnit voláním jednoho z XMLMapper
je zděděno readTree ()
metody:
XmlMapper xmlMapper = nový XmlMapper (); Uzel JsonNode = xmlMapper.readTree (xml.getBytes ());
ObjectMapper
je JsonNode readTree (byte [] obsah)
metoda deserializuje obsah JSON do stromu jackson.databind.JsonNode
objekty a vrátí kořen JsonNode
předmět tohoto stromu. V XmlMapper
kontext, tato metoda deserializuje obsah XML do stromu. V obou případech je obsah JSON nebo XML předán této metodě jako pole bajtů.
Druhý úkol - převod stromu objektů na JSON - se provádí podobným způsobem, jaký jsem předtím ukázal. Tentokrát je to JsonNode
kořenový objekt, který je předán writeValueAsString ()
:
ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (uzel);
Vyňal jsem tyto fragmenty kódu z XML2JSON
aplikace, jejíž úplný zdrojový kód je uveden v seznamu 7.
Výpis 7. XML2JSON.java (verze 2)
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovat 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 (); Uzel JsonNode = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (uzel); out.println (json); }}
Proveďte následující příkaz (pro lepší čitelnost rozložený na dvou řádcích) a zkompilujte Výpis 7:
javac -cp jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar XML2JSON.java
Než budete moci spustit výslednou aplikaci, budete si muset stáhnout Woodstox, což je vysoce výkonný procesor XML, který implementuje StAX, SAX2 a StAX2. Stáhl jsem si Woodstox 5.2.0. Poté spusťte následující příkaz (pro lepší čitelnost rozložený na tři řádky) a spusťte aplikaci:
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
Pokud vše půjde dobře, měli byste dodržovat následující výstup:
{"name": "Země", "planet_from_sun": "3", "měsíce": "1"}
Všimněte si, že čísla přiřazená k planet_from_sun
a měsíce
Elementy XML jsou namísto čísel serializovány do řetězců JSON. The readTree ()
Metoda neodvozuje datový typ při absenci explicitní definice typu.
Jacksonova podpora pro procházení stromu XML má další omezení:
- Jackson není schopen rozlišovat mezi objekty a poli. Protože XML neposkytuje žádné prostředky k odlišení objektu od seznamu (pole) objektů, Jackson porovnává opakované prvky do jedné hodnoty.
- Jackson nepodporuje smíšený obsah (textový obsah a prvky jako podřízené prvky). Místo toho mapuje každý prvek XML na a
JsonNode
objekt. Jakýkoli text je ztracen.
Vzhledem k těmto omezením není divu, že oficiální dokumentace Jacksona doporučuje analýzu XML do JsonNode
-založené stromy. Lepší je použít techniku převodu datové vazby.
Závěr
Materiál představený v tomto článku by měl být považován za dodatek ke kapitolám 6 a 11 ve druhém vydání Java XML a JSON. Naproti tomu můj další článek bude souviset s knihou, ale se zcela novým materiálem. Dávejte pozor na můj nadcházející článek o vazbě objektů Java na dokumenty JSON pomocí JSON-B.
Tento příběh „Java XML a JSON: Zpracování dokumentů pro prostředí Java SE, Část 1: SAXON a Jackson“ původně publikoval JavaWorld.