Xml基礎(chǔ)詳解
Xml:可擴展標(biāo)記語言 (Extensible Markup Language, XML) ,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進行定義的源語言。 XML是標(biāo)準(zhǔn)通用標(biāo)記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統(tǒng)一的方法來描述和交換獨立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。
Xml的基本語法:
1 任何的起始標(biāo)簽都必須有一個結(jié)束標(biāo)簽。
2 可以采用另一種簡化語法,可以在一個標(biāo)簽中同時表示起始和結(jié)束標(biāo)簽。這種語法是在大于符號之前緊跟一個斜線(/),例如<tag/ >。XML解析器會將其翻譯成<tag></tag>。
3 標(biāo)簽必須按合適的順序進行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽,例如this is a samplestring。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號:在沒有關(guān)閉所有的內(nèi)部括號之前,是不能關(guān)閉外面的括號的。
4 所有的特性都必須有值。
5 所有的特性都必須在值的周圍加上雙引號。
6.對于XML文檔來說,<?處理指令必須要頂格寫,前面不能有任何的空白。
7. XML元素可以具有屬性,屬性的形式為:
屬性名=”屬性值”,比如gender=”male”
屬性值需要使用單引號或雙引號括起來。多個屬性之間使用空格分開。
8. 通過樣式,我們可以實現(xiàn)XML內(nèi)容與展現(xiàn)形式的分離
9. XML的注釋:<!-- comments --> ,注釋不允許嵌套
10. 在一個元素上,相同的屬性只能出現(xiàn)一次。
注意以下幾點:
1.XML中的每個元素都是成對出現(xiàn)的(有開始,有結(jié)束),<student> </student>,XML中的元素嵌套關(guān)系要保持正確性,即先開始的標(biāo)記要先結(jié)束,后開始的標(biāo)記要后結(jié)束。
2. 每一個XML文檔都有且只有一個根元素(Root Element)。所謂根元素,就是唯一一個包含了其他所有元素的元素。
3. XML描述的是文檔的內(nèi)容與語義,而不是文檔應(yīng)當(dāng)如何顯示。
4.格式正規(guī)(well formed)的XML文檔。符合XML語法要求的XML文檔就是格式正規(guī)的XML文檔。
5. 有效的(valid)XML文檔。首先XML文檔是個格式正規(guī)的XML文檔,然后又需要滿足DTD的要求,這樣的XML文檔稱為有效的XML文檔
6. #PCDATA (Parsed Character Data),可解析的字符數(shù)據(jù)。
XML文件的驗證機制——DTD
文檔類型定義(DTD)可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來定義文檔的結(jié)構(gòu)。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
假如 DTD 被包含在您的 XML 源文件中,它應(yīng)當(dāng)通過下面的語法包裝在個DOCTYPE 聲明中:
<!DOCTYPE根元素 [元素聲明]>
帶有 DTD 的 XML 文檔實例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)> ]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
以上 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" 類型
假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過下面的語法被封裝在一個 DOCTYPE 定義中: <!DOCTYPE 根元素 SYSTEM "文件名"> 這個 XML 文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD:
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
這是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
下面來看一下DTD在xml每一個模塊中的定義:
在一個 DTD 中,元素通過元素聲明來進行聲明。
聲明一個元素
在 DTD 中,XML 元素通過元素聲明來進行聲明。元素聲明使用下面的語法:
<!ELEMENT 元素名稱 類別>
或者 <!ELEMENT 元素名稱 (元素內(nèi)容)>
空元素
空元素通過類別關(guān)鍵詞EMPTY進行聲明:
<!ELEMENT 元素名稱 EMPTY>
只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行聲明: <!ELEMENT 元素名稱 (#PCDATA)>
帶有任何內(nèi)容的元素
通過類別關(guān)鍵詞 ANY 聲明的元素,可包含任何可解析數(shù)據(jù)的組合: <!ELEMENT 元素名稱 ANY>
帶有子元素(序列)的元素
帶有一個或多個子元素的元素通過圓括號中的子元素名進行聲明: <!ELEMENT 元素名稱 (子元素名稱 1)> 或者 <!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>
語法格式為: <!ELEMENT element-name (child-name+)>
例: <!ELEMENT note (message+)>
例中的+是指子元素message必須在被包含的note元素里出現(xiàn)一次或者多次。
語法格式為:
<!ELEMENT element-name (child-name*)>
例: <!ELEMENT note (message*)>
例中的*是指子元素message能夠在被包含的note元素里不出現(xiàn)或者出現(xiàn)多次。
在 DTD 中,屬性通過 ATTLIST 聲明來進行聲明。
聲明屬性
屬性聲明擁使用下列語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
以下是屬性類型的選項:
類型 描述
CDATA 值為字符數(shù)據(jù) (character data)
(en1|en2|..) 此值是枚舉列表中的一個值
ID 值為唯一的 id
IDREF 值為另外一個元素的 id
IDREFS 值為其他 id 的列表
NMTOKEN 值為合法的 XML 名稱
NMTOKENS 值為合法的 XML 名稱的列表
ENTITY 值是一個實體
ENTITIES 值是一個實體列表
NOTATION 此值是符號的名稱
xml: 值是一個預(yù)定義的 XML 值
默認值參數(shù)可使用下列值:
值 解釋
值 屬性的默認值
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性值是固定的
規(guī)定一個默認的屬性值
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
在上面的例子中,"square" 被定義為帶有 CDATA 類型的 "width" 屬性的空元素。如果寬度沒有被設(shè)定,其默認值為0 。
實體是用于定義引用普通文本或特殊字符的快捷方式的變量。 實體引用是對實體的引用。
實體可在內(nèi)部或外部進行聲明。
語法:
<!ENTITY 實體名稱 "實體的值">
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright >
具體的url">XML 例子: <author>&writer;?right;</author>
注釋: 一個實體由三部分構(gòu)成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
語法:
<!ENTITY 實體名稱 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer SYSTEM "具體的url">
<!ENTITY copyright SYSTEM "具體的url">XML
例子: <author>&writer;?right;</author>