Java és az XML
Frissítve: 2019. július 27.
Felhasznált technológiák: Java 12, JUnit 5, XmlUnit 2, Maven 3
Van pár régebbi anyagom, melyet szeretnék publikálni, mielőtt új témákba kezdenék bele. Ebből egyik a Java XML kezeléséről szól, ami ugyan nem a legforróbb terület manapság, azonban mégsem árthat egy kis összefoglaló.
Ehhez poszthoz is található egy projekt a GitHub-on, melyben rengeteg példa van.
Java SE-n belül a The Java™ API For XML Processing (JAXP) API, specifikáció felelős az XML feldolgozásért.
A JAXP-hez remek tutorial is található az Oracle oldalán.
A JAXP-ben három parser található. A Simple API for XML (SAX), Document Object Model (DOM) és a Streaming API for XML (StAX). A SAX (mely egy de facto szabvány) egy push parser, a DOM (mely egy W3C szabvány) memóriában felépíti a teljes fát és a StAX pedig egy pull parser, és önmagán belül is még két lehetőséget tartalmaz parse-olásra. Mindegyikre található példa a példa alkalmazásban, és a StAX-ról régebben egy posztot is írtam.
XML séma (XSD) alapján validálni a Validator
osztállyal lehetséges, a
Schema
betöltése SchemaFactory
-val történik. DTD alapján nem tud
validálni, ha mégis ilyent szeretnénk, akkor a parsernél kell a
validációt beállítani.
A TransformerFactory
és Transformer
osztályok használatával lehet
XML transzformációkat végezni.
A JAXP XPath kiértékelési lehetőségeit a XPathFactory
osztályon és
XPath
interfészen keresztül lehet kihasználni.
A JAXP minden része fel van szerelve névterek kezelésére is.
A JAXP specifikációt megvalósító két Apache projekt került a JDK-ba, az egyik az XML
parse-olást végző Xerces2, a
másik az XML transzformációt végző
Xalan-Java. A JDK /legal/java.xml
könyvtárában lévő fájlok alapján a 12.0.2 verzióba a Xerces 2.11.0,
a Xalan 2.7.2 verziója került bele.
Gyakorlatilag annyi történt, hogy a csomag neve elé még betették a
com.sun.org
előtagot.
Mivel a JAXP csak egy API, könnyen lehet az implementációt is cserélni
alatta. Ennek mikéntje a Java API
DocumentBuilderFactory
newInstance()
metódusánál van leírva.
Az XML funkciók unit tesztelésére alkalmas az XMLUnit könyvtár, mely képes XML dokumentumok összehasonlításra (nem szöveg összehasonlítás), XPath kifejezések futtatására, validációra és transzformációk ellenőrzésére.
Amennyiben két XML-t szeretnénk struktúrálisan összehasonlítani, a
következő kódrészletet alkalmazhatjuk. A legegyszerűbb az XmlAssert
használata, mely egy AssertJ assert, ezért a org.xmlunit:xmlunit-core
artifacton túl
a org.xmlunit:xmlunit-assertj
függőséget is fel kell vennünk.
XmlAssert.assertThat(actual).and(expected).areSimilar();
Az actual
változó tartalmazza a visszakapott XML dokumentumot, amit ellenőrizni
szeretnénk, az expected
pedig az elvártat. Ami különösen hasznos, hogy az
XMLUnit különböző típusú objektumokat képes fogadni: pl. DOM Document
vagy
Node
, String
, byte[]
, InputStream
, File
, stb.
Amennyiben XPath kifejezés eredményére szeretnénk ellenőrizni, használjuk a következő kódrészletet.
XmlAssert.assertThat(actual).valueByXPath("/catalog/book[@isbn10 = '1590597060']/title")
.isEqualTo("Pro XML Development with Java Technology");
A validálás a következőképp történhet:
XmlAssert.assertThat(actual)
.isValidAgainst(ValidatorApi.class.getResourceAsStream("/catalog.xsd"));
Az XMLUnit segítségével tudunk XML transzformációt is futtatni:
Transformation transformation = new Transformation(new StreamSource(new StringReader(xml)));
transformation.setStylesheet(
new StreamSource(XsltTest.class.getResourceAsStream("/catalog.xslt")));
String result = transformation.transformToString();
Az XML-lel kapcsolatban még érdemes megjegyezni, hogy a properties
állományokat is lehet XML formában tárolni, ekkor a Properties
osztály
loadFromXML
metódusát kell meghívni.
Nagyon egyszerű esetben, amennyiben JavaBean-eket akarunk kiírni, majd
visszaolvasni, és nem számít az XML felépítése, használhatjuk a Java
XMLEncoder
és XMLDecoder
osztályát.
Léteznek még a JDK-n kívül is XML feldolgozásra könyvtárak, mint pl. a dom4j.
A témával kapcsolatban két könyvet ajánlok. Az egyik a Brett McLaughlin, Justin Edelson: Java and XML, a másik a Ajay Vohra: Pro XML Development with Java Technology Paperback.