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. 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. 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. 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. 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: A fenti példában az összes elemet nagyon egyszerű módon kapjuk le a gyökérelemből, ahogyan ezt megtehetjük DOM4J: 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. 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: és akkor készek vagyunk követni: 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. 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. 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: 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: Mint látható, az XML fájl Java objektumokhoz kötése a legegyszerűbb módszer az ilyen fájlok kezelésére. Ö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. Ahhoz, hogy működjön, hozzá kell adnunk ezt a függőséget a projektünkhöz. 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.SAXReader olvasó = új SAXReader (); Dokumentumdokumentum = olvasó.olvasott (fájl); Lista elemek = document.selectNodes ("// * [@ tutId = '" + id + "']"); return elements.get (0);
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 ();
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 ();
5. JDOM
SAXBuilder builder = új SAXBuilder (); Dokumentum doc = builder.build (this.getFile ()); Elem oktatóanyagok = doc.getRootElement (); Címek felsorolása = tutorials.getChildren ("tutorial");
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);
6. StAX
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}
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; }}
7. JAXB
JAXBContext jaxbContext = JAXBContext.newInstance (oktatóanyagok.osztály); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); Oktatóanyagok oktatóanyagok = (oktatóanyagok) jaxbUnmarshaller.unmarshal (this.getFile ());
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}
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);
8. XPath Expression támogatás
Karakterlánc-kifejezés = "/ tutorials / tutorial"; XPath path = new DOMXPath (kifejezés); Lista eredménye = path.selectNodes (xmlDocument);
9. Következtetés