XML編程


.XML基本概念

1.什么是xml

XMLeXtensible Markup Language,可擴展標記語言

 

標記語言

Htmlxhtmlhtml5xml

不同點:xmlhtml系列

ü 目的不同,html用於顯示,xml用於傳輸數據庫

ü 內容不同,html有預定義好的標簽,而xml沒有,所有的都需要自己來定義。

 

可擴展

所謂可擴展,就是可以自己定義標簽。如圖:

 

實際上,在xml中,所有的標簽都是需要自己來定義。

 

ü XML 指可擴展標記語言,是獨立於軟件和硬件的信息傳輸工具。

ü XML 是一種標記語言,很類似 HTML

ü XML 的設計宗旨是傳輸數據,而非顯示數據

ü XML 標簽沒有被預定義。您需要自行定義標簽。

ü XML 被設計為具有自我描述性。

ü XML W3C 的推薦標准。

 

2.xml的作用

 

主要是兩大塊:

 

數據存儲

 

數據傳輸(交換)

 

 

 

 

 

存儲方面:

ü 配置文件,如qqfeiq、迅雷

ü 小型數據庫,對於一些不經常變化的數據(數據量不是很大),可以使用xml來保存

 

數據傳輸方面:

 

ü AjaxAsynchronous JavaScript and xml,異步的jsxml

 

ü Web serviceweb 服務 天氣預報、ip查詢、電話號碼歸屬地查詢,機票查詢

 

 

新的應用:svg

Svg:可伸縮的矢量圖形

伴隨着H5(移動端)而生的。

 

重點還是在傳輸方面。尤其是web service

 

.XML結構

 

整體層面了解xml的結構

 

 

 

首先,看一個簡單的demo

 

 

 

 

它其實是一個樹模型,如圖:

ü  第一行是 XML 聲明。它定義 XML 的版本 (1.0) 和所使用的編碼(UTF-8

ü  XML 文檔形成了一種樹結構,它從“根部”開始,然后擴展到“枝葉”

ü  XML 文檔必須包含根元素。該元素是所有其他元素的父元素。有且僅有一個

ü  XML 文檔中包含三種節點:元素屬性文本

.XML語法

學習理念:通過已經掌握的知識,來學習新的知識,效率最高。

 

在學習xml的時候,和xhtml做一個對比,就會非常簡單。

 

不妨回憶一下xhtml的語法規范,有哪些?

 

ü 所有的標簽都需要關閉。雙標簽<div></div> 單標簽 <br />

 

ü 標簽是可以嵌套的,但是不能交叉(騎跨),<div><p></p></div> <div><p></div></p> ×

 

ü 所有的屬性都應該加引號(單雙均可)

 

ü 所有的屬性都應該有值,如果沒有值,就是要屬性本身作為它的值,checked='checked'

 

ü 所有的標簽和屬性都要小寫。

1.語法總則

ü  它必須以 XML 聲明開頭

ü  它必須擁有唯一的根元素

ü  開始標簽必須與結束標簽相匹配

ü  元素對大小寫敏感(區分大小寫)

ü  所有的元素都必須關閉

ü  所有的元素都必須正確地嵌套

 

ü 必須對特殊字符使用實體

2.文檔聲明

 

通常有兩個屬性:

ü versionxml的版本,目前是1.0

ü encoding:字符集編碼,選擇utf-8即可。

 

ü standalone:用來表示該文件是否呼叫其它外部的文件(DTDschema),取值范圍:yes/no   yes:沒有呼叫,默認yes

 

要注意的一個問題,就是編碼的問題。

 

3.命名規則

由於所有的標簽和屬性都是自己來定義,意味着我們需要給他們命名。

 

ü 名稱可以含字母、數字以及其他的字符

ü 名稱不能以數字或者標點符號開始

ü 名稱不能以字符xml”(或者 XMLXml)開始

ü 名稱不能包含空格

ü 可使用任何名稱,沒有保留的字詞。

 

☞ 注意事項

ü 避免 "-" 字符。如:"first-name",一些軟件會認為你需要提取第一個單詞。

ü 避免 "." 字符。如:"first.name",一些軟件會認為 "name" 是對象 "first" 的屬性。

ü 避免 ":" 字符。冒號會被轉換為命名空間來使用。

 

命名要見名知意,盡量簡潔。book_title √,  the_title_of_the_book (x)

4.定義元素

xml中, 有三種節點:

ü 元素節點

ü 屬性節點

ü 文本節點

 

元素,有時候稱之為標簽。類似xhtml中的標簽。

 

5.定義屬性

 

屬性是依賴於某個元素而存在的,像寄生蟲一樣。

 

定義,一定是在元素的開始標簽中進行定義的。

 

如圖:

需要有一些注意的地方:

ü 一個元素可以有多個屬性

ü 元素的屬性不能重復

ü 所有的屬性都應該用引號包含

ü 凡是屬性都可以使用子元素的方式來表示。

 

 

格式: <元素名稱> </元素名稱>  <元素名稱 /> 

所有的元素都是自己來定義的。

 

重點是元素的表現(構成)形式:

ü 僅包含元素的元素,如bookstore元素

ü 僅包含文本的元素,如authoryear等元素

ü 包含文本和元素的混合的元素,如title元素

 

 

 

需要有一些注意的地方:

ü 一個元素可以有多個屬性

ü 元素的屬性不能重復

ü 所有的屬性都應該用引號包含

ü 凡是屬性都可以使用子元素的方式來表示。

 

用屬性來表示元素,有以下缺點:

ü 屬性無法包含多重的值(元素可以)

ü 屬性無法描述樹結構(元素可以)

ü 屬性不易擴展(為未來的變化)

ü 屬性難以閱讀和維護

ü 請盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息

 

<file type="gif">computer.gif</file>

以數據庫中的表為例:

user

id  username    passaword

1   jordan      23

2   beckham    7

3   jackson     99

 

在具體處理的時候,和業務邏輯相關的有usernamepassword,而id則和業務邏輯無關的。

 

和表做一個對比。

 

最后總結一下:在定義xml的時候,98%的都是元素,只有2%左右的才是屬性。

 

6.實體引用

 

文本節點並不是用標簽來表示,就是元素中的內容。

 

在書寫內容的時候,對一些特殊的字符需要做一個引用處理 -- 實體引用。

 

看看xhtml中的實體引用

 

< : <

 

空格:  

 

版權部分:©

 

 

 

xml中,有5個預定義的實體,如下:

假如有一大段的內容,其中都有特殊的符號,怎么辦?

 

可以使用CDATA節來處理。

 

書寫的時候,需要注意:遵守寫法,不要脫節。

☞ 注意事項

ü CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束。

ü CDATA 部分中的所有內容都會被解析器忽略。

ü CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。

ü 標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。

 

7.注釋

xhtml一樣。

注意點:

ü 一定要放在文檔聲明之后

ü 不要嵌套

8.練習

編寫xml文檔,將如下所示user數據用XML方式來保存

練習說明:

.DTD驗證

Xml的作用是什么?

最主要的作用 傳輸或交換數據

 

Xml的內容是什么?

由於沒有預定義標簽,所以可以隨便寫。

 

甲方 ----> 乙方

乙方 ----> 甲方

 

如果是隨便寫的,沒有一個規范,那么就會出現你傳過來的數據不是我所需要的。

寄信

1.什么是Xml驗證

在實際需求中,通常要求交換(傳輸的)xml,是符號某種固定格式(規范)。

所以說,我們需要有一種機制能夠驗證xml文檔是否是符號規范的。

 

兩個:

ü 格式良好的xml文檔:語法正確。

ü 合法的xml文檔:在語法正確的基礎上, 然后符合某種規范。

 

請問:

格式良好的xml文檔是否是合法的xml,不一定

合法的xml是否是格式良好的,一定

 

驗證xml文檔是否是合法的,通常有兩種技術:

 

ü DTDDocument Type Definition,文檔類型定義,目前使用最多的,簡單

 

ü schema: XSD XML Schema Definition,文檔結構定義,未來的趨勢,功能強大

我們要學習的DTD

 

2.快速入門

 

對於xml的驗證,需要用到DTD。此時,就產生了兩個東西:dtdxml文檔

 

(1).先編寫一個xml文檔

(2).再定義一個dtd

Dtd可以直接在xml中來定義,也可以單獨定義,然后引入。

此處,采取直接在文檔中定義,如下:

 

 

3).使用工具來驗證xml文檔是否符合dtd的定義

 

工具有很多:

 

ü 專業軟件  iexmltls (只針對IE瀏覽器)

ü 代碼校驗  (只針對IE瀏覽器)

ü 在線驗證(http://validator.w3.org/

ü xml編輯器--spyxml(推薦)

 

在線驗證

用spyxml工具(推薦)

 

3.DTD作用

回頭再看一下的DTD的作用,或者說可以通過DTD來干什么?

 

ü 通過 DTD,獨立的團體可一致地使用某個標准的 DTD 來交換數據。

ü 而您的應用程序也可使用某個標准的 DTD 來驗證從外部接收到的數據。

ü 您還可以使用 DTD 來驗證您自身的數據。

 

☞ 注意事項

ü DTD描述了XML文檔有哪些節點、節點之間的關系以及節點的值等。(學習重點)

ü DTD驗證的不是語法,而是驗證XML文檔中應該有哪些節點,節點之間的關系是什么,元素的值、屬性的值應該由什么內容組成。

ü XML沒有DTD,可以正常工作,但不能很好的工作。

ü 合法的 XML 文檔是“形式良好”的 XML 文檔,且遵守文檔類型定義 (DTD) 的語法規則。

 

在我們的xml中,有三種節點,分別是否元素節點、屬性節點以及文本節點。

4.元素定義

格式:<!ELEMENT 元素名 元素內容模型>

重點是元素內容模型

回顧一下元素的表現形式(構成):

ü 僅包含元素的元素

ü 僅包含文本的元素

ü 包含元素和文本混合的元素

 

還有兩種特殊:

ü 空元素

ü 任意元素

 

意味着要處理五種情況

在定義元素的時候,需要用到的符號,如下:

 

還有兩種特殊:

ü 空元素

ü 任意元素

 

意味着要處理五種情況

在定義元素的時候,需要用到的符號,如下:

(1).僅包含文本的元素

說白了,就是該元素中只有純文本。沒有其他內容(元素)。

使用 (#PCDATA)

Parse Character data,可解析的字符串數據

如果聲明了pcdata,則不能再出現任何的元素了。

 

(2).僅包含元素的元素

比較單一,通常有兩種結構:

ü 順序結構,使用() ,

ü 選擇結構,使用() |

A.順序結構

使用 逗號

在聲明的內容中,所有的元素都必須出現一次,且按照聲明的順序依次出現。

不能出現多次,也不能不出現。

 

B.選擇結構

使用 |

 

對於選擇結構,二者必須出現其中的一個,不能同時出現兩個,也不允許都不出現。

 

如果要想出現多次,該如何實現呢?

此時,應該使用數量詞,和正則的數量詞一模一樣。

ü *,表示任意個,包括0

ü +,表示1或多個

ü ?,01

 

 

看一個案例,以user.xml為例

(3).包含元素和文本混合的元素

情況比較復雜,需要多加注意。如下:

 

此時,應該結合 僅包含文本  僅包含元素 兩種情況。

 

請看分解動作

可以這么看:

一共重復了三次,所以會使用數量詞

單就每一次而言,會有兩種情況,要么是僅包含文本的,要么就是僅包含元素的,實際上是 或的關系,所以會使用 |

 

所以,可以聲明如下:

有一些注意點:

ü 必須以#PCDATA打頭

ü 數量詞只能使用*,不能使用+或?

 

(4).空元素

使用EMPTY關鍵字來聲明,沒有小括號。

最好的方式是使用單標簽,如下:

5).任意元素

使用ANY關鍵字來聲明,不需要小括號。

一般不會使用any,因為一旦使用了any,就可以隨意的包含任何內容,也就是失去了約束的作用。和DTD的初衷是相違背的。

 

5.屬性定義

 

屬性是依賴於元素而存在的。

 

思考,如果需要定義屬性,需要知道哪些東西?

 

屬性是屬於哪個元素的?

 

屬性的名字是什么?

 

屬性的值是什么類型的?

 

屬性的取值方式是怎樣的?

 

 

 

屬性定義格式:<!ATTLIST 元素名 屬性名 屬性值類型 取值方式> 

 

重點是后面兩個

 

屬性值類型有哪些?

 

 

取值方式有哪些?

例子:

 

 

 

 

取值方式

#REQUIRED ,說明該屬性是必須要加上的

#IMPLIED,說明該屬性是可有可無的

#FIXED value,說明該屬性的固定值是value,如果你寫了,只能寫這個值,如果沒有寫,就是這個值。

默認值,直接寫值,如果添加了屬性,就以添加的為准,會覆蓋掉,如果沒有添加屬性,則就是默認值。

 

如果一個元素有多個屬性,可以一次聲明,如下:

 

☞ 注意事項

ü 在聲明屬性時,必須要聲明屬性的取值方式,如果屬性沒有默認值,也沒有固定值,也不是必須值,那么必須將其聲明為隱含值(IMPLIED)。

ü 屬性值可使用枚舉類型,使用 | 即可,如<!ATTLIST phone kind (home | work | cell | fax) #IMPLIED>

ü 我們可以在一個ATTLIST語句中聲明多個屬性。

 

6.實體定義

在文本節點,有時候需要重復的書寫某個內容,我們可以將其定義為實體。

 

Xml預定義五個實體:

ü <

ü >

ü ‘

ü “”

ü &

如果需要使用其他實體,則需要自己來定義。

 

xml中,有兩種實體:

ü 一般實體

ü 參數實體

(1).一般實體

DTD中定義,然后在xml中引用的實體,就是一般實體。

定義格式:<!ENTITY 實體名 值>

引用格式:&實體名;

 

使用范圍:在內部DTD中和外部DTD中都可以定義,然后在xml中使用。

 

案例:

 

內部方式定義並引用

實體定義之后,沒有引用也是可以的。

 

外部定義並引用

 

 

在xml中引用,

(2).參數實體

DTD中定義,然后仍然在DTD中引用的實體,就是參數實體。

定義格式:<!ENTITY % 實體名 值>

引用格式:%實體名;

 

使用范圍:只能是針對外部DTD的方式,也就是需要一外部的方式獨立的定義DTD,然后在DTD中直接引用參數實體。

 

看案例:

對應xml中引用如下:

如果別人定義好了DTD,能夠看懂。

 

新的學習理念:在學習完新的知識后,再回頭看以前的知識,會有新的發現。

看一個小小的應用

 

DTD,我們並不陌生,只要寫HTML,都有DTD的影子。

 

如果我們來定義xhtml的一些元素,看是否能夠定義出來。

 

Html<!ELEMENT html (head,body)>

Ul<!ELEMENT ul (li+)>

 

 

結論:xhtml其實一種特殊的XML文檔。

 

很多人沒有遵循xhtml的規范,也沒有問題,為何?

因為它使用的是傳統的過渡型的xhtml,所以兼容與老的html的寫法。

 

7.留兩個練習(參考PPT:

 

(1).給定DTD,編寫對應的xml文檔,並進行驗證

 

對應的xml文檔如下:

 

 

Dtd如下:

 

 

 

(2).對給定的xml文檔,編寫對應DTD

 

使用外部DTD的方式,

Xml文檔如下:

對應的dtd定義如下:

 

.DOM方式操作XML

 

為什么要操作xml

 

Xml 的作用:保存數據、交換數據。

 

由於xml在瀏覽器中直接顯示的效果是非常難看的。所以實際上,不會直接在瀏覽器中顯示,而是先經過一系列的處理,然后是以html的方式顯示在頁面中。

 

關於操作xml的方式十分的多,

 

 

1.什么是DOM

 

1.什么是DOM

DOMDocument Object Model,文檔對象模型

如何理解呢?

 

ü DDocument,文檔本身,包括xmlhtml文檔

ü OObject,對象,對象有屬性和方法,通過屬性和方法就可以完成相應的一些操作

ü MModel,模型,這里的模型是指樹模型。將文檔中的元素、屬性和文本轉成樹模型中的元素節點、屬性節點和文本節點。每一個節點都是一個對象。

 

過程:xml文檔---> 轉成樹模型 ---> 將其轉換回來

 

WOMWorld Object Model,世界對象模型

 

DOM提供了一系列的API,通過它可以完成對xml/html的增刪改查等操作。

 

ü DOMDocument Object Model,文檔對象模型)定義了訪問和操作文檔的標准方法。

ü DOM是一個平台,一個中立於語言的應用程序編程接口 (API),允許程序訪問並更改文檔的內容、結構和樣式。

ü DOM標准是由W3C World Wide Web Consortium)組織制定的。

 

2.DOM操作XML步驟

步驟,分為三大步:

具體完成,需要用到如下四個對象:

首當其沖是 DOMDocument對象

3.DOM操作原理解析

[需求]:將bookstore.xml文檔中的內容以表格的形式輸出到瀏覽器上,如圖所示:

 

載入文檔之后,可以使用getElementsByTagName方法獲取元素,如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM