Archive

Archive for the ‘Java XML’ Category

Đọc file XML trong Java ( DOM XML Parser )

Bài viết hướng dẫn cách đọc một file XML thông qua DOM XML Parser.

DOM Parser phân tích toàn bộ tài liệu XML và tải nó vào bộ nhớ, sau đó mô hình nó thành cấu trúc cây để dễ dàng di chuyển hoặc thao tác từng node. Trong DOM, mọi thứ trong một tài liệu XML là một node.

Lưu ý : DOM Parser là chậm và tốn nhiều bộ nhớ khi nó tải một tài liệu XML chứa quá nhiều dữ liệu. Sử dụng SAX Parser sẽ nhanh hơn và tốn ít bộ nhớ hơn DOM Parser.

0. File XML mẫu books.xml :

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
   </book>
</catalog>

1. Ví dụ sử dụng DOM XML :

Ví dụ sau sẽ minh họa cách lấy một node bằng “name” và hiển thị “value”

package quyetdv.java.javaxml.dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile1 {

    public static void main(String[] args) {
        try {
            File xmlFile = new File("books.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);

            doc.getDocumentElement().normalize();

            System.out.println("Root element : "
                    + doc.getDocumentElement().getNodeName());

            NodeList nList = doc.getElementsByTagName("book");

            System.out.println("-------------------------");

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                System.out
                        .println("\nCurrent Element : " + nNode.getNodeName());
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;

                    System.out.println("Book id : "
                            + eElement.getAttribute("id"));
                    System.out.println("Author : "
                            + eElement.getElementsByTagName("author").item(0)
                                    .getTextContent());
                    System.out.println("Title : "
                            + eElement.getElementsByTagName("title").item(0)
                                    .getTextContent());
                    System.out.println("Genre : "
                            + eElement.getElementsByTagName("genre").item(0)
                                    .getTextContent());
                    System.out.println("Price : "
                            + eElement.getElementsByTagName("price").item(0)
                                    .getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Kết quả :

ReadXMLFile1

2. Lặp qua các Node :

Ví dụ sau sẽ đọc file books.xml và hiển thị cách lặp qua từng node, in ra tên, giá trị của node cũng như attribute nếu có.

package quyetdv.java.javaxml.dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile2 {

    public static void main(String[] args) {
        try {
            File xmlFile = new File("books.xml");
            DocumentBuilder dBuilder;

            dBuilder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();

            Document doc = dBuilder.parse(xmlFile);
            System.out.println("Root element : "
                    + doc.getDocumentElement().getNodeName());
            if (doc.hasChildNodes()) {
                printNote(doc.getChildNodes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void printNote(NodeList nodeList) {
        for (int count = 0; count < nodeList.getLength(); count++) {
            Node tempNode = nodeList.item(count);
            // make sure it's element node.
            if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
                // get node name and value
                System.out.println("\nNode Name = " + tempNode.getNodeName()
                        + " [OPEN]");
                System.out.println("Node Value = " + tempNode.getTextContent());

                if (tempNode.hasAttributes()) {
                    // get attributes names and values
                    NamedNodeMap nodeMap = tempNode.getAttributes();

                    for (int i = 0; i < nodeMap.getLength(); i++) {
                        Node node = nodeMap.item(i);
                        System.out.println("Attr name : " + node.getNodeName());
                        System.out.println("Attr value : "
                                + node.getNodeValue());
                    }
                }
                if (tempNode.hasChildNodes()) {
                    // loop again if has child nodes
                    printNote(tempNode.getChildNodes());
                }
                System.out.println("Node Name = " + tempNode.getNodeName()
                        + " [CLOSE]");
            }
        }
    }

}

Kết quả :

ReadXMLFile2

 

Categories: DOM XML Parser