22/09/2018, 18:50

Java DOM Parser – đọc, tạo, sửa tài liệu XML

PHP Mô hình đối tượng tài liệu (DOM) là một đề xuất chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một giao diện cho phép các chương trình truy cập và cập nhật kiểu dáng, cấu trúc và nội dung của các tài liệu XML. Các trình phân tích cú pháp XML hỗ trợ DOM thực hiện ...

PHP

Mô hình đối tượng tài liệu (DOM) là một đề xuất chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một giao diện cho phép các chương trình truy cập và cập nhật kiểu dáng, cấu trúc và nội dung của các tài liệu XML. Các trình phân tích cú pháp XML hỗ trợ DOM thực hiện giao diện này.

Khi nào nên sử dụng?

Bạn nên sử dụng trình phân tích cú pháp DOM khi:

  • Bạn cần phải biết rất nhiều về cấu trúc của một tài liệu.
  • Bạn cần di chuyển các phần của tài liệu XML xung quanh (ví dụ: bạn có thể muốn sắp xếp các phần tử nhất định).
  • Bạn cần sử dụng thông tin trong một tài liệu XML nhiều lần.

Bạn nhận được những gì?

Khi bạn phân tích cú pháp một tài liệu XML bằng trình phân tích cú pháp DOM, bạn lấy lại cấu trúc cây chứa tất cả các phần tử của tài liệu của bạn. DOM cung cấp nhiều chức năng mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu.

Ưu điểm

DOM là một giao diện chung để thao tác các cấu trúc tài liệu. Một trong những mục tiêu thiết kế của nó là mã Java được viết cho một trình phân tích cú pháp tuân thủ DOM sẽ chạy trên bất kỳ trình phân tích cú pháp tuân thủ DOM nào khác mà không phải thực hiện bất kỳ sửa đổi nào.

DOM interface

DOM định nghĩa một số interface. Dưới đây là các interface phổ biến nhất:

  • Node: Kiểu dữ liệu cơ bản của DOM.
  • Element: Phần lớn các đối tượng bạn sẽ xử lý là Elements.
  • Attr: Biểu diễn một thuộc tính của một phần tử.
  • Text: Nội dung thực tế của Element hoặc Attr.
  • Document: Biểu diễn toàn bộ tài liệu XML. Một đối tượng Document thường được gọi là cây DOM.

Các phương thức DOM phổ biến

Khi bạn làm việc với DOM, có một số phương thức bạn sẽ sử dụng thường xuyên:

  • Document.getDocumentElement(): Trả về phần tử gốc của tài liệu.
  • Node.getFirstChild(): Trả về con đầu tiên của một Node đã cho.
  • Node.getLastChild(): Trả về con cuối của một Node đã cho.
  • Node.getNextSibling(): Phương thức này trả về sibling (anh em) tiếp theo của một Node đã cho.
  • Node.getPreviousSibling(): Phương thức này trả về sibling trước của một Node đã cho.
  • Node.getAttribute(attrName): Đối với một Node đã cho, nó trả về thuộc tính với tên được yêu cầu attrName.

Các bước để sử dụng DOM

Sau đây là các bước được sử dụng trong khi phân tích cú pháp một tài liệu bằng cách sử dụng DOM Parser.

  • import các gói liên quan đến XML.
  • Tạo đối tượng DocumentBuilder.
  • Tạo đối tượng Document từ một file hoặc stream.
  • Trích xuất phần tử gốc.
  • Kiểm tra thuộc tính.
  • Kiểm tra các phần tử con.

import các gói liên quan đến XML.

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

Tạo đối tượng DocumentBuilder.

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

Tạo đối tượng Document từ một file hoặc stream.

Tạo đối tượng Document từ một file:

Document doc = dBuilder.parse(inputFile);

Tạo đối tượng Document từ một stream:

StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version="1.0"?> <class> </class>");
ByteArrayInputStream input = new ByteArrayInputStream(
   xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);

Trích xuất phần tử gốc.

Element root = document.getDocumentElement();

Kiểm tra thuộc tính.

//trả về thuộc tính cụ thể
getAttribute("attributeName");

//trả về một Map (table) của các cặp name/value
getAttributes();

Kiểm tra các phần tử con.

//trả về một list của phần tử con của tên được chỉ định
getElementsByTagName("subelementName");

//trả về list tất cả các node con
getChildNodes();

Sử dụng Java DOM – Đọc tài liệu XML

Ví dụ: phân tích tập tin XML có nội dung như sau:

<?xml version = "1.0"?>
<class>
   <student rollno = "1">
      <firstname>Vinh</firstname>
      <lastname>Phan</lastname>
      <marks>85</marks>
   </student>
   
   <student rollno = "2">
      <firstname>Hoa</firstname>
      <lastname>Nguyen</lastname>
      <marks>95</marks>
   </student>
   
   <student rollno = "3">
      <firstname>Phu</firstname>
      <lastname>Tran</lastname>
      <marks>90</marks>
   </student>
</class>

File DOMExample.java

package vn.viettuts.javaxml;

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

public class DOMExample {
    public static void main(String[] args) {

        try {
           // đọc file input.xml
           File inputFile = new File("D:\xml\intput.xml");
           DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
           DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
           Document doc = dBuilder.parse(inputFile);
           doc.getDocumentElement().normalize();
           
           // in phần tử gốc ra màn hình
           System.out.println("Phần tử gốc:" 
                   + doc.getDocumentElement().getNodeName());
           
           // đọc tất cả các phần tử có tên thẻ là "student"
           NodeList nodeListStudent = doc.getElementsByTagName("student");
           System.out.println("----------------------------");
           
           // duyệt các phần tử student
           for (int i = 0; i < nodeListStudent.getLength(); i++) {
              Node nNode = nodeListStudent.item(i);
              System.out.println("
Phần tử hiện tại: " + nNode.getNodeName());
              
              // đọc các thuộc tính của student
              if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                 Element eElement = (Element) nNode;
                 System.out.println("Student roll no: " 
                         + eElement.getAttribute("rollno"));
                 System.out.println("First Name: " 
                         + eElement.getElementsByTagName("firstname").item(0)
                             .getTextContent());
                 System.out.println("Last Name: " 
                         + eElement.getElementsByTagName("lastname").item(0)
                             .getTextContent());
                 System.out.println("Marks: " 
                         + eElement.getElementsByTagName("marks").item(0)
                             .getTextContent());
              }
           }
        } catch (Exception e) {
           e.printStackTrace();
        }
     }
}

Kết quả:

Phần tử gốc:class
----------------------------

Phần tử hiện tại: student
Student roll no: 1
First Name: Vinh
Last Name: Phan
Marks: 85

Phần tử hiện tại: student
Student roll no: 2
First Name: Hoa
Last Name: Nguyen
Marks: 95

Phần tử hiện tại: student
Student roll no: 3
First Name: Phu
Last Name: Tran
Marks: 90

Sử dụng Java DOM – Tạo tài liệu XML

Sử dụng Java DOM – Sửa tài liệu XML

PHP
0