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;
    }


}




Không có nhận xét nào:

Đăng nhận xét