XML-fájlok használata Java-ban a DOM-elemzés segítségével

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk, hogyan elemezzük a DOM-ot az Apache Xerces programmal - egy érett és bevált könyvtár az XML elemzéséhez / manipulálásához.

Az XML-dokumentum elemzésének több lehetősége van; ebben a cikkben a DOM elemzésére koncentrálunk. A DOM-elemző betölt egy dokumentumot, és létrehoz egy teljes hierarchikus fát a memóriában.

A Java XML könyvtárak támogatásának áttekintéséhez olvassa el előző cikkünket.

2. Dokumentumunk

Kezdjük azzal a XML dokumentummal, amelyet a példánkban használunk:

   Guava Bevezetés Guava 2016.04.04. GuavaAuthor ... 

Ne feledje, hogy dokumentumunknak van egy „oktatóanyagok” nevű gyökércsomópontja 4 „oktató” gyermek csomóponttal. Mindegyiknek két attribútuma van: „tutId” és „type”. Ezenkívül minden „oktatóanyagnak” 4 gyermekcsomópontja van: „cím”, „leírás”, „dátum” és „szerző”.

Most folytathatjuk a dokumentum elemzését.

3. XML fájl betöltése

Először is meg kell jegyeznünk az Apache Xerces könyvtár a JDK-val van csomagolva, így nincs szükségünk további beállításokra.

Ugorjunk rögtön az XML fájlunk betöltésébe:

DocumentBuilder builder = DocumentBuilderFactory.newInstance (). NewDocumentBuilder (); Dokumentum doc = builder.parse (új Fájl ("src / test / resources / example_jdom.xml"); doc.getDocumentElement (). normalizálja ();

A fenti példában először megkapjuk a DocumentBuilder osztály, majd használja a elemzés () metódus az XML dokumentumon a Dokumentum azt képviselő tárgy.

Használnunk kell a normalizálás () módszer annak biztosítására, hogy a dokumentum hierarchiáját ne befolyásolják a csomópontokon belüli további fehér szóközök vagy új sorok.

4. A DOM elemzése

Most vizsgáljuk meg az XML fájlunkat.

Kezdjük az összes elem beolvasásával a „tutorial” címkével. Ezt megtehetjük a getElementsByTagName () metódus, amely a NodeList:

@Test public void whenGetElementByTag_thenSuccess () {NodeList nodeList = doc.getElementsByTagName ("oktatóanyag"); Node first = nodeList.item (0); assertEquals (4, nodeList.getLength ()); assertEquals (Node.ELEMENT_NODE, first.getNodeType ()); assertEquals ("tutorial", first.getNodeName ()); }

Fontos megjegyezni Csomópont a DOM-összetevők elsődleges adattípusa. Az összes elem, attribútum, szöveg csomópontnak számít.

Ezután nézzük meg, hogyan tudjuk megszerezni az első elem attribútumait getAttributes ():

@Test public void whenGetFirstElementAttributes_thenSuccess () {Node first = doc.getElementsByTagName ("tutorial"). Item (0); NamedNodeMap attrList = first.getAttributes (); assertEquals (2, attrList.getLength ()); assertEquals ("tutId", attrList.item (0) .getNodeName ()); assertEquals ("01", attrList.item (0) .getNodeValue ()); assertEquals ("type", attrList.item (1) .getNodeName ()); assertEquals ("java", attrList.item (1) .getNodeValue ()); }

Itt megkapjuk a NamedNodeMap objektumot, majd használja a elem (index) módszer az egyes csomópontok lekéréséhez.

Minden csomópontra használhatjuk getNodeName () és getNodeValue () hogy megtalálják attribútumaikat.

5. Traversing Nodes

Ezután nézzük meg, hogyan lehet áthaladni a DOM csomópontokon.

A következő tesztben bejárjuk az első elem gyermekcsomópontjait, és kinyomtatjuk azok tartalmát:

@Test public void whenTraverseChildNodes_thenSuccess () {Első csomópont = doc.getElementsByTagName ("oktatóanyag"). Elem (0); NodeList nodeList = first.getChildNodes (); int n = nodeList.getLength (); Csomópont áram; mert (int i = 0; i

Először megkapjuk a NodeList használni a getChildNodes () metódust, majd iteráljon rajta, és nyomtassa ki a csomópont nevét és szöveges tartalmát.

A kimenet megmutatja a dokumentumunk első „bemutató” elemének tartalmát:

cím: Guava leírása: Bevezetés a Guava dátumba: 2016.04.04. szerző: GuavaAuthor

6. A DOM módosítása

Változtathatunk a DOM-on is.

Példaként változtassuk meg a típus attribútum „java” -ról „egyéb” -re:

@Test public void whenModifyDocument_thenModified () {NodeList nodeList = doc.getElementsByTagName ("oktatóanyag"); Először = (Elem) nodeList.item (0); assertEquals ("java", first.getAttribute ("type")); first.setAttribute ("type", "other"); assertEquals ("egyéb", first.getAttribute ("típus")); }

Itt az attribútum értékének megváltoztatása egyszerű feladat az Elem’S setAttribute () módszer.

7. Új dokumentum létrehozása

A DOM módosítása mellett új XML dokumentumokat is létrehozhatunk a semmiből.

Először nézzük meg a létrehozni kívánt fájlt:

   [e-mail védett] 

XML-fájlunk a felhasználók gyökércsomópont egy felhasználó elem, amelynek gyermekcsomópontja is van email.

Ennek eléréséhez először a Építész’S newDocument () metódus, amely a Dokumentum tárgy.

Aztán felhívjuk a createElement () az új objektum metódusa:

@Test public void whenCreateNewDocument_thenCreated () dobja a Kivételt {Document newDoc = builder.newDocument (); Elemgyökér = newDoc.createElement ("felhasználók"); newDoc.appendChild (root); Első az első = newDoc.createElement ("felhasználó"); root.appendChild (első); first.setAttribute ("id", "1"); Elem e-mail = newDoc.createElement ("e-mail"); email.appendChild (newDoc.createTextNode ("[e-mail védett]")); first.appendChild (e-mail); assertEquals (1, newDoc.getChildNodes (). getLength ()); assertEquals ("felhasználók", newDoc.getChildNodes (). item (0) .getNodeName ()); }

Minden elem hozzáadásához a DOM-hoz hívjuk a appendChild () módszer.

8. Dokumentum mentése

Miután módosította a dokumentumunkat, vagy létrehozott egyet a semmiből, fájlba kell mentenünk.

Kezdjük a. Létrehozásával DOMSource objektumot, majd használjon egyszerű Transzformátor a dokumentum fájlba mentéséhez:

private void saveDomToFile (Dokumentumdokumentum, String fájlNév) dobja a {DOMSource dom = új DOMSource (dokumentum) kivételt; Transzformátor transzformátor = TransformerFactory.newInstance () .newTransformer (); StreamResult eredmény = új StreamResult (új fájl (fájlnév)); transzformátor.transzform (dom, eredmény); }

Hasonlóképpen kinyomtathatjuk dokumentumunkat a konzolon:

private void printDom (Document document) dobja a {DOMSource dom = new DOMSource (document) kivételt; Transzformátor transzformátor = TransformerFactory.newInstance () .newTransformer (); transzformátor.transform (dom, új StreamResult (System.out)); }

9. Következtetés

Ebben a rövid cikkben megtanultuk, hogyan használhatjuk az Xerces DOM elemzőt egy XML dokumentum létrehozására, módosítására és mentésére.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.