XML könyvtárak támogatása Java-ban

1. Bemutatkozás

Ebben a cikkben összehasonlítjuk a Java XML könyvtárakat és az API-kat.

Ez a sorozat második cikke az XML Java támogatásáról, ha mélyebbre akarsz térni a Java XPath támogatásában, akkor nézd meg az előző cikket.

2. Áttekintés

Most mélyebbre fogunk mélyedni az XML világtámogatásában, és ennek érdekében a lehető legegyszerűbben elmagyarázzuk az összes tantárgyhoz kapcsolódó kezdőbetűt.

A Java XML támogatásban kevés API definíciót találhatunk, mindegyiknek megvannak a maga előnyei és hátrányai.

SAX: Ez egy eseményalapú elemző API, alacsony szintű hozzáférést biztosít, hatékony a memória és gyorsabb, mint a DOM, mivel nem tölti be a teljes dokumentumfát a memóriába, de nem támogatja a navigációt, mint az XPath , bár hatékonyabb, nehezebb használni is.

DOM: Mint modellalapú elemző, amely egy fa struktúrájú dokumentumot tölt be a memóriába, tehát megvan az eredeti elemek sorrendje, navigálhatunk a dokumentumunkban mindkét irányban, API-t biztosít az olvasáshoz és az íráshoz, XML manipulációt kínál és nagyon könnyű használja, bár az ára nagyon megterheli a memória erőforrásait.

StAX: A DOM egyszerűségét és az SAX hatékonyságát kínálja, de hiányzik a DOM által biztosított bizonyos funkcióktól, például az XML-manipulációtól, és csak a dokumentumban történő továbblépést teszi lehetővé.

JAXB: Lehetővé teszi számunkra, hogy a dokumentumban mindkét irányban navigáljunk, hatékonyabb, mint a DOM, lehetővé teszi az XML-ből java típusokba történő átalakítást és támogatja az XML-manipulációt, de csak egy érvényes XML-dokumentumot tud elemezni.

Még mindig találhat néhány utalást a JAXP-re, de a projekt utolsó kiadása 2013 márciusától származik, és gyakorlatilag halott.

XML API-k táblázata

3. Az XML

Ebben a részben megnézzük a legnépszerűbb megvalósításokat, hogy valódi működő mintákat tesztelhessünk és ellenőrizhessük a különbségeket.

A következő példákban egy egyszerű felépítésű XML fájllal fogunk dolgozni:

  Guava Bevezetés Guava 2016.04.04. GuavaAuthor ... 

4. DOM4J

Kezdjük azzal, hogy megvizsgáljuk, mit tehetünk DOM4J ehhez a példához hozzá kell adnunk ennek a függőségnek az utolsó verzióját.

Ez az egyik legnépszerűbb könyvtár XML fájlokat, mivel ez lehetővé teszi számunkra a kétirányú olvasást, új dokumentumok létrehozását és a meglévők frissítését.

DOM4J tud dolgozni DOM, SAX, XPath és XLST. SAX keresztül támogatott JAXP.

Vessünk egy pillantást ide, például hogyan választhatunk ki egy elemet, amely egy adott azonosító alapján szűr.

SAXReader olvasó = új SAXReader (); Dokumentumdokumentum = olvasó.olvasott (fájl); Lista elemek = document.selectNodes ("// * [@ tutId = '" + id + "']"); return elements.get (0);

A SAXReader osztály felelős a DOM4J fa től SAX események elemzése. Miután megvan a org.dom4j.Dokumentum csak meg kell hívnunk a szükséges módszert és át kell adnunk a XPath kifejezés mint a Húr.

Betölthetünk egy meglévő dokumentumot, módosíthatjuk annak tartalmát, majd frissíthetjük az eredeti fájlt.

for (Csomópont csomópont: csomópontok) {Elem elem = (Elem) csomópont; Iterátor iterátor = element.elementIterator ("cím"); while (iterator.hasNext ()) {Element title = (Element) iterator.next (); title.setText (title.getText () + "frissítve"); }} XMLWriter író = új XMLWriter (új FileWriter (új fájl ("src / test / resources / example_updated.xml"))); író.írni (dokumentum); író.zárja ();

A fenti példában minden cím tartalmát megváltoztatjuk, és új fájlt hozunk létre.

Figyelje meg itt, milyen egyszerű minden cím megszerzése csomópont listában hívással elementIterator és átadta a csomópont.

Miután módosítottuk tartalmunkat, felhasználjuk a XMLWriter hogy a DOM4J fájlt, és formátumként formázza azt egy XML.

Új dokumentum létrehozása a semmiből olyan egyszerű, mint az alábbiakban láthatjuk.

Dokumentumdokumentum = DocumentHelper.createDocument (); Elemgyökér = document.addElement ("XMLTutorials"); Element tutorialElement = root.addElement ("tutorial"). AddAttribute ("tutId", "01"); tutorialElement.addAttribute ("type", "xml"); tutorialElement.addElement ("title"). addText ("XML Dom4J-vel"); ... OutputFormat format = OutputFormat.createPrettyPrint (); XMLWriter író = új XMLWriter (új FileWriter (új File ("src / test / resources / example_new.xml")), formátum); író.írni (dokumentum); író.zárja (); 

DocumentHelper módszerek gyűjteményét adja meg DOM4J, mint például createDocument ami létrehoz egy üres dokumentumot a munka megkezdéséhez.

Az általunk biztosított módszerekkel annyi attribútumot vagy elemet hozhatunk létre, amennyire szükségünk van DOM4J, és miután elkészült a dokumentumunk, csak egy fájlba írjuk, mint az előző esetben a frissítési esetnél.

5. JDOM

Annak érdekében, hogy működjön együtt JDOM, hozzá kell adnunk ezt a függőséget a pomunkhoz.

JDOM-k munkastílus eléggé hasonlít a DOM4J-k, ezért csak néhány példát vessünk szemügyre:

SAXBuilder builder = új SAXBuilder (); Dokumentum doc = builder.build (this.getFile ()); Elem oktatóanyagok = doc.getRootElement (); Címek felsorolása = tutorials.getChildren ("tutorial"); 

A fenti példában az összes elemet nagyon egyszerű módon kapjuk le a gyökérelemből, ahogyan ezt megtehetjük DOM4J:

SAXBuilder builder = új SAXBuilder (); Document document = (Dokumentum) builder.build (fájl); Karakterlánc-szűrő = "// * [@ tutId = '" + id + "']"; XPathFactory xFactory = XPathFactory.instance (); XPathExpression expr = xFactory.compile (szűrő, Szűrők.element ()); Lista csomópont = expr.evaluate (dokumentum);

Ismét itt a fenti kódban van egy SAXBuilder létrehozása a Dokumentum példány egy adott fájlból. Egy elemet annak alapján keresünk tutId attribútum egy an átadásával XPath kifejezés a XPathFactory által biztosított JDOM2.

6. StAX

Most meg fogjuk nézni, hogyan lehetne lekérni az összes elemet a gyökér elemünkből a Stax API. Stax tartalmazza a JDK a Java 6 óta, így nem kell hozzáadnia semmilyen függőséget.

Először létre kell hoznunk a Bemutató osztály:

nyilvános osztály bemutatója {private String tutId; privát String típus; privát húr cím; privát karakterlánc leírása; privát String dátum; magánhúr-szerző; // szabványos mérőeszközök és beállítók}

és akkor készek vagyunk követni:

Lista oktatóanyagok = new ArrayList (); XMLInputFactory gyár = XMLInputFactory.newInstance (); XMLEventReader eventReader = factory.createXMLEventReader (új FileReader (this.getFile ())); Oktató aktuális; while (eventReader.hasNext ()) {XMLEvent event = eventReader.nextEvent (); switch (event.getEventType ()) {case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement (); Karakterlánc qNév = startElement.getName (). GetLocalPart (); ... szünet; case XMLStreamConstants.CHARACTERS: Karakterek karakterek = event.asCharacters (); ... szünet; eset XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement (); // ellenőrizze, hogy megtaláltuk-e a záró elemet // bezárandó erőforrások, amelyeket kifejezetten be kell zárni; }}

A fenti példában annak érdekében, hogy segítsünk az információk megszerzésében, létre kellett hoznunk egy osztályt, amelyben a visszakeresett adatokat tároljuk.

A dokumentum elolvasásához kijelentettük az úgynevezett eseménykezelőket, és ezeket használtuk a dokumentumunk előre történő eligazodásához. Ne feledje, hogy a SAX megvalósítások nem biztosítanak kétirányú navigációt. Amint itt láthatja, rengeteg munkát kell elvégezni, csak az elemek egyszerű listájának lekérése érdekében.

7. JAXB

JAXB a JDK, valamint a Xerces-hez ehhez se kell különösebb függőség.

Nagyon egyszerű betölteni, létrehozni és manipulálni az adatokat XML fájl segítségével JAXB.

Csak létre kell hoznunk a megfelelő java entitásokat a XML és ez az.

JAXBContext jaxbContext = JAXBContext.newInstance (oktatóanyagok.osztály); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); Oktatóanyagok oktatóanyagok = (oktatóanyagok) jaxbUnmarshaller.unmarshal (this.getFile ());

A fenti példában betöltöttük XML fájl az objektumunkba, és onnan mindent normál Java struktúraként kezelhetünk;

Új dokumentum létrehozása olyan egyszerű, mint elolvasása, de fordított módon történik, mint az alábbi kódban.

Először is módosítani fogjuk Bemutató osztály hozzá JAXB annotációk a getterek és beállítók:

public class Tutorial {... public String getTutId () {return tutId; } @XmlAttribute public void setTutId (String tutId) {this.tutId = tutId; } ... @XmlElement public void setTitle (String title) {this.title = title; } ...} @XmlRootElement nyilvános osztály oktatóanyagok {privát lista oktatóanyag; // szokásos getterek és beállítók @XmlElement kommentárral}

Val vel @XmlRootElement meghatározzuk, hogy mely objektum képviseli a dokumentumunk gyökércsomópontját, majd felhasználjuk @XmlAttribute vagy @XmlElement annak meghatározása, hogy ez az attribútum egy csomópont vagy a dokumentum elemének attribútumát képviseli-e.

Ezután követhetjük:

Oktatóanyagok oktatóanyagok = új oktatóanyagok (); tutorials.setTutorial (új ArrayList ()); Tutorial tut = új Tutorial (); tut.setTutId ("01"); ... tutorials.getTutorial (). add (tut); JAXBContext jaxbContext = JAXBContext.newInstance (oktatóanyagok.osztály); Marshaller jaxbMarshaller = jaxbContext.createMarshaller (); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, igaz); jaxbMarshaller.marshal (oktatóanyagok, fájl);

Mint látható, az XML fájl Java objektumokhoz kötése a legegyszerűbb módszer az ilyen fájlok kezelésére.

8. XPath Expression támogatás

Összetett XPath kifejezések létrehozásához használhatjuk a Jaxent. Ez egy nyílt forráskódú XPath könyvtár, amely sokféle objektummodellhez alkalmazható, beleértve a DOM, XOM, DOM4J, és JDOM.

Létrehozhatunk XPath kifejezéseket és összeállíthatjuk azokat számos támogatott dokumentum alapján.

Karakterlánc-kifejezés = "/ tutorials / tutorial"; XPath path = new DOMXPath (kifejezés); Lista eredménye = path.selectNodes (xmlDocument);

Ahhoz, hogy működjön, hozzá kell adnunk ezt a függőséget a projektünkhöz.

9. Következtetés

Mint láthatja, sok lehetőség van a munkára XML, az alkalmazás követelményeitől függően bármelyikkel együttműködhet, vagy választania kell a hatékonyság és az egyszerűség között.

A cikk teljes működő mintáját itt találja git-tárunkban.


$config[zx-auto] not found$config[zx-overlay] not found