Chủ Nhật, 3 tháng 8, 2014

Using NodeIterator for Reading XML File

Tạo một project với tên là ListArtist. Tiếp đó tạo một file xml như dưới:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>

</CATALOG>


Sau đó ta code ở lớp chứa hàm main như dưới:


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package listartist;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;

/**
 *
 * @author Nguyen Minh An
 */
public class ListArtist {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            //Create Builder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            if (!builder.getDOMImplementation().hasFeature("traversal", "2.0")) {
                System.out.println("Traversal 2.0 is required");
                System.exit(-1);
            }

            Document document = builder.parse(new File("D:\\NetBean\\ListArtist\\src\\cd_catalog.xml"));
            DocumentTraversal traversal = (DocumentTraversal) document;
            
            NodeIterator iterator = traversal.createNodeIterator(document, NodeFilter.SHOW_ALL, null, true);
            
            Node currentNode = iterator.nextNode();
            
            while (currentNode != null) {                
                if (currentNode.getNodeName().equals("ARTIST")) {
                    System.out.println(currentNode.getTextContent());
                }
                currentNode = iterator.nextNode();
            }
            
            
            
            
        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(ListArtist.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

}

Source Code

Practice_Assignment 6.


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package module6;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

/**
 *
 * @author Nguyen Minh An
 */
public class Module6 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            if (!builder.getDOMImplementation().hasFeature("traversal", "2.0")) {
                System.out.println("Traversal 2.0 is required");
                System.exit(-1);
            }

            Document document = builder.parse(new File("D:\\NetBean\\Module6\\src\\Employee.xml"));

            DocumentTraversal traversal = (DocumentTraversal) document;
            TreeWalker tw = traversal.createTreeWalker(document, NodeFilter.SHOW_ALL, null, true);
            
            Node node = tw.nextNode();
            
            while (node != null) {                
                if ("Name".equals(node.getNodeName())) {
                    System.out.println(node.getTextContent());
                }
                if ("Address".equals(node.getNodeName())) {
                    System.out.println(node.getTextContent());
                }
                node = tw.nextNode();
            }
            
        } catch (SAXException ex) {
            Logger.getLogger(Module6.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Module6.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Module6.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


}





Overview Of Dom Level 2

I. Nội dung.

- Sơ lược về DOM 2?

- Các specification của DOM 2.

II. Chi tiết

1. DOM 2.

- DOM 2 là phiên bản thứ 2 được xây dựng từ DOM 1 và mang theo nhiều điểm tiện ích của DOM 1 cũng như cải thiện các nhược điểm của DOM 1.

- DOM 2 có 6 specification

2. Các specification của DOM 2.

1. Core Module.

- Mô đun này định nghĩa một tập hợp các đối tượng và interface để truy cập và điều khiển phân tích nội dung file XML.

- Từ core Module người ta đã xây dựng nên các Module khác để có thể làm việc dễ dàng và linh hoạt hơn.

2. Các module.

a. Traversal.

- Giúp cho việc di chuyển trên cây một cách dễ dàng.

b. Range.

- Giúp chúng ta cắt ra một đoạn trong XML.

c. Events.

- Giúp sử lý các event trong quá trình làm việc với XML.

d. View, Html, Style

- Các module này phục vụ cho việc làm việc bên phía client side.

3. Các interface của Core và Range

a. Các interface của Core

- DOCImplementation.

- DocumentFragment.

- Document.

- NodeList.

- Attr.

- Element.

b. Các interface của Range.

- Range.

- DocumentRange.

4. Event Module

a. Định nghĩa.

Module này là một tuỳ chọn trong đặc tính và phụ thuộc Core Module để thực thi các hàm của nó.

b. Các event được định nghĩa trong Event Module.

- HTML Events.

- User Interfces Events.

- Mouse Events.

- Mutation Events.

5. Travelsal Module.

- Traversal module cho phép traversing DOM Tree để truy cập nội dung bên trong nó.

- Module này chứa TreeWalker, NodeIterator, NodeFilter để dễ dàng traversal qua nội dung của tài liệu.

6. Css Module.

- Là một optional module trong DOM.

- Nó định nghĩa các interfaces để cung cấp một cơ chế để truy cập và điều khiển tài liệu css một cách linh động.

- Các interface của nó:

+ CSS Style Sheet

+ CSS Rule List.

+ CSS Hedia Rule.

+ CSS Style Declaration.

Nhận xét
Với các module của DOM 2 và các interfaces của những module đó ta có thể làm việc với tài liệu một cách thực sự dễ dàng.

DOM 2 trang bị các công cụ thực sự mạnh mẽ trong việc truy xuất, đọc và làm việc với tài liệu XML.


Thứ Bảy, 2 tháng 8, 2014

Manipulate DOM Tree

I. Các nội dung chính.

1. Notes.
2. Các APIs để tìm đến một item trong một XML Document.
3. Các APIs để thay đổi nội dung của một XML Document.

II. Chi tiết.

1. Notes.
- Các Node khác nhau trong một DOM Tree là:

+ Document.

+ Document Fragment.

+ Document Type.

+ Processing Instruction.



- Tạo một Node.

Ta có thể dùng đối tượng Document để tạo một node mới và gắn nó vào bất kì vị trí nào mà ta muốn gắn bằng 2 phương thức này:

            document.createElement(String);
            document.createElementNS(String1,String2)

- Thay đổi Node.

Node interface cung cấp các phương thức cho việc thay đổi một DOM Tree.

+ getParentNode();               lấy về node cha của node hiện thời.
+ getChildNoes();                  lấy về các node con của node hiện thời.
+ insertBefore();                     chèn vào trước node hiện thời một node mới.
+ replaceChild();                    thay thế một node con nào đó của node hiện thời.
+ removeChild();                    xoá bỏ node con của node hiện thời.
+ appendChild();                    thêm vào cuối nhất một node mới so với node hiện thời.

- Tìm đến một Node nào đó.

+ getParentNode()........................... Lấy về node cha của node hiện thời

+ getChildNoes()...............................Lấy về các node con của node hiện thời.

+ getFirstChild().................................Lấy về node con đầu tiên so với node hiện thời.

+ getLastChild()..................................Lấy về node cuối cùng so với node hiện thời.

+getNodeName..................................Lấy về tên của node.

- Tìm đến một Element.

+ getElementByTagName().....................................Lấy về element qua tên.

+ getElementByTagNameNS(ns,name).................Lấy về danh sách của tất cả các elements cùng với tên được chỉ định và namespace.

+ getTagName().........................................................Lấy về tên của thẻ.

+ getAttributeNode.....................................................Lấy về giá trị của thuộc tính của node.

- Thay đổi tài liệu.

Interface Document cung cấp 2 phương thức để thay đổi một tài liêu là:

+ createDocumentFragment().
+ ceateCDATASection().

- Thay đổi một element hay một thuộc tính (Attribute).

+ removeAttribute()..............Xoá bỏ thuộc tính.

+ removeAttributeNode......Xoá bỏ thuộc tính của một Node.

+ setAttributeNode()............Cài thuộc tính cho node.

+ setValue().

+setNodeValue..................Cài giá trị cho Node.


Demo.


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package usingdom;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Nguyen Minh An
 */
public class UsingDOM {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Document d = createDocument();
        saveToXmlFile(d, "D:\\NetBean\\UsingDOM\\src\\user.xml");
        //read("D:\\NetBean\\UsingDOM\\src\\user.xml");
        deleteNode("D:\\NetBean\\UsingDOM\\src\\user.xml");
    }

    private static Document createDocument() {
        try {
            //Create Document
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element root = document.createElement("users");
            document.appendChild(root);
            for (int i = 0; i < 10; i++) {
                //tao ra mot the element
                Element user = document.createElement("user");

                //tao ra the con la username
                Element username = document.createElement("username");
                //
                username.appendChild(document.createTextNode("user" + i));

                Element password = document.createElement("password");
                password.appendChild(document.createTextNode("pw" + i));

                String is = "" + i;

                user.setAttribute("id", is);
                //user.setTextContent("Tao la an");
                //user.setNodeValue("ha ha ha");
                //user.appendChild(document.createTextNode("textnode"));

                user.appendChild(username);
                user.appendChild(password);
                root.appendChild(user);
            }

            return document;
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(UsingDOM.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    private static void saveToXmlFile(Document document, String fileName) {

        try {
            //Building transformer
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();

            StreamResult result = new StreamResult(fileName);
            DOMSource source = new DOMSource(document);

            transformer.transform(source, result);
        } catch (TransformerException ex) {
            System.out.println("Khong loi");
        }
    }

    private static void update(String fileName) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder parser = factory.newDocumentBuilder();
            Document document = parser.parse(fileName);
            Node root = document.getFirstChild();

            //Create a node of user
            Element element = document.createElement("user");
            element.setAttribute("username", "c1010i");
            element.setAttribute("password", "c1010i");
            element.setAttribute("roles", "admin");
            root.appendChild(element);
            //saveToXmlFile(document, "updated " + fileName);
        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(UsingDOM.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     *
     * @param fileName
     */
    private static void deleteNode(String fileName) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder parser = factory.newDocumentBuilder();
            Document document = parser.parse(fileName);
            //Locate the node to delete
            NodeList nodeList = document.getElementsByTagName("user");
            Node node = null;
            for (int i = 0; i < nodeList.getLength(); i++) {

                if ("5".equals(nodeList.item(i).getAttributes().getNamedItem("id").getNodeValue())) {
                
                    node = nodeList.item(i);
                    break;
                }
            }
            Node parentNode = node.getParentNode();
            parentNode.removeChild(node);

            saveToXmlFile(document, "deleted " + fileName);
        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(UsingDOM.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static boolean read(String filename) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(filename);

            NodeList usernames = document.getElementsByTagName("user");

            for (int i = 0; i < usernames.getLength(); i++) {
                System.out.println(usernames.item(i).getNodeName());
                System.out.println(usernames.item(i).getAttributes().getNamedItem("id").getNodeValue());
            }
            return true;

        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(UsingDOM.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

}


Module1_Practice

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package module1_jaxp;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Nguyen Minh An
 */
public class Module1_JAXP {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Document document = createStudentFile();
        boolean res = saveToFile(document, "D:\\NetBean\\Module1_JAXP\\src\\student.xml");
        if (res == true) {
            System.out.println("ok");
        } else {
            System.out.println("error");
        }
        System.out.println(count());
    }

    public static int count() {
        int count = 0;
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document document = builder.parse("D:\\NetBean\\Module1_JAXP\\src\\student.xml");
            NodeList nl = document.getElementsByTagName("Student");
            for (int i = 0; i < nl.getLength(); i++) {
                count++;
            }
            return count;
        } catch (SAXException ex) {
            Logger.getLogger(Module1_JAXP.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Module1_JAXP.class.getName()).log(Level.SEVERE, null, ex);

        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Module1_JAXP.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }

    public static boolean saveToFile(Document document, String filename) {
        try {
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();

            StreamResult sr = new StreamResult(filename);
            DOMSource ds = new DOMSource(document);

            transformer.transform(ds, sr);
            return true;
        } catch (TransformerException ex) {
            Logger.getLogger(Module1_JAXP.class.getName()).log(Level.SEVERE, null, ex);

        }
        return false;
    }

    public static Document createStudentFile() {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element root = document.createElement("StudentList");
            document.appendChild(root);
            for (int i = 0; i < 20; i++) {
                Element student = document.createElement("Student");

                Element name = document.createElement("Name");
                name.appendChild(document.createTextNode("nguyen van" + i));

                student.appendChild(name);
                root.appendChild(student);
            }

            return document;
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Module1_JAXP.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }


}

source code

Practise_Module4.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package module_4;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Nguyen Minh An
 */
public class Module_4 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Document document = createStudentFile();
        boolean res = saveToFile(document, "D:\\NetBean\\Module_4\\src\\Employee.xml");
        if (res) {
            System.out.println("Thanh cong");
        } else {
            System.out.println("Loi");
        }
        getName("D:\\NetBean\\Module_4\\src\\Employee.xml");

    }

    public static boolean saveToFile(Document document, String filename) {
        try {
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();

            StreamResult sr = new StreamResult(filename);
            DOMSource ds = new DOMSource(document);

            transformer.transform(ds, sr);
            return true;
        } catch (TransformerException ex) {
            Logger.getLogger(Module_4.class.getName()).log(Level.SEVERE, null, ex);

        }
        return false;
    }

    public static void getName(String filename) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(filename);

            NodeList nl = document.getElementsByTagName("Name");

            for (int i = 0; i < nl.getLength(); i++) {
                //String name = nl.item(i).getAttributes().getNamedItem("Address").getNodeValue();
                //System.out.println(name);    //list.add(name);
                //System.out.println(nl.item(i).getNodeValue());
                System.out.println(nl.item(i).getTextContent());
            }
            

        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(Module_4.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    public static Document createStudentFile() {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element root = document.createElement("EmployeeList");
            document.appendChild(root);
            for (int i = 0; i < 20; i++) {
                Element student = document.createElement("Employee");

                Element name = document.createElement("Name");
                name.appendChild(document.createTextNode("nguyen van" + i));

                Element diachi = document.createElement("Address");
                diachi.appendChild(document.createTextNode("address" + 1));

                student.appendChild(name);
                student.appendChild(diachi);
                root.appendChild(student);
            }

            return document;
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Module_4.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }


}




Tổng quát về DOM

I. DOM 

1. DOM là gì?

Dom là chữ viết tắt từ tiếng Anh Document Object Model ("Mô hình Đối tượng Tài liệu"), là một API (Giao diện lập trình ứng dụng). Thường thường DOM, có dạng một cây cấu trúc dữ liệu, được dùng để truy xuất các tài liệu dạng HTML và XML. Mô hình DOM độc lập với hệ điều hành và dựa theo kỹ thuật lập trình hướng đối tượng để mô tả tài liệu. (Theo wikipedia)

2. Các ưu điểm của DOM.

- Cung ứng khả năng truy cập vào nhiều tài liệu.

- DOM có khả năng quản lý các cấu trúc dữ liệu phức tạp.

- Cho phép thay đổi tài liệu.

- Cho phép nhiều phương thức truy cập vào cùng một tài liệu.

3. Các thành phần của DOM.
- DOM gồm nhiều các cái nút theo hình cây (tree format) vì vậy DOM biểu dễn các dữ liệu XML trong cùng một cách.
- ĐÓM tạo ra một "cấu trúc cây" giống như cấu trúc của file XML, bắt đầu với một node root tương đương với root element của tệp XML sẽ được biểu diễn như một cái nút và các thành phần có trong element đó sẽ là các node con.

4. Làm việc với DOM.

- Gần giống như khi làm việc với SAX thì ở DOM ta sẽ tạo ra Document Builder từ Document Builder Factory.

- Để làm việc với DOM ta có các interface của DOM trong ảnh dưới đây
.


DEMO:

Tạo mới một project với tên OverView_DOM và tạo ra một file tomcat_users.xml như dưới đây. Ở bài demo này chúng ta sẽ lấy ra số thẻ user trong file xml này.

<?xml version="1.0" encoding="UTF-8"?>

<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    
    <user password="admin" role="manager-script,admin" username="admin"/>
</tomcat-users>

Tiếp đó chúng ta code trong hàm main như dưới:

public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dbf.newDocumentBuilder();
            
            Document document = builder.parse(new File("D:\\NetBean\\Overview_DOM\\src\\tomcat-users.xml"));
            NodeList elementsByTagName = document.getElementsByTagName("user");
            
            System.out.println(elementsByTagName.getLength());
        } catch (SAXException | IOException | ParserConfigurationException ex) {
            Logger.getLogger(Overview_DOM.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

Ta cần import các class, interface sau:

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException

Đây là source code của bài demo này.



Các nhược điểm của SAX

Như chúng ta đã biết thì SAX là một công cụ rất mạnh mẽ cho phép chúng ta làm việc với các input resources nhưng nó cũng có một số các nhược điểm sau:

- Nó phải truy cập một cách tuần tự và không được phép nhảy ngay lập tức đến một điểm nào đó trong input source.

- Sẽ rất khó cho những câu lệnh tìm kiếm có độ phức tạp cao.

- Không hỗ trợ DTD.

- Không cho phép cập nhật dữ liệu trong input.

- Nó không có nhiều thông tin về Lexical (thông tin liên quan đến việc viết).

- Không hỗ trợ trình duyệt.

So sánh SAXParser & XMLReader


Giống nhau


- Cả hai đều được dùng để làm việc với file XML.

Khác nhau:

SAXParser:


- Instance được lấy ra từ phương thức SAXParserFactory.newSAXParser().

- Khi Instance được lấy ra nó có thể đủ các loại tài nguyên đầu vào như : InputStreams, Files, URLs and SAX InputSources.

-  Sử dụng mô hình "PUSH"

- Chỉ cần set up event handler, Chương trình phân tích (parser) mặc định sẽ phân tích (parse) các tài liệu xml và xử lý các sự kiện.

- Không cần phải code nhiều vì chỉ phải viết hai lớp cho việc quét và xử lý một tệp xml.

 XMLReader:


- Sử dụng mô hình "PULL"

- Các phương thức của XML Reader cho phép di chuyển qua các các "nút" để đọc.

- XMLReader cung cấp truy cập chỉ đọc và chỉ có thể quét tiếp trong một tài liệu hay một luồng input.

- Phải tạo dùng một vòng lặp để gọi các method của class XMLReader

- Có thể gọi các method của XMLReader để pull dữ liệu, giúp kiểm soát nhiều hơn và implement rõ ràng hơn so với mô hình SAX


Bài viết đã tham khảo thông tin ở 2 webpage là:
http://msdn.microsoft.com/en-us/library/system.xml.xmlreader(v=vs.110).aspx
và 
http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParser.html