Cây nút duyệt qua XML DOM
Di chuyển ngang có nghĩa là lặp qua hoặc di chuyển qua cây nút.
Đi qua cây nút
Thường thì bạn muốn lặp một tài liệu XML, ví dụ: khi bạn muốn trích xuất giá trị của từng phần tử.
Điều này được gọi là "Truyền cây nút"
Ví dụ bên dưới lặp qua tất cả các nút con của <book> và hiển thị tên cũng như giá trị của chúng:
Ví dụ
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>";
parser = new DOMParser();
xmlDoc
= parser.parseFromString(text,"text/xml");
// documentElement always
represents the root node
x = xmlDoc.documentElement.childNodes;
for (i =
0; i < x.length ;i++) {
txt += x[i].nodeName + ": " +
x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>
Đầu ra:
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
Hãy tự mình thử »Ví dụ giải thích:
- Tải chuỗi XML vào xmlDoc
- Lấy các nút con của phần tử gốc
- Đối với mỗi nút con, xuất tên nút và giá trị nút của nút văn bản
Sự khác biệt của trình duyệt trong phân tích cú pháp DOM
Tất cả các trình duyệt hiện đại đều hỗ trợ đặc tả W3C DOM.
Tuy nhiên, có một số khác biệt giữa các trình duyệt. Một điểm khác biệt quan trọng là:
- Cách họ xử lý khoảng trắng và dòng mới
DOM - Khoảng trắng và dòng mới
XML thường chứa dòng mới hoặc ký tự khoảng trắng giữa các nút. Điều này thường xảy ra khi tài liệu được chỉnh sửa bởi một trình soạn thảo đơn giản như Notepad.
Ví dụ sau (được chỉnh sửa bởi Notepad) chứa CR/LF (dòng mới) giữa mỗi dòng và hai khoảng trắng phía trước mỗi nút con:
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
Internet Explorer 9 trở về trước KHÔNG coi khoảng trắng trống hoặc dòng mới là nút văn bản, trong khi các trình duyệt khác thì làm như vậy.
Ví dụ sau sẽ xuất ra số nút con mà phần tử gốc (của books.xml ) có. IE9 trở về trước sẽ xuất ra 4 nút con, trong khi IE10 trở lên và các trình duyệt khác sẽ xuất ra 9 nút con:
Ví dụ
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x =
xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"Number
of child nodes: " + x.length;
}
Hãy tự mình thử »PCDATA - Dữ liệu ký tự được phân tích cú pháp
Trình phân tích cú pháp XML thường phân tích tất cả văn bản trong tài liệu XML.
Khi một phần tử XML được phân tích cú pháp, văn bản giữa các thẻ XML cũng được phân tích cú pháp:
<message>This text is also parsed</message>
Trình phân tích cú pháp thực hiện điều này vì các phần tử XML có thể chứa các phần tử khác, như trong ví dụ này, trong đó phần tử <name> chứa hai phần tử khác (đầu tiên và cuối cùng):
<name><first>Bill</first><last>Gates</last></name>
và trình phân tích cú pháp sẽ chia nó thành các phần tử con như thế này:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
Dữ liệu ký tự được phân tích cú pháp (PCDATA) là thuật ngữ được sử dụng về dữ liệu văn bản sẽ được phân tích cú pháp bởi trình phân tích cú pháp XML.
CDATA - Dữ liệu ký tự (Chưa được phân tích cú pháp)
Thuật ngữ CDATA được sử dụng cho dữ liệu văn bản không được phân tích cú pháp bằng trình phân tích cú pháp XML.
Các ký tự như "<" và "&" là không hợp lệ trong các phần tử XML.
"<" sẽ tạo ra lỗi vì trình phân tích cú pháp hiểu nó là phần bắt đầu của một phần tử mới.
"&" sẽ tạo ra lỗi vì trình phân tích cú pháp hiểu nó là phần bắt đầu của một thực thể ký tự.
Một số văn bản, chẳng hạn như mã JavaScript, chứa nhiều ký tự "<" hoặc "&". Để tránh lỗi, mã script có thể được định nghĩa là CDATA.
Mọi thứ bên trong phần CDATA đều bị trình phân tích cú pháp bỏ qua.
Phần CDATA bắt đầu bằng " <![CDATA[ " và kết thúc bằng " ]]> ":
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
{
return 1;
} else
{
return 0;
}
}
]]>
</script>
Trong ví dụ trên, mọi thứ bên trong phần CDATA đều bị trình phân tích cú pháp bỏ qua.
Lưu ý về phần CDATA:
Phần CDATA không thể chứa chuỗi "]]>". Các phần CDATA lồng nhau không được phép.
"]]>" đánh dấu sự kết thúc của phần CDATA không được chứa dấu cách hoặc ngắt dòng.