所有主要的瀏覽器都內(nèi)置了一個(gè)XML解析器,用于訪問(wèn)和操作XML
XML 解析器
在訪問(wèn)XML文檔之前,必須將其加載到XML DOM對(duì)象中
所有現(xiàn)代瀏覽器都有一個(gè)內(nèi)置的XML解析器,可以將文本轉(zhuǎn)換為XML DOM對(duì)象
解析文本字符串
以下示例將一個(gè)文本字符串解析為XML DOM對(duì)象,并使用JavaScript從中提取信息:
示例
<html>
<body>
<p id="demo"></p>
<script>
var text, parser, xmlDoc;
text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text, "text/xml");
document.getElementById("demo").innerHTML =
xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
</script>
</body>
</html>
示例解釋
定義了一個(gè)文本字符串:
text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";
創(chuàng)建了一個(gè)XML DOM解析器:
parser = new DOMParser();
解析器使用文本字符串創(chuàng)建一個(gè)新的XML DOM對(duì)象:
xmlDoc = parser.parseFromString(text, "text/xml");
XMLHttpRequest 對(duì)象
responseText 屬性以字符串形式返回響應(yīng)。
responseXML 屬性以XML DOM對(duì)象的形式返回響應(yīng)。
如果要將響應(yīng)作為XML DOM對(duì)象使用,可以使用responseXML屬性。
示例
xmlDoc = xmlhttp.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("ARTIST");
for (i = 0; i < x.length; i++) {
txt += x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
XML DOM
DOM 是什么?
文檔對(duì)象模型(DOM)定義了一種標(biāo)準(zhǔn),用于訪問(wèn)和操作文檔
HTML DOM 定義了一種訪問(wèn)和操作HTML文檔的標(biāo)準(zhǔn)方式。它將HTML文檔呈現(xiàn)為一棵樹(shù)結(jié)構(gòu)。
XML DOM 定義了一種訪問(wèn)和操作XML文檔的標(biāo)準(zhǔn)方式。它將XML文檔呈現(xiàn)為一棵樹(shù)結(jié)構(gòu)。
了解DOM對(duì)于任何與HTML或XML相關(guān)的工作都是必要的。
HTML DOM
所有HTML元素都可以通過(guò)HTML DOM訪問(wèn)。
以下示例更改具有id="demo"的HTML元素的值:
示例
<h1 id="demo">This is a Heading</h1>
<button type="button"
onclick="document.getElementById('demo').innerHTML = 'Hello World!'">Click Me!
</button>
XML DOM
所有XML元素都可以通過(guò)XML DOM訪問(wèn)
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
以下代碼檢索XML文檔中第一個(gè) <title>
元素的文本值:
示例
txt = xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
XML DOM 是獲取、更改、添加和刪除XML元素的標(biāo)準(zhǔn)方式。
以下示例將一個(gè)文本字符串加載到XML DOM對(duì)象中,并使用JavaScript從中提取信息:
示例
<html>
<body>
<p id="demo"></p>
<script>
var text, parser, xmlDoc;
text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text, "text/xml");
document.getElementById("demo").innerHTML =
xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
</script>
</body>
</html>
XML 和 XPath
什么是 XPath?
XPath 是 XSLT 標(biāo)準(zhǔn)中的一個(gè)主要元素。它可用于瀏覽 XML 文檔中的元素和屬性。
- XPath 是定義 XML 文檔部分的語(yǔ)法。
- XPath 使用路徑表達(dá)式在 XML 文檔中導(dǎo)航。
- XPath 包含標(biāo)準(zhǔn)函數(shù)庫(kù)。
- XPath 是 XSLT 和 XQuery 中的主要元素
XPath 路徑表達(dá)式
XPath 使用路徑表達(dá)式選擇 XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。這些路徑表達(dá)式類(lèi)似于在傳統(tǒng)計(jì)算機(jī)文件系統(tǒng)中使用的表達(dá)式。
XPath 表達(dá)式可用于 JavaScript、Java、XML Schema、PHP、Python、C 和 C++ 等許多其他語(yǔ)言。
XPath 用于 XSLT
XPath 是 XSLT 標(biāo)準(zhǔn)中的一個(gè)主要元素。具備 XPath 知識(shí)將使您能夠充分利用 XSL。
XPath 示例
我們將使用以下 XML 文檔:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<!-- 其他書(shū)籍內(nèi)容省略 -->
</bookstore>
在下表中,我們列出了一些 XPath 表達(dá)式及其結(jié)果:
XPath 表達(dá)式 | 結(jié)果 |
---|---|
/bookstore/book[1] |
選擇 bookstore 元素的第一個(gè)子元素 book 元素 |
/bookstore/book[last()] |
選擇 bookstore 元素的最后一個(gè)子元素 book 元素 |
/bookstore/book[last()-1] |
選擇 bookstore 元素的倒數(shù)第二個(gè)子元素 book 元素 |
/bookstore/book[position()<3] |
選擇 bookstore 元素的前兩個(gè)子元素 book 元素 |
//title[@lang] |
選擇所有具有名為 lang 的屬性的 title 元素 |
//title[@lang='en'] |
選擇所有具有值為 "en" 的 "lang" 屬性的 title 元素 |
/bookstore/book[price>35.00] |
選擇 bookstore 元素中所有具有價(jià)格大于 35.00 的 book 元素 |
/bookstore/book[price>35.00]/title |
選擇 bookstore 元素中所有具有價(jià)格大于 35.00 的 book 元素的 title 元素 |
XML 和 XQuery
什么是 XQuery?
XQuery 是 XML 的查詢語(yǔ)言,類(lèi)似于 SQL 對(duì)數(shù)據(jù)庫(kù)的作用。XQuery 的設(shè)計(jì)目標(biāo)是查詢 XML 數(shù)據(jù)。
XQuery 示例
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
- XQuery 是一種從 XML 文檔中查找和提取元素和屬性的語(yǔ)言。
- 示例問(wèn)題:"從存儲(chǔ)在 cd_catalog.xml 中的 CD 集合中選擇所有價(jià)格低于 $10 的 CD 記錄"
XQuery 和 XPath
XQuery 1.0 和 XPath 2.0 共享相同的數(shù)據(jù)模型,并支持相同的函數(shù)和運(yùn)算符。如果您已經(jīng)學(xué)習(xí)過(guò) XPath,那么理解 XQuery 將沒(méi)有問(wèn)題。
XQuery 使用示例
XQuery 可以用于:
- 提取用于 Web 服務(wù)的信息
- 生成摘要報(bào)告
- 將 XML 數(shù)據(jù)轉(zhuǎn)換為 XHTML
- 在 Web 文檔中搜索相關(guān)信息
XML、XLink 和 XPointer
XLink
- XLink 用于在 XML 文檔中創(chuàng)建超鏈接。
- 在 XML 文檔中,沒(méi)有瀏覽器支持 XLink。但是 XLink 在其他 XML 語(yǔ)言中使用。
- XLink 語(yǔ)法允許使用任何元素名稱作為鏈接元素。
XLink 示例
<?xml version="1.0" encoding="UTF-8"?>
- xlink:type="simple" 創(chuàng)建一個(gè)簡(jiǎn)單的 "類(lèi)似 HTML" 鏈接。
- xlink:href 屬性指定要鏈接到的 URL。
XLink 示例解釋
- 在文檔頂部聲明了 XLink 命名空間(xmlns:xlink="http://www.w3.org/1999/xlink")。
- xlink:type="simple" 創(chuàng)建一個(gè)簡(jiǎn)單的 "類(lèi)似 HTML" 鏈接。
- xlink:href 屬性指定鏈接到的 URL(在這種情況下是圖像)。
- xlink:show="new" 指定鏈接應(yīng)在新窗口中打開(kāi)。
XLink - 進(jìn)一步了解
- 在上面的示例中,我們演示了簡(jiǎn)單的 XLink。
- 當(dāng)訪問(wèn)遠(yuǎn)程位置作為資源時(shí),XLink 變得更有趣。
XPointer
- XPointer 允許鏈接指向 XML 文檔的特定部分。
- 使用 XPath 表達(dá)式在 XML 文檔中導(dǎo)航
XPointer 示例
在 XLink 與 XPointer 結(jié)合使用的示例中,我們鏈接到另一個(gè)文檔的特定部分。
首先,查看目標(biāo) XML 文檔,該文檔在每個(gè)元素上使用 id 屬性:
<?xml version="1.0" encoding="UTF-8"?>
<dogbreeds>
<dog breed="Rottweiler" id="Rottweiler">
<picture url="https://dog.com/rottweiler.gif" />
<history>The Rottweiler's ancestors were probably Roman drover dogs.....</history>
<temperament>Confident, bold, alert and imposing, the Rottweiler is a popular choice for its ability to protect....</temperament>
</dog>
<dog breed="FCRetriever" id="FCRetriever">
<picture url="https://dog.com/fcretriever.gif" />
<history>One of the earliest uses of retrieving dogs was to help fishermen retrieve fish from the water....</history>
<temperament>The flat-coated retriever is a sweet, exuberant, lively dog that loves to play and retrieve....</temperament>
</dog>
</dogbreeds>
在 XPointer 中,我們可以鏈接到文檔中具有特定 id 的元素:
<fact xlink:type="simple" xlink:>Fact about Rottweiler</fact>
這里,我們使用 id 值 "Rottweiler"。
這種鏈接方法可用于指向文檔中的特定部分。
XML驗(yàn)證器
使用我們的XML驗(yàn)證器來(lái)檢查您的XML語(yǔ)法。
格式良好的XML文檔
具有正確語(yǔ)法的XML文檔稱為“格式良好”。以下是一份示例:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML的語(yǔ)法規(guī)則包括:
- XML文檔必須有根元素
- XML元素必須有關(guān)閉標(biāo)簽
- XML標(biāo)簽區(qū)分大小寫(xiě)
- XML元素必須正確嵌套
- XML屬性值必須用引號(hào)括起來(lái)
XML錯(cuò)誤將阻止您
XML文檔中的錯(cuò)誤將阻止您的XML應(yīng)用程序
HTML瀏覽器允許顯示帶有錯(cuò)誤的HTML文檔,但對(duì)于XML,不允許存在錯(cuò)誤。
檢查XML語(yǔ)法
為了幫助您檢查XML語(yǔ)法,我們創(chuàng)建了一個(gè)XML驗(yàn)證器。
嘗試檢查正確的XML
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
嘗試檢查不正確的XML
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</pheading>
<body>Don't forget me this weekend!</body>
</note>
有效的XML文檔
“格式良好”的XML文檔與“有效”的XML文檔不同?!坝行А钡腦ML文檔必須是格式良好的,并符合文檔類(lèi)型定義(DTD或XML模式)。
文檔類(lèi)型定義定義了XML文檔的規(guī)則以及合法的元素和屬性。
XML DTD
具有正確語(yǔ)法的XML文檔稱為“格式良好”。
通過(guò)DTD驗(yàn)證的XML文檔既是“格式良好”又是“有效”的。
什么是DTD?
DTD代表文檔類(lèi)型定義。
DTD定義了XML文檔的結(jié)構(gòu)以及合法的元素和屬性。
有效的XML文檔
一個(gè)“有效”的XML文檔既是“格式良好”的,也符合DTD的規(guī)則:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面的DOCTYPE聲明包含對(duì)DTD文件的引用。DTD文件的內(nèi)容如下所示,并進(jìn)行了解釋。
XML DTD
DTD的目的是定義XML文檔的結(jié)構(gòu)以及合法的元素和屬性
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
上述DTD的解釋如下
-
<!DOCTYPE note
- 定義文檔的根元素為note
-
<!ELEMENT note
- 定義note
元素必須包含元素:“to, from, heading, body” -
<!ELEMENT to
- 定義to
元素的類(lèi)型為“#PCDATA” -
<!ELEMENT from
- 定義from
元素的類(lèi)型為“#PCDATA” -
<!ELEMENT heading
- 定義heading
元素的類(lèi)型為“#PCDATA” -
<!ELEMENT body
- 定義body
元素的類(lèi)型為“#PCDATA”
提示:#PCDATA
表示可解析的字符數(shù)據(jù)
使用DTD進(jìn)行實(shí)體聲明
DOCTYPE聲明還可用于定義文檔中使用的特殊字符或字符串
例子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY nbsp " ">
<!ENTITY writer "Writer: Donald Duck.">
<!ENTITY copyright "Copyright: W3Schools.">
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<footer>&writer; ©right;</footer>
</note>
提示:實(shí)體由三部分組成:以“&”開(kāi)始,然后是實(shí)體名稱,最后以分號(hào)結(jié)束
何時(shí)使用DTD?
使用DTD,獨(dú)立的人群可以同意使用標(biāo)準(zhǔn)的DTD進(jìn)行數(shù)據(jù)交換
使用DTD,您可以驗(yàn)證從外部世界接收到的數(shù)據(jù)是否有效
您還可以使用DTD驗(yàn)證自己的數(shù)據(jù)
何時(shí)不使用DTD?
XML不需要DTD
當(dāng)您嘗試使用XML進(jìn)行實(shí)驗(yàn),或者當(dāng)您處理小型XML文件時(shí),創(chuàng)建DTD可能是浪費(fèi)時(shí)間的
如果您開(kāi)發(fā)應(yīng)用程序,請(qǐng)等到規(guī)范穩(wěn)定后再添加DTD。否則,由于驗(yàn)證錯(cuò)誤,您的軟件可能會(huì)停止工作
XML Schema
具有正確語(yǔ)法的XML文檔稱為“格式良好”
通過(guò)XML Schema驗(yàn)證的XML文檔既是“格式良好”又是“有效”的
XML Schema
XML Schema是DTD的基于XML的替代方案
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
上述Schema的解釋如下
-
<xs:element name="note">
定義名為“note”的元素 -
<xs:complexType>
“note”元素是一個(gè)復(fù)雜類(lèi)型 -
<xs:sequence>
復(fù)雜類(lèi)型是一系列元素 -
<xs:element name="to" type="xs:string">
“to”元素的類(lèi)型為字符串(文本) -
<xs:element name="from" type="xs:string">
“from”元素的類(lèi)型為字符串 -
<xs:element name="heading" type="xs:string">
“heading”元素的類(lèi)型為字符串 -
<xs:element name="body" type="xs:string">
“body”元素的類(lèi)型為字符串
XML Schema比DTD更強(qiáng)大
- XML Schema是用XML編寫(xiě)的
- XML Schema可擴(kuò)展以添加內(nèi)容
- XML Schema支持?jǐn)?shù)據(jù)類(lèi)型
- XML Schema支持命名空間
為什么使用XML Schema?
使用XML Schema,您的XML文件可以攜帶其自身格式的描述。
使用XML Schema,獨(dú)立的人群可以就數(shù)據(jù)交換達(dá)成標(biāo)準(zhǔn)協(xié)議。
使用XML Schema,您可以驗(yàn)證數(shù)據(jù)。
XML Schema支持?jǐn)?shù)據(jù)類(lèi)型
XML Schema的最大優(yōu)勢(shì)之一是支持?jǐn)?shù)據(jù)類(lèi)型
- 更容易描述文檔內(nèi)容
- 更容易定義對(duì)數(shù)據(jù)的限制
- 更容易驗(yàn)證數(shù)據(jù)的正確性
- 更容易在不同數(shù)據(jù)類(lèi)型之間轉(zhuǎn)換數(shù)據(jù)
XML Schema使用XML語(yǔ)法
XML Schema的另一個(gè)重要優(yōu)勢(shì)是它們是用XML編寫(xiě)的
- 您不必學(xué)習(xí)一種新語(yǔ)言
- 您可以使用XML DOM操作Schema
- 您可以使用XSLT轉(zhuǎn)換Schema
在服務(wù)器上使用XSLT轉(zhuǎn)換XML
此ASP將服務(wù)器上的XML文件轉(zhuǎn)換為XHTML
<%
'加載XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("simple.xml"))
'加載XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("simple.xsl"))
'轉(zhuǎn)換文件
Response.Write(xml.transformNode(xsl))
%>
例子解釋
- 代碼的第一個(gè)塊創(chuàng)建Microsoft XML解析器(XMLDOM)的實(shí)例,并將XML文件加載到內(nèi)存中。
- 代碼的第二個(gè)塊創(chuàng)建解析器的另一個(gè)實(shí)例,并將XSL文件加載到內(nèi)存中。
- 代碼的最后一行使用XSL文檔轉(zhuǎn)換XML文檔,并將結(jié)果作為XHTML發(fā)送到瀏覽器。
最后
為了方便其他設(shè)備和平臺(tái)的小伙伴觀看往期文章:
微信公眾號(hào)搜索:Let us Coding
,關(guān)注后即可獲取最新文章推送文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-840858.html
看完如果覺(jué)得有幫助,歡迎點(diǎn)贊、收藏、關(guān)注文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840858.html
到了這里,關(guān)于深入學(xué)習(xí) XML 解析器及 DOM 操作技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!