一.XML基本概念
1.什么是xml
XML:eXtensible Markup Language,可擴展標記語言
標記語言
Html,xhtml,html5,xml

不同點:xml和html系列
ü 目的不同,html用於顯示,xml用於傳輸數據庫
ü 內容不同,html有預定義好的標簽,而xml沒有,所有的都需要自己來定義。
可擴展
所謂可擴展,就是可以自己定義標簽。如圖:

實際上,在xml中,所有的標簽都是需要自己來定義。
ü XML 指可擴展標記語言,是獨立於軟件和硬件的信息傳輸工具。
ü XML 是一種標記語言,很類似 HTML。
ü XML 的設計宗旨是傳輸數據,而非顯示數據
ü XML 標簽沒有被預定義。您需要自行定義標簽。
ü XML 被設計為具有自我描述性。
ü XML 是 W3C 的推薦標准。
2.xml的作用
主要是兩大塊:
數據存儲
數據傳輸(交換)

存儲方面:
ü 配置文件,如qq、feiq、迅雷
ü 小型數據庫,對於一些不經常變化的數據(數據量不是很大),可以使用xml來保存
數據傳輸方面:
ü Ajax:Asynchronous JavaScript and xml,異步的js和xml
ü Web service:web 服務 天氣預報、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.文檔聲明
通常有兩個屬性:
ü version:xml的版本,目前是1.0
ü encoding:字符集編碼,選擇utf-8即可。
ü standalone:用來表示該文件是否呼叫其它外部的文件(DTD或schema),取值范圍:yes/no yes:沒有呼叫,默認yes
要注意的一個問題,就是編碼的問題。
3.命名規則
由於所有的標簽和屬性都是自己來定義,意味着我們需要給他們命名。
ü 名稱可以含字母、數字以及其他的字符
ü 名稱不能以數字或者標點符號開始
ü 名稱不能以字符 “xml”(或者 XML、Xml)開始
ü 名稱不能包含空格
ü 可使用任何名稱,沒有保留的字詞。
☞ 注意事項
ü 避免 "-" 字符。如:"first-name",一些軟件會認為你需要提取第一個單詞。
ü 避免 "." 字符。如:"first.name",一些軟件會認為 "name" 是對象 "first" 的屬性。
ü 避免 ":" 字符。冒號會被轉換為命名空間來使用。
命名要見名知意,盡量簡潔。book_title √, the_title_of_the_book (x)
4.定義元素
在xml中, 有三種節點:
ü 元素節點
ü 屬性節點
ü 文本節點
元素,有時候稱之為標簽。類似xhtml中的標簽。
5.定義屬性
屬性是依賴於某個元素而存在的,像寄生蟲一樣。
定義,一定是在元素的開始標簽中進行定義的。
如圖:

需要有一些注意的地方:
ü 一個元素可以有多個屬性
ü 元素的屬性不能重復
ü 所有的屬性都應該用引號包含
ü 凡是屬性都可以使用子元素的方式來表示。
格式: <元素名稱> </元素名稱> <元素名稱 />
所有的元素都是自己來定義的。
重點是元素的表現(構成)形式:
ü 僅包含元素的元素,如bookstore元素
ü 僅包含文本的元素,如author和year等元素
ü 包含文本和元素的混合的元素,如title元素

需要有一些注意的地方:
ü 一個元素可以有多個屬性
ü 元素的屬性不能重復
ü 所有的屬性都應該用引號包含
ü 凡是屬性都可以使用子元素的方式來表示。

用屬性來表示元素,有以下缺點:
ü 屬性無法包含多重的值(元素可以)
ü 屬性無法描述樹結構(元素可以)
ü 屬性不易擴展(為未來的變化)
ü 屬性難以閱讀和維護
ü 請盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
<file type="gif">computer.gif</file>
以數據庫中的表為例:
user表
id username passaword
1 jordan 23
2 beckham 7
3 jackson 99
在具體處理的時候,和業務邏輯相關的有username和password,而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文檔是否是合法的,通常有兩種技術:
ü DTD:Document Type Definition,文檔類型定義,目前使用最多的,簡單
ü schema: XSD XML Schema Definition,文檔結構定義,未來的趨勢,功能強大
我們要學習的DTD。
2.快速入門
對於xml的驗證,需要用到DTD。此時,就產生了兩個東西:dtd和xml文檔
(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或多個
ü ?,0或1個
看一個案例,以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
DOM:Document Object Model,文檔對象模型
如何理解呢?
ü D:Document,文檔本身,包括xml和html文檔
ü O:Object,對象,對象有屬性和方法,通過屬性和方法就可以完成相應的一些操作
ü M:Model,模型,這里的模型是指樹模型。將文檔中的元素、屬性和文本轉成樹模型中的元素節點、屬性節點和文本節點。每一個節點都是一個對象。
過程:xml文檔---> 轉成樹模型 ---> 將其轉換回來
WOM:World Object Model,世界對象模型
DOM提供了一系列的API,通過它可以完成對xml/html的增刪改查等操作。
ü DOM(Document Object Model,文檔對象模型)定義了訪問和操作文檔的標准方法。
ü DOM是一個平台,一個中立於語言的應用程序編程接口 (API),允許程序訪問並更改文檔的內容、結構和樣式。
ü DOM標准是由W3C (World Wide Web Consortium)組織制定的。
2.DOM操作XML步驟
步驟,分為三大步:

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

首當其沖是 DOMDocument對象

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

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

