DOM
(Document Object Model)
GV: Vũ Đình Hồng
Khoa: CNTT – TỨD
Nội dung thuyết trình
DOM là gì?
Các phần của DOM
Lợi ích và hạn chế của DOM
Cấu trúc và các đối tượng trong DOM
XML DOM
XML DOM PARSER
Cách tạo DOM
Tạo đối tượng DOM
Duyệt qua tài liệu
Biên tập tài liệu
Ví dụ
Giới thiệu
Ứng với mỗi cấu trúc tài liệu phải có một
cách thức để truy xuất
khó phát triển ứng dụng
Cần xây dựng một thư viện tổng quát sử dụng
cho mọi tài liệu
DOM ra đời.
/>
DOM là gì?
DOM là một API( Application Programing
Interface) độc lập nền và ngơn ngữ cho phép
chương trình và script truy xuất động và cập
nhật nội dung, cấu trúc và style của tài liệu .
DOM có nhiều phiên bản: DOM Level 1, DOM
Level 2, DOM Level 3 (draft).
DOM(tt)
DOM được chia làm các phần khác nhau (Core,
XML, và HTML):
CORE DOM - định nghĩa tập các đối tượng
chuẩn cho tất cả tài liệu có cấu trúc
XML DOM - định nghĩa tập các đối tượng
chuẩn cho tài liệu XML
HTML DOM - định nghĩa tập các đối tượng
chuẩn cho tài liệu HTML
DOM(tt)
HTML DOM (Document Object Model for HTML)
HTML DOM định nghĩa tập các đối tượng chuẩn cho
HTML, và các tiêu chuẩn truy xuất và xử lý tài liệu
HTML
XML DOM (Document Object Model for XML)
XML DOM định nghĩa tập các đối tượng chuẩn cho XML,
và các tiêu chuẩn truy xuất và xử lý tài liệu XML
XML DOM cho phép đọc, tạo ra, và sửa các tài
liệu XML
Lợi ích của DOM
DOM giúp ta thao tác trên dữ liệu cây dễ dàng.
Mỗi khi load file XML lên, DOM sẽ đọc tồn bộ tài
liệu XML lên bộ nhớ chính và xây dựng một cấu
trúc cây để lưu dữ liệu vào cây đó, tạo ra DOM
Tree.
Trình phân tích DOM (DOM Parser) giúp ta có thể
truy cập vào file XML, do đó dùng DOM sẽ linh
động hơn.
Điều này có nghĩa là ta có thể thao tác bất kỳ lúc
nào khi ta muốn
Hạn chế của DOM
DOM xây dựng một cây lưu trữ của tồn văn
bản. Nếu văn bản q lớn, nó địi hỏi một số
lượng bộ nhớ rất lớn.
DOM tạo nên các chủ thể biểu đạt mọi thứ
trong văn bản gốc. Nếu bạn chỉ quan tâm tới
một phần nhỏ trong văn bản, thì sẽ vơ cùng
lãng phí.
Bộ kiểm ngữ DOM phải đọc toàn văn. Đối với
những văn bản quá lớn, điều này sẽ bị kéo dài
đáng kể.
Cấu trúc DOM
Một DOM Document là một tập của các nút, hay những
mẩu thông tin, được tổ chức trong một hệ phân cấp (biểu
đồ cây).
Hệ phân cấp này cho phép một người phát triển điều
hướng quanh biểu đồ hình cây để tìm kiếm thơng tin cụ
thể.
Phân tích cấu trúc Dom thường địi hỏi tồn bộ tài liệu
phải được nạp và hệ phân cấp cần được xây dựng trước
DOM có thể được gọi là dựa trên biểu đồ cây, hay dựa
trên đối tượng.
Các đối tượng trong DOM
Đối tượng tài liệu (xmlDocument) :
Bao gồm nhiều đối tượng thẻ dữ liệu (xmlElement)
cho phép sử dụng thẻ gốc thông qua đối tượng
DocumentElement.
Đối tượng thẻ dữ liệu (xmlElement) :
Bao gồm nhiều đối tượng thuộc tính xmlAttribute
Bao gồm nhiều đối tượng thẻ con xmlElement
Có thể có hay khơng có đối tượng giá trị xmlValue
Đối tượng thuộc tính (xmlAttribute) : Lưu trữ
thông tin trong thực tế
XML DOM
Toàn bộ tài liệu là một nút
tài liệu (document node)
Mọi thẻ XML là một nút
thẻ(element node)
Text trong trong các thẻ
XML là nút text(text node)
Mọi thuộc tính là một nút
thuộc tính (attribute node)
Ghi chú là nút ghi
chú(comment node)
<?xml version="1.0" >
<name>
<first>A</first>
<middle>Van</middle>
<last>Nguyen</last>
</name>
Name
first
A
middle
Van
last
Nguyen
XML DOM Parser
Để đọc, cập nhật, tạo và thao tác 1 tài liệu
XML ta cần 1 XML Parser
Có nhiều XML Parser được hỗ trợ trong hầu
hết các ngôn ngữ (JAVA, JavaScript, .NET, ..)
Parser nạp tài liệu XML vào trong bộ nhớ máy
tính và được xem dưới dạng cây Node
Sau đó, dữ liệu được thao tác và xử lý thông
qua tập hàm XML DOM API
XML parser là một trình phân tích để phân
tích dữ liệu từ tài liệu XML sang mơ hình
DOM để xử lý
XML DOM API
Lộ trình DOM
Sử dụng DOM để lấy dữ
liệu
Toàn bộ tài liệu XML được chuyển đổi sang mơ hình
đối tượng.
Element được chuyển thành node
Element Content tương ứng một node
Mỗi attribute tương ứng một node
Tùy theo từng loại node sẽ có cách lấy dữ liệu
tương ứng.
Sau khi mở tài liệu XML, toàn bộ tài liệu được thành
một node. Để truy xuất đến root Node có thể dùng
thuộc tính documentElement hay là firstChild.
Orders.xml
<?xml version="1.0" encoding="UTF-8" ?>
<order>
<status>PROCESSED</status>
<customerid>2341</customerid>
<amount>874.00</amount>
</order>
<order>
<status>REJECTED</status>
<customerid>251222</customerid>
<amount>200.00</amount>
</order>
</processedOrders>
Tạo đối tượng DOM
Để làm việc với thông tin trong một tệp
XML -> phân tích để tạo ra một đối
tượng Document.
1. Tạo DocumentBuilderFactory. Đối
tượng này tạo ra DocumentBuilder.
2. Tạo DocumentBuilder.
DocumentBuilder thực hiện phân tích hiện
thời để tạo ra đối tượng Document.
3. Phân tích tệp để tạo ra đối tượng
Document.
Tạo đối tượng DOM
File docFile = new File("orders.xml");
Document doc = null;
try {
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);
}
catch (Exception e) {
System.out.print("Problem parsing the file
"+e.getMessage());
System.exit(1);
}
Duyệt qua tài liệu
Lấy phần tử gốc
Lấy các nút con của một nút và duyệt qua các
nút con.
Duyệt qua tài liệu
//Lấy node gốc
Element root = doc.getDocumentElement();
System.out.println("The root element is " +
root.getNodeName());
// Đếm số node con
NodeList children=root.getChildNodes();
System.out.println("There are " +
children.getLength() + " nodes in this
document.");
Duyệt qua tài liệu(tt)
//Xuất giá trị các node con
for (Node child = root.getFirstChild();
child != null; child =
child.getNextSibling())
{
System.out.println(child.getNodeName()
+" = " +child.getNodeValue());
}
Biên tập tài liệu
Thay đổi giá trị của một nút
Thêm các nút
Xóa một nút
Thay thế một nút
Tạo và thiết lập các thuộc tính
Xóa một thuộc tính
Biên tập tài liệu
//
private static void changeOrder (Node start, String
elemName, String elemValue)
{
if (start.getNodeName().equals(elemName))
{
start.getFirstChild().setNodeValue(elemValue);
}
for (Node child = start.getFirstChild();
child != null; child = child.getNextSibling())
{
changeOrder(child, elemName, elemValue);
}
}
Biên tập tài liệu
changeOrder(root, "status","processing");
NodeList order=
root.getElementsByTagName("status");
for (int orderNum = 0; orderNum <
orders.getLength(); orderNum++)
{
System.out.println(orders.item(orderNum) .
getFirstChild().getNodeValue());
}
Circle.xml
<?xml version="1.0" ?>
- <DOCUMENT>
<CIRCLE X="200" Y="160" RADIUS="50" />
<CIRCLE X="170" Y="100" RADIUS="15" />
<CIRCLE X="80" Y="200" RADIUS="45" />
<CIRCLE X="200" Y="140" RADIUS="35" />
<CIRCLE X="130" Y="240" RADIUS="25" />
<CIRCLE X="270" Y="300" RADIUS="45" />
<CIRCLE X="210" Y="240" RADIUS="25" />
<CIRCLE X="60" Y="160" RADIUS="35" />
<CIRCLE X="160" Y="260" RADIUS="55" />
</DOCUMENT>