Bekerja dengan Fail XML di Java Menggunakan DOM Parsing

1. Gambaran keseluruhan

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

Terdapat banyak pilihan untuk menghuraikan dokumen XML; kami akan menumpukan pada penghuraian DOM dalam artikel ini. Penghurai DOM memuatkan dokumen dan membuat keseluruhan pokok hierarki dalam ingatan.

Untuk gambaran keseluruhan sokongan perpustakaan XML di Java, lihat artikel kami sebelumnya.

2. Dokumen Kami

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

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

Perhatikan bahawa dokumen kami mempunyai simpul akar yang disebut "tutorial" dengan 4 simpul anak "tutorial". Masing-masing mempunyai 2 atribut: "tutId" dan "type". Juga, setiap "tutorial" memiliki 4 simpul anak: "judul", "keterangan", "tanggal" dan "pengarang".

Sekarang kita boleh meneruskan penghuraian dokumen ini.

3. Memuatkan Fail XML

Pertama, kita harus perhatikan bahawa perpustakaan Apache Xerces dikemas dengan JDK , jadi kita tidak memerlukan persediaan tambahan.

Mari terus memuatkan fail XML kami:

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 memperoleh contoh kelas DocumentBuilder , kemudian menggunakan kaedah parse () pada dokumen XML untuk mendapatkan objek Dokumen yang mewakilinya.

Kami juga perlu menggunakan kaedah normalisasi () untuk memastikan bahawa hierarki dokumen tidak dipengaruhi oleh ruang putih tambahan atau garis baru dalam nod.

4. Menghuraikan DOM

Sekarang, mari kita terokai fail XML kami.

Mari mulakan dengan mengambil semua elemen dengan tag "tutorial". Kita boleh melakukannya menggunakan kaedah 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 bahawa Node adalah jenis data utama untuk komponen DOM . Semua elemen, atribut, teks dianggap simpul.

Seterusnya, mari kita lihat bagaimana kita boleh 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 , kemudian gunakan kaedah item (indeks) untuk mengambil setiap nod.

Untuk setiap node, kita dapat menggunakan getNodeName () dan getNodeValue () untuk mencari atributnya.

5. Nod Melintasi

Seterusnya, mari kita lihat cara melintasi nod DOM.

Dalam ujian berikut, kami akan melintasi nod anak elemen pertama dan mencetak kandungannya:

@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.