Podpora knižníc XML v prostredí Java

1. Úvod

V tomto článku budeme porovnávať knižnice Java XML a API.

Toto je druhý článok zo série o podpore Java pre XML, ak sa chcete hlbšie venovať podpore XPath v Jave, pozrite si predchádzajúci článok.

2. Prehľad

Teraz sa budeme hlbšie venovať podpore sveta XML a začneme tým, že čo najjednoduchšie vysvetlíme všetky iniciály týkajúce sa predmetu.

V podpore Java XML nájdeme niekoľko definícií API, každá má svoje klady a zápory.

SAX: Je to API na analýzu udalostí založené na udalostiach, poskytuje prístup na nízkej úrovni, je pamäťovo efektívne a rýchlejšie ako DOM, pretože nenačíta celý strom dokumentov do pamäte, ale neposkytuje podporu pre navigáciu, ako poskytuje XPath , aj keď je to efektívnejšie, ťažšie sa používa aj.

DOM: Ako analyzátor založený na modeloch, ktorý načíta dokument stromovej štruktúry do pamäte, takže máme pôvodné poradie prvkov, môžeme sa v našom dokumente pohybovať oboma smermi, poskytuje API na čítanie a zápis, ponúka manipuláciu s XML a je veľmi ľahké použitie, aj keď cena je veľká záťaž na pamäťové zdroje.

StAX: Ponúka ľahký DOM a efektivitu SAX, ale nemá niektoré funkcie poskytované DOM, ako je manipulácia s XML, a umožňuje nám iba navigovať v dokumente.

JAXB: Umožňuje nám navigovať v dokumente oboma smermi, je efektívnejšia ako DOM, umožňuje konverziu z XML na typy Java a podporuje manipuláciu s XML, ale dokáže analyzovať iba platný dokument XML.

Stále môžete nájsť nejaké odkazy na JAXP, ale posledné vydanie tohto projektu je z marca 2013 a je prakticky mŕtvy.

Tabuľka XML API

3. XML

V tejto časti sa pozrieme na najpopulárnejšie implementácie, aby sme mohli otestovať skutočné funkčné vzorky a skontrolovať rozdiely medzi nimi.

V nasledujúcich príkladoch budeme pracovať s jednoduchým súborom XML s takouto štruktúrou:

  Guava Úvod do programu Guava 4. 4. 2016 GuavaAuthor ... 

4. DOM4J

Začneme tým, že sa pozrieme na to, čo môžeme urobiť DOM4J a pre tento príklad musíme pridať poslednú verziu tejto závislosti.

Toto je jedna z najpopulárnejších knižníc, s ktorými sa dá pracovať XML súbory, pretože nám umožňuje vykonávať obojsmerné čítanie, vytvárať nové dokumenty a aktualizovať existujúce.

DOM4J môže pracovať s DOM, SAX, XPath a XLST. SAX je podporované prostredníctvom JAXP.

Pozrime sa tu napríklad, ako môžeme zvoliť filtrovanie prvkov podľa daného id.

Čítačka SAXReader = nová SAXReader (); Dokument dokument = reader.read (súbor); Zoznam prvkov = document.selectNodes ("// * [@ tutId = '" + id + "']"); návrat elements.get (0);

The SAXReader trieda je zodpovedná za vytvorenie a DOM4J strom z SAX analýza udalostí. Keď už máme org.dom4j.Dokument Musíme zavolať potrebnú metódu a odovzdať jej metódu XPath výraz ako a String.

Môžeme načítať existujúci dokument, vykonávať zmeny v jeho obsahu a potom aktualizovať pôvodný súbor.

pre (Uzol uzla: uzly) {Element prvku = (Element) uzol; Iterátor iterátor = element.elementIterator ("názov"); while (iterator.hasNext ()) {Názov prvku = (Element) iterator.next (); title.setText (title.getText () + "aktualizované"); }} Zapisovač XMLWriter = nový XMLWriter (nový FileWriter (nový súbor ("src / test / resources / example_updated.xml"))); spisovateľ.písať (dokument); writer.close ();

Vo vyššie uvedenom príklade meníme obsah každého titulu a vytvárame nový súbor.

Všimnite si tu, aké jednoduché je získať všetky tituly uzol v zozname volaním elementIterator a odovzdanie názvu uzol.

Keď svoj obsah upravíme, použijeme XMLWriter to trvá a DOM4J strom a naformátuje ho na stream ako XML.

Vytvorenie nového dokumentu od začiatku je také jednoduché, ako vidíme nižšie.

Dokument dokument = DocumentHelper.createDocument (); Root prvku = document.addElement ("XMLTutorials"); Element tutorialElement = root.addElement ("tutorial"). AddAttribute ("tutId", "01"); tutorialElement.addAttribute ("type", "xml"); tutorialElement.addElement ("title"). addText ("XML s Dom4J"); ... OutputFormat format = OutputFormat.createPrettyPrint (); Zapisovač XMLWriter = nový XMLWriter (nový FileWriter (nový súbor ("src / test / resources / example_new.xml")), formát); spisovateľ.písať (dokument); writer.close (); 

DocumentHelper nám dáva zbierku metód, ktoré môžeme použiť v DOM4J, ako napr createDocument čím sa vytvorí prázdny dokument, ktorý s ním začne pracovať.

Pomocou metód, ktoré poskytuje, môžeme vytvoriť toľko atribútov alebo prvkov, koľko potrebujeme DOM4JAkonáhle máme náš dokument hotový, jednoducho ho napíšeme do súboru, ako sme to už robili v prípade aktualizácie.

5. JDOM

Aby bolo možné pracovať s JDOM, túto závislosť musíme pridať k nášmu pom.

JDOM štýl práce je dosť podobný DOM4J, takže sa pozrieme na niekoľko príkladov:

Builder SAXBuilder = nový SAXBuilder (); Dokument doc = builder.build (this.getFile ()); Výukové programy k prvkom = doc.getRootElement (); Zoznam titulov = tutorials.getChildren ("návod"); 

Vo vyššie uvedenom príklade získavame všetky prvky z koreňového prvku veľmi jednoduchým spôsobom, ako to môžeme robiť DOM4J:

Builder SAXBuilder = nový SAXBuilder (); Dokument dokument = (Dokument) builder.build (súbor); Reťazcový filter = "// * [@ tutId = '" + id + "']" "; XPathFactory xFactory = XPathFactory.instance (); XPathExpression expr = xFactory.compile (filter, Filters.element ()); Uzol zoznamu = expr.evaluate (document);

Opäť tu v kóde vyššie máme SAXBuilder vytvorenie a Dokument inštancie z daného súboru. Získavame prvok podľa neho tutId atribút odovzdaním XPath výraz pre XPathFactory poskytuje JDOM2.

6. STAX

Teraz sa pozrieme na to, ako by sme pomocou prvku mohli získať všetky prvky z nášho koreňového prvku Stax API. Stax je súčasťou JDK od Java 6, takže nemusíte pridávať žiadne závislosti.

Najskôr musíme vytvoriť a Výukový program trieda:

kurz pre verejnú triedu {private String tutId; súkromný typ reťazca; súkromný názov reťazca; popis súkromného reťazca; súkromný dátum reťazca; súkromný autor reťazcov; // štandardné getre a setre}

a potom sme pripravení nasledovať:

Zoznam tutoriálov = nový ArrayList (); XMLInputFactory factory = XMLInputFactory.newInstance (); XMLEventReader eventReader = factory.createXMLEventReader (nový FileReader (this.getFile ())); Výukový prúd; while (eventReader.hasNext ()) {XMLEvent event = eventReader.nextEvent (); switch (event.getEventType ()) {case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement (); Reťazec qName = startElement.getName (). GetLocalPart (); ... prestávka; case XMLStreamConstants.CHARACTERS: Characters characters = event.asCharacters (); ... prestávka; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement (); // skontrolujeme, či sme našli uzatvárací prvok // zavrieme zdroje, ktoré je potrebné explicitne uzavrieť break; }}

V príklade vyššie, aby sme nám pomohli načítať informácie, sme potrebovali vytvoriť triedu na ukladanie načítaných údajov.

Aby sme si prečítali dokument, deklarovali sme, čo sa nazýva obslužné rutiny udalostí, a použili sme ich na navigáciu v našom dokumente. Pamätajte, že implementácie SAX neposkytujú obojsmernú navigáciu. Ako vidíte tu, je potrebné vykonať ešte veľa práce, aby ste získali jednoduchý zoznam prvkov.

7. JAXB

JAXB je súčasťou balenia JDK, rovnako ako Xerces, tu nepotrebujeme žiadnu ďalšiu závislosť.

Je veľmi jednoduché načítať, vytvoriť a manipulovať s informáciami z XML súbor pomocou JAXB.

Potrebujeme len vytvoriť správne java entity, ktoré by mohli viazať XML a to je všetko.

JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); Výukové programy tutoriály = (Výukové programy) jaxbUnmarshaller.unmarshal (this.getFile ());

V príklade vyššie načítame naše XML súbor do nášho objektu a odtiaľ môžeme všetko spracovať ako normálnu štruktúru Java;

Vytvorenie nového dokumentu je také jednoduché ako prečítať ho, ale urobiť ho opačným spôsobom, ako je to uvedené v nasledujúcom kóde.

Najskôr ideme upraviť náš Výukový program trieda pridať JAXB anotácie k getry a stavače:

public class Tutorial {... public String getTutId () {return tutId; } @XmlAttribute public void setTutId (reťazec tutId) {this.tutId = tutId; } ... @XmlElement public void setTitle (názov reťazca) {this.title = title; } ...} @XmlRootElement verejné kurzy - návody {súkromný zoznam - príručka; // štandardní vyhľadávači a nastavovatelia s anotáciou @XmlElement}

S @XmlRootElement definujeme, aký objekt bude predstavovať koreňový uzol nášho dokumentu, a potom použijeme @XmlAttribute alebo @XmlElement definovať, či tento atribút predstavuje atribút uzla alebo prvku dokumentu.

Potom môžeme sledovať:

Tutoriály tutoriály = nové Tutoriály (); tutorials.setTutorial (new ArrayList ()); Tutorial tut = nový Tutorial (); tut.setTutId ("01"); ... tutorials.getTutorial (). add (tut); JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller (); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, pravda); jaxbMarshaller.marshal (návody, súbor);

Ako vidíte, väzba súboru XML na objekty Java je najjednoduchší spôsob, ako tento druh súborov pracovať.

8. Podpora výrazov XPath

Na vytvorenie zložitých výrazov XPath môžeme použiť Jaxen. Toto je knižnica XPath s otvoreným zdrojom prispôsobiteľná mnohým rôznym objektovým modelom vrátane DOM, XOM, DOM4Ja JDOM.

Môžeme vytvárať výrazy XPath a kompilovať ich proti mnohým podporovaným dokumentom.

Reťazcový výraz = "/ tutoriály / tutoriál"; Cesta XPath = nový DOMXPath (výraz); Výsledok zoznamu = path.selectNodes (xmlDocument);

Aby to fungovalo, budeme musieť do nášho projektu pridať túto závislosť.

9. Záver

Ako vidíte, existuje veľa možností na prácu s XML, v závislosti od požiadaviek vašej aplikácie môžete pracovať s ktoroukoľvek z nich alebo si budete musieť zvoliť medzi efektívnosťou a jednoduchosťou.

Úplné pracovné ukážky tohto článku nájdete v našom úložisku git tu.


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