Bekerja dengan File XML di Java Menggunakan DOM Parsing

1. Ikhtisar

Dalam tutorial ini, kita akan membahas cara mengurai DOM dengan Apache Xerces - pustaka yang matang dan mapan untuk mengurai / memanipulasi XML.

Ada beberapa opsi untuk mengurai dokumen XML; kami akan fokus pada penguraian DOM di artikel ini. Parser DOM memuat dokumen dan membuat seluruh pohon hierarki dalam memori.

Untuk gambaran umum tentang dukungan perpustakaan XML di Java, lihat artikel kami sebelumnya.

2. Dokumen Kami

Mari kita mulai dengan dokumen XML yang akan kita gunakan dalam contoh kita:

   Guava Introduction to Guava 04/04/2016 GuavaAuthor  ... 

Perhatikan bahwa dokumen kita memiliki simpul akar yang disebut “tutorial” dengan 4 simpul anak “tutorial”. Masing-masing memiliki 2 atribut: “tutId” dan “type”. Selain itu, setiap "tutorial" memiliki 4 node turunan: "judul", "deskripsi", "tanggal", dan "penulis".

Sekarang kita bisa melanjutkan penguraian dokumen ini.

3. Memuat File XML

Pertama, kita harus mencatat bahwa perpustakaan Apache Xerces dikemas dengan JDK , jadi kita tidak memerlukan pengaturan tambahan.

Mari langsung memuat file XML kita:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(new File("src/test/resources/example_jdom.xml")); doc.getDocumentElement().normalize();

Dalam contoh di atas, pertama-tama kita mendapatkan instance kelas DocumentBuilder , lalu menggunakan metode parse () pada dokumen XML untuk mendapatkan objek Dokumen yang mewakilinya.

Kita juga perlu menggunakan metode normalize () untuk memastikan bahwa hierarki dokumen tidak terpengaruh oleh spasi tambahan atau baris baru di dalam node.

4. Parsing DOM

Sekarang, mari jelajahi file XML kita.

Mari kita mulai dengan mengambil semua elemen dengan tag "tutorial". Kita bisa melakukan ini menggunakan metode getElementsByTagName () , yang akan mengembalikan NodeList:

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

Penting untuk diperhatikan bahwa Node adalah tipe data utama untuk komponen DOM . Semua elemen, atribut, teks dianggap sebagai node.

Selanjutnya, mari kita lihat bagaimana kita bisa mendapatkan atribut elemen pertama menggunakan 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()); }

Di sini, kita mendapatkan objek NamedNodeMap , lalu menggunakan metode item (indeks) untuk mengambil setiap node.

Untuk setiap node, kita bisa menggunakan getNodeName () dan getNodeValue () untuk menemukan atributnya.

5. Melintasi Node

Selanjutnya, mari kita lihat cara melintasi simpul DOM.

Dalam pengujian berikut, kita akan melintasi node anak elemen pertama dan mencetak kontennya:

@Test public void whenTraverseChildNodes_thenSuccess() { Node first = doc.getElementsByTagName("tutorial").item(0); NodeList nodeList = first.getChildNodes(); int n = nodeList.getLength(); Node current; for (int i=0; i
    

First, we get the NodeList using the getChildNodes() method, then iterate through it, and print the node name and text content.

The output will show the contents of the first “tutorial” element in our document:

title: Guava description: Introduction to Guava date: 04/04/2016 author: GuavaAuthor

6. Modifying the DOM

We can also make changes to the DOM.

As an example, let's change the value of the type attribute from “java” to “other”:

@Test public void whenModifyDocument_thenModified() { NodeList nodeList = doc.getElementsByTagName("tutorial"); Element first = (Element) nodeList.item(0); assertEquals("java", first.getAttribute("type")); first.setAttribute("type", "other"); assertEquals("other", first.getAttribute("type")); }

Here, changing the attribute value is a simple matter of calling an Element‘s setAttribute() method.

7. Creating a New Document

Besides modifying the DOM, we can also create new XML documents from scratch.

Let's first have a look at the file we want to create:

 [email protected] 

Our XML contains a users root node with one user element that also has a child node email.

To achieve this, we first have to call the Builder‘s newDocument() method which returns a Document object.

Then, we'll call the createElement() method of the new object:

@Test public void whenCreateNewDocument_thenCreated() throws Exception { Document newDoc = builder.newDocument(); Element root = newDoc.createElement("users"); newDoc.appendChild(root); Element first = newDoc.createElement("user"); root.appendChild(first); first.setAttribute("id", "1"); Element email = newDoc.createElement("email"); email.appendChild(newDoc.createTextNode("[email protected]")); first.appendChild(email); assertEquals(1, newDoc.getChildNodes().getLength()); assertEquals("users", newDoc.getChildNodes().item(0).getNodeName()); }

To add each element to the DOM, we're also calling the appendChild() method.

8. Saving a Document

After modifying our document or creating one from scratch, we'll need to save it in a file.

We'll start with creating a DOMSource object, then use a simple Transformer to save the document in a file:

private void saveDomToFile(Document document,String fileName) throws Exception { DOMSource dom = new DOMSource(document); Transformer transformer = TransformerFactory.newInstance() .newTransformer(); StreamResult result = new StreamResult(new File(fileName)); transformer.transform(dom, result); }

Similarly, we can print our document in the console:

private void printDom(Document document) throws Exception{ DOMSource dom = new DOMSource(document); Transformer transformer = TransformerFactory.newInstance() .newTransformer(); transformer.transform(dom, new StreamResult(System.out)); }

9. Conclusion

In this quick article, we learned how to use the Xerces DOM parser to create, modify and save an XML document.

As always, the full source code for the examples is available over on GitHub.