深入學習 XML 解析器及 DOM 操作技術

来源:https://www.cnblogs.com/xiaowange/p/18078558
-Advertisement-
Play Games

所有主要的瀏覽器都內置了一個XML解析器,用於訪問和操作XML XML 解析器 在訪問XML文檔之前,必須將其載入到XML DOM對象中 所有現代瀏覽器都有一個內置的XML解析器,可以將文本轉換為XML DOM對象 解析文本字元串 以下示例將一個文本字元串解析為XML DOM對象,並使用JavaSc ...


所有主要的瀏覽器都內置了一個XML解析器,用於訪問和操作XML

XML 解析器

在訪問XML文檔之前,必須將其載入到XML DOM對象中

所有現代瀏覽器都有一個內置的XML解析器,可以將文本轉換為XML DOM對象

解析文本字元串

以下示例將一個文本字元串解析為XML DOM對象,並使用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>

示例解釋

定義了一個文本字元串:

text = "<bookstore><book>" +  
    "<title>Everyday Italian</title>" +  
    "<author>Giada De Laurentiis</author>" +  
    "<year>2005</year>" +  
    "</book></bookstore>";

創建了一個XML DOM解析器:

parser = new DOMParser();

解析器使用文本字元串創建一個新的XML DOM對象:

xmlDoc = parser.parseFromString(text, "text/xml");

XMLHttpRequest 對象

responseText 屬性以字元串形式返迴響應。

responseXML 屬性以XML DOM對象的形式返迴響應。

如果要將響應作為XML DOM對象使用,可以使用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 是什麼?

文檔對象模型(DOM)定義了一種標準,用於訪問和操作文檔

HTML DOM 定義了一種訪問和操作HTML文檔的標準方式。它將HTML文檔呈現為一棵樹結構。

XML DOM 定義了一種訪問和操作XML文檔的標準方式。它將XML文檔呈現為一棵樹結構。

瞭解DOM對於任何與HTML或XML相關的工作都是必要的。

HTML DOM

所有HTML元素都可以通過HTML DOM訪問。

以下示例更改具有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元素都可以通過XML DOM訪問

<?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文檔中第一個 <title> 元素的文本值:

示例

txt = xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;

XML DOM 是獲取、更改、添加和刪除XML元素的標準方式。

以下示例將一個文本字元串載入到XML DOM對象中,並使用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 標準中的一個主要元素。它可用於瀏覽 XML 文檔中的元素和屬性。

  • XPath 是定義 XML 文檔部分的語法。
  • XPath 使用路徑表達式在 XML 文檔中導航。
  • XPath 包含標準函數庫。
  • XPath 是 XSLT 和 XQuery 中的主要元素

XPath 路徑表達式

XPath 使用路徑表達式選擇 XML 文檔中的節點或節點集。這些路徑表達式類似於在傳統電腦文件系統中使用的表達式。

XPath 表達式可用於 JavaScript、Java、XML Schema、PHP、Python、C 和 C++ 等許多其他語言。

XPath 用於 XSLT

XPath 是 XSLT 標準中的一個主要元素。具備 XPath 知識將使您能夠充分利用 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>
  <!-- 其他書籍內容省略 -->
</bookstore>

在下表中,我們列出了一些 XPath 表達式及其結果:

XPath 表達式 結果
/bookstore/book[1] 選擇 bookstore 元素的第一個子元素 book 元素
/bookstore/book[last()] 選擇 bookstore 元素的最後一個子元素 book 元素
/bookstore/book[last()-1] 選擇 bookstore 元素的倒數第二個子元素 book 元素
/bookstore/book[position()<3] 選擇 bookstore 元素的前兩個子元素 book 元素
//title[@lang] 選擇所有具有名為 lang 的屬性的 title 元素
//title[@lang='en'] 選擇所有具有值為 "en" 的 "lang" 屬性的 title 元素
/bookstore/book[price>35.00] 選擇 bookstore 元素中所有具有價格大於 35.00 的 book 元素
/bookstore/book[price>35.00]/title 選擇 bookstore 元素中所有具有價格大於 35.00 的 book 元素的 title 元素

XML 和 XQuery

什麼是 XQuery?

XQuery 是 XML 的查詢語言,類似於 SQL 對資料庫的作用。XQuery 的設計目標是查詢 XML 數據。

XQuery 示例

for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
  • XQuery 是一種從 XML 文檔中查找和提取元素和屬性的語言。
  • 示例問題:"從存儲在 cd_catalog.xml 中的 CD 集合中選擇所有價格低於 $10 的 CD 記錄"

XQuery 和 XPath

XQuery 1.0 和 XPath 2.0 共用相同的數據模型,並支持相同的函數和運算符。如果您已經學習過 XPath,那麼理解 XQuery 將沒有問題。

XQuery 使用示例

XQuery 可以用於:

  • 提取用於 Web 服務的信息
  • 生成摘要報告
  • 將 XML 數據轉換為 XHTML
  • 在 Web 文檔中搜索相關信息
  • XLink 用於在 XML 文檔中創建超鏈接。
  • 在 XML 文檔中,沒有瀏覽器支持 XLink。但是 XLink 在其他 XML 語言中使用。
  • XLink 語法允許使用任何元素名稱作為鏈接元素。

XLink 示例

<?xml version="1.0" encoding="UTF-8"?>
  • xlink:type="simple" 創建一個簡單的 "類似 HTML" 鏈接。
  • xlink:href 屬性指定要鏈接到的 URL。

XLink 示例解釋

  • 在文檔頂部聲明瞭 XLink 命名空間(xmlns:xlink="http://www.w3.org/1999/xlink")。
  • xlink:type="simple" 創建一個簡單的 "類似 HTML" 鏈接。
  • xlink:href 屬性指定鏈接到的 URL(在這種情況下是圖像)。
  • xlink:show="new" 指定鏈接應在新視窗中打開。

XLink - 進一步瞭解

  • 在上面的示例中,我們演示了簡單的 XLink。
  • 當訪問遠程位置作為資源時,XLink 變得更有趣。

XPointer

  • XPointer 允許鏈接指向 XML 文檔的特定部分。
  • 使用 XPath 表達式在 XML 文檔中導航

XPointer 示例

在 XLink 與 XPointer 結合使用的示例中,我們鏈接到另一個文檔的特定部分。

首先,查看目標 XML 文檔,該文檔在每個元素上使用 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:href="https://dog.com/dogbreeds.xml#Rottweiler">Fact about Rottweiler</fact>

這裡,我們使用 id 值 "Rottweiler"。

這種鏈接方法可用於指向文檔中的特定部分。

XML驗證器

使用我們的XML驗證器來檢查您的XML語法。

格式良好的XML文檔

具有正確語法的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文檔必須有根元素
  • XML元素必須有關閉標簽
  • XML標簽區分大小寫
  • XML元素必須正確嵌套
  • XML屬性值必須用引號括起來

XML錯誤將阻止您

XML文檔中的錯誤將阻止您的XML應用程式

HTML瀏覽器允許顯示帶有錯誤的HTML文檔,但對於XML,不允許存在錯誤。

檢查XML語法

為了幫助您檢查XML語法,我們創建了一個XML驗證器。

嘗試檢查正確的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文檔不同。“有效”的XML文檔必須是格式良好的,並符合文檔類型定義(DTD或XML模式)。

文檔類型定義定義了XML文檔的規則以及合法的元素和屬性。

XML DTD

具有正確語法的XML文檔稱為“格式良好”。

通過DTD驗證的XML文檔既是“格式良好”又是“有效”的。

什麼是DTD?

DTD代表文檔類型定義。

DTD定義了XML文檔的結構以及合法的元素和屬性。

有效的XML文檔

一個“有效”的XML文檔既是“格式良好”的,也符合DTD的規則:

<?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聲明包含對DTD文件的引用。DTD文件的內容如下所示,併進行瞭解釋。

XML DTD

DTD的目的是定義XML文檔的結構以及合法的元素和屬性

<!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元素的類型為“#PCDATA”
  • <!ELEMENT from - 定義from元素的類型為“#PCDATA”
  • <!ELEMENT heading - 定義heading元素的類型為“#PCDATA”
  • <!ELEMENT body - 定義body元素的類型為“#PCDATA”

提示:#PCDATA表示可解析的字元數據

使用DTD進行實體聲明

DOCTYPE聲明還可用於定義文檔中使用的特殊字元或字元串

例子

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE note [
  <!ENTITY nbsp "&#xA0;">
  <!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;&nbsp;&copyright;</footer>
</note>

提示:實體由三部分組成:以“&”開始,然後是實體名稱,最後以分號結束

何時使用DTD?

使用DTD,獨立的人群可以同意使用標準的DTD進行數據交換

使用DTD,您可以驗證從外部世界接收到的數據是否有效

您還可以使用DTD驗證自己的數據

何時不使用DTD?

XML不需要DTD

當您嘗試使用XML進行實驗,或者當您處理小型XML文件時,創建DTD可能是浪費時間的

如果您開發應用程式,請等到規範穩定後再添加DTD。否則,由於驗證錯誤,您的軟體可能會停止工作

XML Schema

具有正確語法的XML文檔稱為“格式良好”

通過XML Schema驗證的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”元素是一個複雜類型
  • <xs:sequence> 複雜類型是一系列元素
  • <xs:element name="to" type="xs:string"> “to”元素的類型為字元串(文本)
  • <xs:element name="from" type="xs:string"> “from”元素的類型為字元串
  • <xs:element name="heading" type="xs:string"> “heading”元素的類型為字元串
  • <xs:element name="body" type="xs:string"> “body”元素的類型為字元串

XML Schema比DTD更強大

  • XML Schema是用XML編寫的
  • XML Schema可擴展以添加內容
  • XML Schema支持數據類型
  • XML Schema支持命名空間

為什麼使用XML Schema?

使用XML Schema,您的XML文件可以攜帶其自身格式的描述。

使用XML Schema,獨立的人群可以就數據交換達成標準協議。

使用XML Schema,您可以驗證數據。

XML Schema支持數據類型

XML Schema的最大優勢之一是支持數據類型

  • 更容易描述文檔內容
  • 更容易定義對數據的限制
  • 更容易驗證數據的正確性
  • 更容易在不同數據類型之間轉換數據

XML Schema使用XML語法

XML Schema的另一個重要優勢是它們是用XML編寫的

  • 您不必學習一種新語言
  • 您可以使用XML DOM操作Schema
  • 您可以使用XSLT轉換Schema

在伺服器上使用XSLT轉換XML

此ASP將伺服器上的XML文件轉換為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"))

'轉換文件
Response.Write(xml.transformNode(xsl))
%>

例子解釋

  • 代碼的第一個塊創建Microsoft XML解析器(XMLDOM)的實例,並將XML文件載入到記憶體中。
  • 代碼的第二個塊創建解析器的另一個實例,並將XSL文件載入到記憶體中。
  • 代碼的最後一行使用XSL文檔轉換XML文檔,並將結果作為XHTML發送到瀏覽器。

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:Let us Coding,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android 設置相關頁面 本文主要記錄下android 中跳轉設置相關頁面的一些action. 在android 中,我們一般使用intent+指定的action來跳轉相關設置頁面. 1: WLAN Action 設置為Settings.ACTION_WIFI_SETTINGS ,用戶可以跳轉w ...
  • 原文:Android View的動畫效果,上移展示和下移隱藏-Stars-One的雜貨小窩 項目里的一個小需求(實際是要和手勢操作一起,上滑和下拉觸發此動畫效果),記錄一下 PS: 本篇先記錄下動畫效果,下篇再將如何監聽滑動手勢 效果 原理 實際通過View的translationY的屬性來實現 上 ...
  • 前言 編程語言中都有自己基本的控制結構,它們在程式設計中起到了非常重要的作用。以下是幾個原因: 分支控制: 在程式執行過程中,有時需要根據不同的條件分支來執行不同的代碼邏輯。if/else結構通過判斷條件來決定程式如何執行,實現了程式的分支控制。 數據迭代: 在程式中,需要對一些數據進行遍歷、操 ...
  • 前言 狀態管理是指在應用程式中維護和更新應用程式狀態的過程。在一個程式中,可能有很多不同的組件和模塊,它們需要共用和相互作用的狀態。如果沒有一個明確的方式來管理這些狀態,就會導致代碼混亂、不易維護和難以擴展。 狀態管理的目標是提供一種機制,使得所有的組件和模塊都可以訪問和更新同一個狀態。這個狀態 ...
  • 一、是什麼 OSI (Open System Interconnect)模型全稱為開放式通信系統互連參考模型,是國際標準化組織 ( ISO ) 提出的一個試圖使各種電腦在世界範圍內互連為網路的標準框架 OSI將電腦網路體繫結構劃分為七層,每一層實現各自的功能和協議,並完成與相鄰層的介面通信。即每 ...
  • Vue 一、使用語法 1.插值語法 功能:用於解析標簽體內容。 寫法:{{xxx}},xxx是js表達式,且ß可以直接讀取到data中的所有屬性。 2.指令語法 功能:用於解析標簽(包括:標簽屬性、標簽體內容、綁定事件.....)。 舉例:v-bind:href="xxx" 或 簡寫為 :href= ...
  • AJAX AJAX是開發者的夢想,因為你可以: 在不重新載入頁面的情況下更新網頁 在頁面載入後請求來自伺服器的數據 在頁面載入後接收來自伺服器的數據 在後臺向伺服器發送數據 HTML頁面 <!DOCTYPE html> <html> <body> <div id="demo"> <h2>讓AJAX更 ...
  • 一、UDP UDP(User Datagram Protocol),用戶數據包協議,是一個簡單的面向數據報的通信協議,即對應用層交下來的報文,不合併,不拆分,只是在其上面加上首部後就交給了下麵的網路層 也就是說無論應用層交給UDP多長的報文,它統統發送,一次發送一個報文 而對接收方,接到後直接去除首 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...