# javascript快速入門24--XML基礎
## XML簡介
XML代表Extensible Markup Language(eXtensible Markup Language的縮寫,意為可擴展的標記語言)。XML 被設計用來傳輸和存儲數據。XML是一套定義語義標記的規則,這些標記將文檔分成許多部件并對這些部件加以標識。它也是元標記語言,即定義了用于定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。
### XML特點
* 標記需要自己去創建!一個最大的特殊處(與HTML不同處),它可以創建標簽,包括使用中文標簽
* 語法更嚴格!標簽必需成對嵌套,并且屬性必須有屬性值,屬性值也必須包含在引號中
* XML僅僅用來存儲數據,不包含與數據顯示相關的樣式信息(這部分信息可以通過CSS等語言來傳遞),XML是具有語義的
## 書寫XML
一個完整的XML必須包含XML聲明與一個文檔根元素!XML聲明必須包含版本信息,文檔根元素可以是空元素,但一個XML文檔只能有一個根元素!
```
<?xml version="1.0"?>
<root />
```
**注意:XML目前存在1.0與1.1兩個版本,但瀏覽器只支持1.0版. XML聲明的version屬性是必須的. XML聲明之前不能有任何東西,比如空格及注釋(XML注釋和HTML注釋是一樣的).XML文檔只能且必須包含一個根元素,當元素是空元素時需要閉合**
XML聲明還有其它兩個屬性:standalone與encoding.encoding屬性用來指明XML文檔所使用的字符編碼,如指定為gbk或gb2312則可以使用中文本,standalone屬性指明XML文檔是否獨立不依賴于外部文檔,默認值是yes,當使用外部XML DTD時需要將這個屬性設為no
## 格式良好的XML與有效的XML
格式良好的XML(Well-formed XML)是指文檔格式符合XML語法規范的XML,解釋器在解釋一個Not Well-formed XML的時會出現錯誤而停止!
一個遵守XML語法規則,并遵守相應DTD文件規范的XML文檔稱為有效的XML文檔(Valid XML)。注意我們比較"Well-formed XML"和"Valid XML",它們最大的差別在于一個完全遵守XML規范,一個則有自己的"文件類型定義(DTD)"。 將XML文檔和它的DTD文件進行比較分析,看是否符合DTD規則的過程叫validation(確認)。這樣的過程通常我們是通過一個名為parser的軟件來處理的。
## DTD——文檔類型定義(Document Type Definition)
由于XML可以自定義標簽,那么自然各人編寫的標簽不一樣,這樣同步數據便成了問題,因為其它人不知道某個標簽應該怎么用,表示什么意思.DTD就是為了解決此問題的!
DTD是一種保證XML文檔格式正確的有效方法,可以比較XML文檔和DTD文件來看文檔是否符合規范,元素和標簽使用是否正確。一個DTD文檔包含:元素的定義規則,元素間關系的定義規則,元素可使用的屬性,可使用的實體或符號規則。
DTD分為內部DTD與外部DTD,內部DTD包含在XML文檔中,外部DTD則通過URL引用.一個DTD文件是以.dtd結尾的文本文件
### 在XML中引入DTD DOCTYPE 文檔類型聲明
內部DTD,可以將standalone設置成yes.
```
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE root [
<!ELEMENT root EMPTY> ]>
```
外部DTD,需要將standalone設成no
```
<?xml version="1.0" standalone="no"?>
<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">
```
### DOCTYPE分析
DTD聲明始終以!DOCTYPE開頭,空一格后跟著文檔根元素的名稱,如果是內部DTD,則再空一格出現[],在中括號中是文檔類型定義的內容. 而對于外部DTD,則又分為私有DTD與公共DTD,私有DTD使用SYSTEM表示,接著是外部DTD的URL. 而公共DTD則使用PUBLIC,接著是DTD公共名稱,接著是DTD的URL.下面是一些示例
公共DTD,DTD名稱格式為"注冊//組織//類型 標簽//語言","注冊"指示組織是否由國際標準化組織(ISO)注冊,+表示是,-表示不是."組織"即組織名稱,如:W3C; "類型"一般是DTD,"標簽"是指定公開文本描述,即對所引用的公開文本的唯一描述性名稱,后面可附帶版本號。最后"語言"是DTD語言的ISO 639語言標識符,如:EN表示英文,ZH表示中文,在下面的地址有完整的ISO 639語言標識符列表[http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt](http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt)
```
<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">
```
下面是XHTML 1.0 Transitional的DTD.以!DOCTYPE開始,html是文檔根元素名稱,PUBLIC表示是公共DTD,后面是DTD名稱,以-開頭表示是非ISO組織 組織名稱是W3C,EN表示DTD語言是英語,最后是DTD的URL
```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml/DTD/xhtml1-transitional.dtd">
```
## **注意:雖然DTD的文件URL可以使用相對URL也可以使用絕對URL,但推薦標準是使用絕對URL.另一方面,對于公共DTD,如果解釋器能夠識別其名稱,則不去查看URL上的DTD文件**
### 開始編寫DTD
#### XML 文檔構建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模塊構成:
* 元素 , 元素即所說的自定義標簽,它是 XML 以及 HTML 文檔的主要構建模塊。
* 屬性 , 屬性可提供有關元素的額外信息。屬性總是被置于某元素的開始標簽中。屬性總是以名稱/值的形式成對出現的。
* 實體 , 實體是用來定義普通文本的變量。實體引用是對實體的引用。如HTML文檔中的 即是一個實體引用當文檔被 XML 解析器解析時,實體就會被展開。
* PCDATA , PCDATA 的意思是被解析的字符數據(parsed character data)。可把字符數據想象為 XML 元素的開始標簽與結束標簽之間的文本。PDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。文本中的標簽會被當作標記來處理,而實體會被展開。不過,被解析的字符數據不應當包含任何&、< 或者 > 字符;需要使用 &、< 以及 > 實體來分別替換它們。
* CDATA , CDATA 的意思是字符數據(character data)。CDATA 是不會被解析器解析的文本。在這些文本中的標簽不會被當作標記來對待,其中的實體也不會被展開。
#### CDATA
PCDATA是指會被解析的字符串,這解析是指將其中的實體引用換成對應的實體內容.也就是說,一般的XML中的文本節點都是PCDATA,當這些文本中要包含一些XML特殊字符時,需要使用實體引用,當這些字符很少時,使用實體引用還不是很麻煩,而當特殊字符很多時,則需要使用CDATA,即不解析字符串. CDATA 區段開始于 "<![CDATA[",結束于 "]]>",CDATA段中可以包含除CDATA限定符之外的任何字符
#### 元素聲明
元素聲明使用<!ELEMENT 元素名稱 (元素內容)>或<!ELEMENT 元素名稱 類別>的語法
```
<!ELEMENT root EMPTY> //EMPTY關鍵字表示元素是個空元素 <!ELEMENT root ANY> //ANY關鍵字表示元素中可以出現任何內容,也可以為空
//下面這個聲明表示root中可以有文本,也可以是空 <!ELEMENT root (#PCDATA)> //()表示一個分組,其中是放的允許在元素出現的內容,#PCDATA表示文本 <!ELEMENT root (child)> //child是子元素的名稱,這個聲明表示root中必須且只能有一個child元素 <!ELEMENT root (child1,child2)> //以逗號分隔,表示子元素依次出現 <!ELEMENT root (child1|child2)> //豎線與"OR"的意思相近,表示root元素中只能出現child1或child2 <!ELEMENT root (child?)> //root中child子元素可以出現一次,也可以不出現 <!ELEMENT root (child+)> //root中child子元素至少出現一次 <!ELEMENT root (child*)> //root中child子元素可以出現任意次數或不出現 <!ELEMENT root (child,(a,b))> //()還可以嵌套,這里表示root元素中第一次子元素必須是child
//緊接著是a或b <!ELEMENT root (child,(a,b)+)> //*,?,+這些量詞可作用于分組,這里表示root元素中第一次子元素必須是child
//緊接著是a或b出現一次或多次 <![CDATA[ ABC-abc-ABC><&;&//這個不并被替換成&吧 ]]>
```
#### 屬性聲明
屬性聲明使用<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>的語法.示例如下:
```
<!ATTLIST input type CDATA "text">
```
上面的屬性聲明表示:元素input的type屬性值是文本,默認值是text;
以下是屬性類型表
| 類型 | 描述 |
| --- | --- |
| CDATA | 值為字符數據 (character data) |
| (en1|en2|..) | 此值是枚舉列表中的一個值 |
| ID | 值為唯一的 id |
| IDREF | 值為另外一個元素的 id |
| IDREFS | 值為其他 id 的列表 |
| NMTOKEN | 值為合法的 XML 名稱 |
| NMTOKENS | 值為合法的 XML 名稱的列表 |
| ENTITY | 值是一個實體 |
| ENTITIES | 值是一個實體列表 |
| NOTATION | 此值是符號的名稱 |
| xml: | 值是一個預定義的 XML 值 |
默認值參數可以使用下列值
| 值 | 解釋 |
| --- | --- |
| 值 | 屬性的默認值.該屬性可以出現,也可以不出現,當沒有明確指定該屬性時,屬性值使用默認值 |
| #REQUIRED | 屬性值是必需的 |
| #IMPLIED | 屬性不是必需的,可以出現,可以不出現 |
| #FIXED value | 屬性值是固定的.屬性可有可無,但有的時候,其值必須是value |
```
<!ATTLIST img src CDATA #REQUIRED> //img元素的src屬性是必須的,值為字符串 <!ATTLIST script type CDATA "text/javascript"> //script元素的type屬性默認值是text/javascript <!ATTLIST div id ID #IMPLIED> //div元素的id屬性是唯一的ID標識,可有可無 <!ATTLIST input type(text|radio|checkbox) "text"> //input元素的type屬性是三個值中的一個,默認值是text <!ATTLIST label for IDREF #IMPLIED> //label元素的for屬性是頁面中另一個元素的ID
```
#### 實體聲明
##### 一般實體
實體是用于定義用于定義引用普通文本或特殊字符的快捷方式的變量。實體引用是對實體的引用。實體可在內部或外部進行聲明。
一個內部實體是以<!ENTITY 實體名稱 "實體的值">的形式聲明的,一個外部私有實體是以<!ENTITY 實體名稱 SYSTEM "URI/URL">格式聲明 ,一個外部公共實體是以 <!ENTITY 實體名稱 PUBLIC "公共實體名稱" "URI/URL"> ,其中公共實體名稱和DOCTYPE中的公共DTD名稱格式是一樣的. 一個實體引用是&實體名稱;格式
```
//實體定義 <!ENTITY abc "ABCabcABC"> //內部實體 <!ENTITY abc SYSTEM "abc.ent"> //外部私有實體 <!ENTITY test PUBLIC "-//AjaxLife//ENTITIES TEST 1 for XML//EN" "test.ent"> //外部公共實體
//實體引用 <abc>&abc;</abc>
```
##### 參數實體
參數實體是只在DTD中使用的實體(并且參數實體只能在外部DTD中聲明),它的聲明語法與一般實體不同處在于其要在實體名稱前加個百分號,而引用時則使用%實體名稱;的形式
```
<!ENTITY % abc "root">
<!ELEMENT %abc; (child)>//這句將聲明元素root,具有一個子元素child
```
### XML 命名空間
XML 命名空間可提供避免元素命名沖突的方法。由于 XML 中的元素名是預定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。命名空間其實就是給這些標簽名加個前綴!
```
<root>
<svg:template />
<xsl:template />
</root>
```
現在,root下仍然是兩個template元素,它們的節點名稱仍然是template,但是它們的意義不一樣了,因為它們使用了不同的前綴!但是XML命名空間前綴需要聲明才可以使用,如果不聲明,則被視為元素名稱的一部分! XML 命名空間屬性被放置于某個元素的開始標簽之中,并使用以下的語法:xmlns:namespace-prefix="namespaceURI" . 當一個命名空間被定義在某個元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。 注意,用于標示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向某個實存的網頁,這個網頁包含著有關命名空間的信息。
```
<root xmlns:svg="http://www.svg.org" xmlns:xsl="http://www.xsl.org">
<svg:template />
<xsl:template />
</root>
```
這樣,為了區分那些名稱相同而含義不同的元素,必須在每個元素名前面加前綴.其實還可以在父級元素上聲明默認命名空間,讓所有沒有前綴子元素的默認使用此命名空間.HTML的命名空間便是一個例子.
```
<html xmlns="http://www.w3.org/1999/xhtml">
</html>
```
## **對于使用命名空間的XML文檔,其DTD中對元素的聲明也應該包含命名空間前綴(即應與文檔中所書寫的一致).另外,命名空間不但作用于元素,還作用于屬性**
- 介紹
- HTML/CSS 教程
- 第 1 章 HTML5 概述
- 第 2 章 基本格式
- 第 3 章 文本元素
- 第 4 章 超鏈接和路徑
- 第 5 章 分組元素
- 第 6 章 表格元素
- 第 7 章 文檔元素
- 第 8 章 嵌入元素
- 第 9 章 音頻和視頻
- 第 10 章 表單元素[上]
- 第 10 章 表單元素[中]
- 第 10 章 表單元素[下]
- 第 11 章 全局屬性和其他
- 第 12 章 CSS 入門
- 第 13 章 CSS 選擇器[上]
- 第 14 章 CSS 顏色與度量單位
- 第 15 章 CSS 文本樣式[上]
- 第 15 章 CSS 文本樣式[下]
- 第 16 章 CSS 盒模型[上]
- 第 16 章 CSS 盒模型[下]
- 第 17 章 CSS 邊框與背景[上]
- 第 17 章 CSS 邊框與背景[下]
- 第 18 章 CSS 表格與列表
- 第 19 章 CSS 其他樣式
- 第 20 章 CSS3 前綴和 rem
- 第 21 章 CSS3 文本效果
- 第 21 章 CSS3 文本效果
- 第 23 章 CSS3 邊框圖片效果
- 第 24 章 CSS3 變形效果[下]
- 第 25 章 CSS3 過渡效果
- 第 26 章 CSS3 動畫效果
- 第 27 章 CSS 傳統布局[上]
- 第 27 章 CSS 傳統布局[下]
- 第 28 章 CSS3 多列布局
- 第 29 章 CSS3 彈性伸縮布局[上]
- 第 29 章 CSS3 彈性伸縮布局[中]
- 第 29 章 CSS3 彈性伸縮布局[下]
- 第 30 章 使用 Emmet 插件
- Bootstrap 教程
- 第 1 章 Bootstrap 介紹
- 第 2 章 排版樣式
- 第 3 章 表格和按鈕
- 第 4 章 表單和圖片
- 第 5 章 柵格系統
- 第 6 章 輔組類和響應式工具
- 第 7 章 圖標菜單按鈕組件
- 第 8 章 輸入框和導航組件
- 第 9 章 路徑分頁標簽和徽章組件
- 第 10 章 巨幕頁頭縮略圖和警告框組件
- 第 11 章 進度條媒體對象和 Well 組件
- 第 12 章 列表組面板和嵌入組件
- 第 13 章 模態框插件
- 第 14 章 下拉菜單和滾動監聽插件
- 第 15 章 標簽頁和工具提示插件
- 第 16 章 彈出框和警告框插件
- 第 17 章 按鈕和折疊插件
- 第 18 章 輪播插件
- 第 19 章 附加導航插件
- 第 20 章 項目實戰--響應式導航[1]
- 第 20 章 項目實戰--響應式輪播圖[2]
- 第 20 章 項目實戰--首頁內容介紹[上][3]
- 第 20 章 項目實戰--首頁內容介紹[下][4]
- 第 20 章 項目實戰--資訊內容[5,6]
- 第 20 章 項目實戰--案例和關于[7]
- javaScript 教程
- javascript快速入門1--JavaScript前世今生,HelloWorld與開發環境
- javascript快速入門2--變量,小學生數學與簡單的交互
- javascript快速入門3--分支判斷與循環
- javascript快速入門4--函數與內置對象
- javascript快速入門5--數組與對象
- javascript快速入門6--Script標簽與訪問HTML頁面
- javascript快速入門7--ECMAScript語法基礎
- javascript快速入門8--值,類型與類型轉換
- javascript快速入門9--引用類型
- javascript快速入門10--運算符,語句
- javascript快速入門11--正則表達式
- javascript快速入門12--函數式與面向對象
- javascript快速入門13--BOM——瀏覽器對象模型(Browser Object Model)
- javascript快速入門14--DOM基礎
- javascript快速入門15--節點
- javascript快速入門15--表單
- javascript快速入門16--表格
- javascript快速入門17--事件
- javascript快速入門18--樣式
- javascript快速入門19--定位
- javascript快速入門20--Cookie
- javascript快速入門21--DOM總結
- javascript快速入門22--Ajax簡介
- javascript快速入門23--XHR—XMLHttpRequest對象
- javascript快速入門24--XML基礎
- javascript快速入門25--瀏覽器中的XML
- javascript快速入門26--XPath
- javascript快速入門27--XSLT基礎
- PHP 教程
- 第一章 如何加載運行已發布的PHP項目
- 第二章 PHP基礎
- 第三章 操作符與控制結構
- 第四章 數學運算
- 第五章 數組
- 第六章 目錄與文件
- 第七章 自定義函數
- 第八章 字符串處理
- 第九章 正則表達式
- 第十章 日期與時間
- 第十一章 表單與驗證
- 第十二章 會話控制
- 第十三章 上傳文件
- 第十四章 處理圖像
- 第十五章 MySQL 數據庫
- 第十六章 PHP 操作MySQL
- 第十七章 面向對象基礎
- 第十八章 面向對象的特性
- 第十九章 面向對象的工具