Podrška XML knjižnica na Javi

1. Uvod

U ovom ćemo članku uspoređivati ​​Java XML knjižnice i API-je.

Ovo je drugi članak iz serije o Java podršci za XML, ako želite dublje ući u XPath podršku u Javi, pogledajte prethodni članak.

2. Pregled

Sada ćemo dublje istražiti podršku za XML svijet i za to ćemo započeti objašnjavanjem što jednostavnijih svih inicijala vezanih uz temu.

U podršci za Java XML možemo pronaći nekoliko definicija API-ja, a svaka ima svoje prednosti i nedostatke.

SAKSOFON: API je raščlanjivanja zasnovan na događajima, pruža pristup na niskoj razini, učinkovit je u memoriji i brži od DOM-a jer ne učitava cijelo stablo dokumenata u memoriju, ali ne pruža podršku za navigaciju poput one koju pruža XPath , iako je učinkovitiji, teže ga je koristiti.

DOM: Kao analizator zasnovan na modelu koji učitava dokument strukture stabla u memoriju, tako da imamo izvorni redoslijed elemenata, možemo se kretati našim dokumentom u oba smjera, pruža API za čitanje i pisanje, nudi XML manipulaciju i vrlo je jednostavno koristite iako je cijena velika opterećenja na memorijskim resursima.

STAX: Nudi jednostavnost DOM-a i učinkovitost SAX-a, ali nedostaju neke funkcije koje pruža DOM, poput XML manipulacije, i omogućuje nam samo kretanje prema dokumentu naprijed.

JAXB: Omogućuje nam kretanje dokumentom u oba smjera, učinkovitiji je od DOM-a, omogućuje pretvorbu iz XML-a u vrste Java i podržava XML manipulaciju, ali može analizirati samo važeći XML dokument.

Još uvijek možete pronaći neke reference na JAXP, ali posljednje izdanje ovog projekta je iz ožujka 2013. i praktički je mrtav.

Tablica XML API-ja

3. XML

U ovom ćemo odjeljku vidjeti najpopularnije implementacije, kako bismo mogli testirati stvarne radne uzorke i provjeriti razlike između njih.

U sljedećim primjerima radit ćemo s jednostavnom XML datotekom sa strukturom poput ove:

  Guava Uvod u Guavu 04/04/2016 GuavaAuthor ... 

4. DOM4J

Za početak ćemo pogledati što možemo učiniti DOM4J a za ovaj primjer trebamo dodati posljednju verziju ove ovisnosti.

Ovo je jedna od najpopularnijih knjižnica za rad XML datoteke, jer nam omogućuje dvosmjerno čitanje, stvaranje novih dokumenata i ažuriranje postojećih.

DOM4J može raditi s DOM, SAKSOFON, XPath i XLST. SAKSOFON je podržan putem JAXP.

Pogledajmo ovdje na primjer, kako možemo odabrati filtriranje elementa prema zadanom id-u.

Čitač SAXReader = novi SAXReader (); Dokument dokumenta = čitač.read (datoteka); Elementi popisa = document.selectNodes ("// * [@ tutId = '" + id + "']"); vratiti elemente.get (0);

The SAXReader razred je odgovoran za stvaranje a DOM4J stablo iz SAKSOFON raščlanjivanje događaja. Jednom kad imamo org.dom4j.Dokument samo trebamo pozvati potrebnu metodu i prenijeti joj XPath izraz kao a Niz.

Možemo učitati postojeći dokument, izmijeniti njegov sadržaj i zatim ažurirati izvornu datoteku.

za (čvor čvora: čvorovi) {element elementa = (čvor) čvor; Iterator iterator = element.elementIterator ("naslov"); while (iterator.hasNext ()) {Naslov elementa = (Element) iterator.next (); title.setText (title.getText () + "ažurirano"); }} XMLWriter Writer = novi XMLWriter (novi FileWriter (nova datoteka ("src / test / resources / example_updated.xml"))); pisac.pisati (dokument); pisac.close ();

U gornjem primjeru mijenjamo sadržaj svakog naslova i stvaramo novu datoteku.

Ovdje primijetite kako je jednostavno dobiti sve naslove čvor na popisu pozivanjem elementIterator i prosljeđivanje imena čvor.

Nakon što izmijenimo svoj sadržaj, koristit ćemo XMLWriter to traje a DOM4J stablo i formatira ga u potok kao XML.

Stvaranje novog dokumenta od nule jednostavno je kao što vidimo u nastavku.

Dokument dokumenta = DocumentHelper.createDocument (); Korijen elementa = document.addElement ("XMLTutoriali"); Element tutorialElement = root.addElement ("tutorial"). AddAttribute ("tutId", "01"); tutorialElement.addAttribute ("type", "xml"); tutorialElement.addElement ("naslov"). addText ("XML s Dom4J"); ... OutputFormat format = OutputFormat.createPrettyPrint (); XMLWriter Writer = novi XMLWriter (novi FileWriter (nova datoteka ("src / test / resources / example_new.xml")), format); pisac.pisati (dokument); pisac.close (); 

DocumentHelper daje nam zbirku metoda kojima se služimo DOM4J, kao što su createDocument koji stvara prazan dokument za početak rada s njim.

Pomoću metoda koje možemo pružiti možemo stvoriti onoliko atributa ili elemenata koliko nam je potrebno DOM4J, a nakon što dovršimo dokument, samo ga zapisujemo u datoteku kao što smo to činili s slučajem ažuriranja prije.

5. JDOM

Kako bi se surađivalo s JDOM, moramo dodati ovu ovisnost našoj pom.

JDOM-ove stil rada prilično je sličan DOM4J-ovi, pa ćemo pogledati samo nekoliko primjera:

SAXBuilder graditelj = novi SAXBuilder (); Dokument doc = builder.build (this.getFile ()); Vodiči za elemente = doc.getRootElement (); Naslovi popisa = tutorials.getChildren ("tutorial"); 

U gornjem primjeru dohvaćamo sve elemente iz korijenskog elementa na vrlo jednostavan način kao što to možemo učiniti DOM4J:

SAXBuilder graditelj = novi SAXBuilder (); Dokument dokumenta = (Dokument) builder.build (datoteka); Filtar niza = "// * [@ tutId = '" + id + "']"; XPathFactory xFactory = XPathFactory.instance (); XPathExpression expr = xFactory.compile (filter, Filters.element ()); Čvor popisa = expr.evaluate (dokument);

Opet, ovdje u kodu iznad imamo a SAXBuilder stvaranje a Dokument primjer iz dane datoteke. Dohvaćamo element po njegovom tutId atribut prosljeđivanjem XPath izraz na XPathFactory koje pruža JDOM2.

6. STAX

Sada ćemo vidjeti kako bismo mogli dohvatiti sve elemente iz našeg korijenskog elementa pomoću API Stax. Stax je uključen u JDK od Jave 6, tako da ne trebate dodavati nikakve ovisnosti.

Prvo, moramo stvoriti Vodič razred:

udžbenik za javni razred {private String tutId; tip privatnog niza; privatni naslov niza; opis privatnog niza; privatni datum niza; privatni autor niza; // standardni geteri i postavljači}

i tada smo spremni slijediti:

Popis tutorijala = novi ArrayList (); XMLInputFactory tvornica = XMLInputFactory.newInstance (); XMLEventReader eventReader = factory.createXMLEventReader (novi FileReader (this.getFile ())); Struka vodiča; while (eventReader.hasNext ()) {XMLEvent event = eventReader.nextEvent (); switch (event.getEventType ()) {case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement (); Niz qName = startElement.getName (). GetLocalPart (); ... pauza; case XMLStreamConstants.CHARACTERS: Znakovi znakovi = event.asCharacters (); ... pauza; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement (); // provjeravamo jesmo li pronašli element za zatvaranje // zatvori resurse koje treba izričito zatvoriti break; }}

U gornjem primjeru, da bismo nam pomogli da dođemo do podataka, trebali smo stvoriti klasu u koju ćemo pohraniti preuzete podatke.

Da bismo pročitali dokument, proglasili smo ono što se naziva upravljačima događajima i koristili smo ih za navigaciju kroz naš dokument. Imajte na umu da implementacije SAX-a ne pružaju dvosmjernu navigaciju. Kao što ovdje možete vidjeti, puno je posla potrebno obaviti samo za pronalaženje jednostavnog popisa elemenata.

7. JAXB

JAXB je uključen u JDK, kao i Xerces, i za ovaj vam nije potrebna dodatna ovisnost.

Vrlo je jednostavno učitati, stvoriti i manipulirati informacijama iz XML datoteka pomoću JAXB.

Samo trebamo stvoriti ispravne java entitete koji će povezati XML i to je to.

JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); Tutoriali tutoriali = (Tutoriali) jaxbUnmarshaller.unmarshal (this.getFile ());

U gornjem primjeru učitavamo svoj XML datoteku u naš objekt i odatle možemo sve obrađivati ​​kao normalnu Java strukturu;

Da biste stvorili novi dokument, jednostavno je kao i čitati ga, ali obrnuto, kao u donjem kodu.

Prvo, izmijenit ćemo svoj Vodič razred dodati JAXB bilješke na geteri i postavljači:

udžbenik za javnu klasu {... public String getTutId () {return tutId; } @XmlAttribute javna praznina setTutId (String tutId) {this.tutId = tutId; } ... @XmlElement javna praznina setTitle (naslov niza) {this.title = title; } ...} @XmlRootElement Vodiči za javnu klasu {tutorial za privatni popis; // standardni getteri i postavljači s oznakom @XmlElement}

S @XmlRootElement definiramo koji će objekt predstavljati korijenski čvor našeg dokumenta i zatim koristimo @XmlAttribute ili @XmlElement da definira predstavlja li taj atribut atribut čvora ili element dokumenta.

Tada možemo pratiti sa:

Tutoriali tutoriali = novi Tutoriali (); tutorials.setTutorial (novi ArrayList ()); Tutorial tut = novi Tutorial (); tut.setTutId ("01"); ... tutorials.getTutorial (). add (tut); JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller (); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, istina); jaxbMarshaller.marshal (vodiči, datoteka);

Kao što vidite, vezivanje XML datoteke s Java objektima najlakši je način rada s ovakvim datotekama.

8. Podrška za XPath Expression

Da bismo stvorili složene XPath izraze, možemo koristiti Jaxen. Ovo je biblioteka XPath s otvorenim kodom prilagodljiva mnogim različitim objektnim modelima, uključujući DOM, XOM, DOM4J, i JDOM.

Možemo stvoriti XPath izraze i kompajlirati ih prema mnogim podržanim dokumentima.

String izraz = "/ tutoriali / tutorial"; XPath put = novi DOMXPath (izraz); Popis rezultata = path.selectNodes (xmlDocument);

Da bismo uspjeli, morat ćemo dodati ovu ovisnost u naš projekt.

9. Zaključak

Kao što vidite, postoji mnogo mogućnosti za rad s XMLovisno o zahtjevima vaše aplikacije, mogli biste raditi s bilo kojim od njih ili ćete možda morati birati između učinkovitosti i jednostavnosti.

Cjelovite radne uzorke za ovaj članak možete pronaći u našem git spremištu ovdje.