☆
什么是XML Top
XML 代表Extensible Markup Language(eXtensible Markup Language的縮寫,意為可擴展的標記語言)。XML是一套定義語義標記的規則,這些標記將文檔分成許多部件并對這些部件加以標識。它也是元標記語言,即定義了用于定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。和HTML一樣,XML同樣來源于SGML(Standard Generalized Markup language,即標準通用標記語言)。
☆
XML產生的背景 Top
在Web未發明之前,SGML就早已存在。正如它的名稱所言,SGML是一種用標記來描述文檔資料的通用語言,它包含了一系列的文檔類型定義(簡稱DTD),DTD 中定義了標記的含義,因而 SGML 的語法是可以擴展的。SGML十分龐大,既不容易學,又不容易使用,在計算機上實現也十分困難。鑒于這些因素,Web的發明者--歐洲核子物理研究中心的研究人員根據當時(1989年)計算機技術的能力,提出了HTML語言。
HTML只使用SGML中很小一部分標記,例如HTML 3.2定義了70種標記。為了便于在計算機上實現,HTML規定的標記是固定的,即HTML語法是不可擴展的,它不需包含DTD。HTML這種固定的語法使它易學易用,在計算機上開發 HTML的瀏覽器也十分容易。正是由于HTML的簡單性,使 Web 技術從計算機界走向全社會,走向千家萬戶,Web的發展如日中天。
近年來,隨著 Web的應用越來越廣泛和深入,人們漸漸覺得HTML不夠用了,HTML過于簡單的語法嚴重地阻礙了用它來表現復雜的形式。盡管HTML推出了一個又一個新版本,已經有了腳本、表格、幀等表達功能,但始終滿足不了不斷增長的需求。另一方面,這幾年來計算機技術的發展也十分迅速,已經可以實現比當初發明創造HTML時復雜得多的Web瀏覽器,所以開發一種新的Web頁面語言既是必要的,也是可能的。
有人建議直接使用SGML 作為Web語言,這固然能解決HTML遇到的困難。但是SGML太龐大了,用戶學習和使用不方便尚且不說,要全面實現SGML的瀏覽器就非常困難,于是自然會想到僅使用SGML的子集,使新的語言既方便使用又實現容易。正是在這種形勢下,Web標準化組織W3C建議使用一種精簡的SGML版本--XML應運而生了。
☆
XML特點 Top
1)簡潔有效,易學易用;
2)開放的國際標準;【下面幾個是以XML為基礎生成的數據描述語言(本文亦稱為XML應用語言)的應用例子,即出版媒體:Open eBook(電子書籍)、NewsML(新聞媒體);科學:MathML(數學表達式)、CML(化學);電子商務:cXML(電子商務)、FpML(金融);多媒體:SMIL(多媒體演示)、BML(衛星數據傳送) 】
3)高效且可擴展;【可以創建自己的數據類型】
4)使搜索更有意義【XML是自描述語言,能夠自己體現數據的含意】;
5)作為數據交換的標準。能夠實現不同平臺,不同領域的數據交換;【XML是以文本形式來描述的一種文件格式 由于XML是以文本形式描述的,所以適合于各種平臺環境的數據交換。同樣由于使用文本來描述內容,可以越過不同平臺的障礙進行正常的數據交換。但是,文本形式也會因為文字代碼的不同造成不能閱讀的問題,在這一點上XML有著非常完美的解決方案。】
6)數據的局部更新【當頁面上局部數據需要更新的時候,服務器只需將變化的元素發送給客服端,而不需要整個內容重新發送】
7)使數據與顯示分離。【XML主要是描述數據本身,而顯示可以使用其他方式來體現,例如CSS,XSL等】
8)XML 文檔可使用已為 HTML 建立的很多基礎結構,包括 HTTP 協議和某些瀏覽器。HTTP 允許穿過防火墻傳輸 XML。
☆
良好結構的XML的規則 Top
1)文檔第一步做聲明。例如缺少這個聲明,會引起瀏覽器錯誤理解,將XML文件誤認為是默認的HTML文件,而不會調用相應的XML解析器來對文件進行解釋。
<?:表示聲明的開始。
xml:表示文件格式,區別于其他文件,如:HTML,VRML。
version:XML的版本信息,默認值是1.0。
standalone:是否允許文件作者使用B定義文件類型,它有兩個值,"yes"和"no",表示是否需要從外部導入文件。
encoding:默認值是UTF-8(通用字符),如果要使用UTF-8以外的編碼方式,在這里指定,例如國標碼"GB2312"。(注意:不是所有XML軟件都支持GB2312,XML標準只規定必須支持UTF-8和UTF-16兩種編碼,其他編碼自行決定)
?>:這個符號表示聲明的結束。
2)文件必須包含至少一個元素或標記。
3)每個開始標記必須和結束標記配套使用,不含數據并且僅使用一個標記的元素必須以/>結束。例如<a>link</a>或者<input ……/>。
4)文件中必須包含惟一的打開和關閉標記,即根元素。文件中的所有其他標記都必須包含在這兩個標記中。
5)標記之間不能重疊,或者說是交叉定義。
6)屬性值必須加引號。
☆
XML命名規則 Top
<!--
XML名以下劃線或字母開始;
XML名可包含字母、數字、句點、下劃線和冒號;
XML名不能包含空格;
XML名不能以數字開始,但可包含數字;
XML名區分大小寫。
-->
☆
XML文檔中需要轉義的字符 Top
小于號<【<】
大于號>【>】
符號&【&】
單引號'【'】
雙引號"【"】
☆
XML文檔的組成 Top
XML聲明:<?xml version="1.0" standalone="yes"?>
根元素:每篇XML文檔有且只能有一個根元素。由元素是文檔的第一個元素,包含其它所有元素。
CDATA部分:它用<![CDATA[和]]>表示,它們之間的數據作為原始字符顯示,唯一不能出現的標志是]]>。
注釋:以<!--開頭-->結尾的一對區間。在以-->結束之前,不能出現"--"號。
處理指令:處理指令以<?開頭以?>結尾。如PHP處理指令可寫成,<?php
?>。處理指令是標記,而不是元素。因此,與注釋一樣,處理指令可出現在XML文檔的標簽外的任何位置,包括根元素之前或之后。最常見的處理指令是,xml-stylesheet樣式表指令,它會告訴瀏覽器在顯示文檔時應用什么樣式表。如:<?xml-stylesheet href="sample.css" type="text/css"?><portal><name>
</name>
</portal>
☆
CDATA與XML注釋 Top
CDATA
在CDATA內部的所有內容都會被解析器忽略,即所有的標記、實體引用都被忽略,而被XML處理程序一視同仁地當作字符數據看待。
1)一個 CDATA 部件以"<![CDATA[" 標記開始,以"]]>"標記結束:
2)CDATA部件之間不能再包含CDATA部件(不能嵌套)。
3)CDATA內部不能包含字符"]]>" 和"<![CDATA[" ,在字符串"]]>"之間沒有空格或者換行符。
例1:忽略實體
<?xml version="1.0" encoding="gb2312" ?>
<root>
<student>
<![CDATA[
<name>woxingwosu</name>
<sex>man</sex>
]]>
</student>
</root>
上面的name和sex不作為節點處理,而是當作字符數據。
例2:忽略標記
<?xml version="1.0" encoding="gb2312" ?>
<root>
<student>
<![CDATA[
You Can Enter < > As Data.
]]>
</student>
</root>
上面CDATA中的特殊符號不需要轉換
注釋
和HTML一樣,注釋用"<!--"和"-->"引起來的。
不過,在XML文件中使用注釋時,同樣要遵守幾個規則:
1)在注釋文本中不能出現字符"-"或字符串"--"。
2)不要把注釋文本放在標記之中。類似地,不要把注釋文本放在實體聲明中,也不要放在XML聲明之前。
3)注釋不能被嵌套。
例如:
<?xml version="1.0" encoding="gb2312" ?>
<root>
<!-- This is a test -->
<student>hello</student>
</root>
☆
XML與HTML Top
XML與HTML的關系
1)XML 不是要替換 HTML,實際上 XML 可以視作對 HTML 的補充。XML 和 HTML 的目標不同:HTML 的設計目標是顯示數據并集中于數據外觀,而 XML 的設計目標是描述數據并集中于數據的內容。
2)與 HTML 相似,XML 不進行任何操作。雖然 XML 標記可用于描述訂單之類的項的結構,但它不包含可用于發送或處理該訂單以及確保按該訂單交貨的任何代碼。其他人必須編寫代碼來實際對 XML 格式的數據執行這些操作。
3)與 HTML 不同,XML 標記由架構或文檔的作者定義,并且是無限制的。HTML 標記則是預定義的;HTML 作者只能使用當前 HTML 標準所支持的標記。
XML與HTML語法上的區別
1)大小寫有所區分;
2)要有正確的結束標記;
3)標記要正確嵌套;
3)有效使用屬性;在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。
4)標記中可以包含任意多個屬性。在標記中,屬性以名稱/取值對出現,屬性名不能重復,名稱與取值之間用等號"="分隔,且取值用引號引起來。
☆
使用DTD校驗文件的四種方式 Top
1)在文檔內部使用
<!DOCTYPE 根元素名稱 [<!ELEMENT 元素 ……>]>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal [<!ELEMENT root (name,reg*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>]>
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
2)使用本機的DTD文件校驗:
<!DOCTYPE 根元素名稱 SYSTEM "DTD文件的URI">,SYSTEM 表示文檔使用的是私有DTD文件,URI可以為相對路徑或絕對路徑。
root.dtd
<!ELEMENT root (name,reg*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>
root.xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
3)使用外部的DTD校驗:
<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" "外部DTD文件的URI">
PUBLIC關鍵字用于聲明公共DTD,DTD名稱也稱為公共標識符(public identifier)。這種DTD可以存在在一個公共的地方,xml處理程序會根據名稱按照某種方式去檢索DTD,如果xml處理程序不能根據名稱檢索到DTD,就會按照外部DTD的URI來查找DTD。
DTD名稱和xml名稱略有不同,它只可以包含ascII字母和數字、空格、回車符、換行符和一些標點符號:-'()+,./:=?;!*#@$_% 。且公共DTD的名稱需遵守一些約束。
如果一項DTD是ISO標準,它的名稱要以字符串"ISO"開始;
如果是一個非ISO的標準組織,則以加號(+)開始;
如果不是標準組織批準的DTD,它的名稱以連字符(-)開始。之后是 //DTD所有者的名稱//DTD的描述信息//語言標識符。
例如用DW建立一個HTML文件的開頭就有:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">還有strus1的配置文件也有:<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
可以根據后面的URI地址把DTD文件下載下來看,可以深入了解文檔的結構。
4)同時在文檔內部和DTD來校驗
我們可以結合內外dtd,共同組成一個dtd來為XML文檔作驗證。
root.dtd
<!ELEMENT root (name,reg*)>
root.xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal SYSTEM "root.dtd" [<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>]>
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
注意,使用內外dtd時,這兩個dtd要互相兼容,不能有沖突。
☆
DTD語法規則 Top
一個完全意義上的XML文檔不僅僅是“格式良好的”,而且還應該是使用了一些自定義標記的“有效的”XML文檔,也就是說,它必須遵守文檔類型定義中已聲明的規則。XML是在SGML基礎上發展起來的,而SGML是用DTD來定義數據的格式和規則。
文檔類型定義DTD(Document Type Definition)描述了一個語言的語法和詞匯表,也就是定義了文檔的整體結構以及文檔的語法。簡而言之,DTD規定了一個語法分析器以解釋一個“有效的”XML文檔所需要知道的所有規則的細節。
一個DTD可以是內部的,包含在XML文檔的前導說明部分;也可以是外部的,作為一個外部文檔被引用。
一個包含內部DTD的XML文檔的結構為:
內部DTD是在XML文件的文件序言區域中定義的。主要由兩部分組成,結構部分和元素部分。
1)結構語法: <!DOCTYPE element-name[……]>
<!DOCTYPE:表示開始設定DTD
Element-name:指定此DTD的根元素的名稱,一個XML文件只能有一個根元素。注意,如果 XML文件使用了DTD,那么文件中的根元素就在這里指定。
[]> :在[ ]標記里面定義XML文件
2)元素語法:<!ELEMENT element-name element-definition>
<!ELEMENT:表示開始元素設置
element-name:表示要設置的元素的名稱。
element-definition:指明要對此元素進行怎樣的定義,就是說〈元素〉〈/元素〉之間能夠包含什么內容,是其他元素還是一般性的文字。
例如:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE student [name,sex]>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
3)元素聲明
#PCDATA:規定元素只包含已析的字符數據。
例如:<!ELEMENT name (#PCDATA)>表示name元素是一個文本節點(葉子節點)。
子元素:可指明元素的子元素。
例如:<!ELEMENT name (sonname)>表示name元素必須包含且只包含一個sonname元素。
也可用逗號為分隔符,指明多個子元素。并且子元素出現的次序必須按定義時的順序。
例如:<!ELEMENT name (name1,name2)>表示name元素包含且必須包含子元素name1和name2,且name1在name2之前。
子元素的個數:(和正則表達式中的含意一樣)
?:零個或一個該元素
*:零個或多個該元素
+:一個或多個該元素
例如:<!ELEMENT name (name1,name2?)>表示name元素必須包含name1子元素,可以不包含或者只包含一個name2元素。
可選項|:選項是一個參數列表,每個參數間用"|"分隔,代表能且只能選一個子元素,就是或者的意思。
例如:<!ELEMENT sex (man | women)>表示sex元素要么包含man子元素,否則必須包含women子元素。
小括號:小括號可以實現一個小的團體,以實現更復雜的結構。
例如:<!ELEMENT name (#PCDATA | student | teacher )* >。
空元素:不包含任何內容的元素,稱之為空元素,寫成以/>結束的獨立標簽,就如HTML中的<br/>。
<!ELEMENT name EMPTY>表示元素name沒有任何內容。
ANY:允許元素內包含任意內容。該選項在dtd測試時很有用,在實際運用中盡量不要使用。
例如:<!ELEMENT name ANY>
4)屬性類型
CDATA類型:屬性值可包含任意文本字符串。DTD不能指定屬性為一個整數或一個日期,Schema能提供更為強大的數據類型。
NMTOKEN類型:屬性值是一個XML名稱記號。XML名稱記號與XML名稱類似,但XML名稱記號允許所有的字符作為名稱的開始字符,而XML名稱的第一個字母必須是字母、表意字符和下劃線。因此10,.bashrc是合法的XML名稱標記,但不是合法的XML名稱。每個XML名稱都是一個XML名稱標記,然而XML名稱標記不全是XML名稱。如果屬性包含1990,2005之類的整數,則應該指定其類型為NMTOKEN。如:<!ELEMENT person birthday NMTOKEN #REQUIRED>
NMTOKENS類型:屬性包含一個或多個用空白分隔的XML名稱記號。如:<person dates="02-01-2005 03-01-2005 05-01-2005">person</person>對應的聲明應為:<!ATTLIST person dates NMTOKENS #REQUIRED>。另外,對01/02/2005這樣的形式不能使用該聲明,因為其中的正斜杠不是合法的名稱字符。
ATTLIST類型:屬性包含枚舉類型中的一個,直接列舉所有的值,中間用豎線分隔。如:<!ATTLIST date month(January | February | March | April | May | June | July | August | September | October | November | December) #REQUIRED>針對上述聲明,date元素的month屬性可選十二個月份的中一個。
ATTLIST聲明除了要提供一種數據類型外,還要聲明屬性的缺省行為。
#IMPLIED,屬性可選。
#REQUIRED,屬性必須有。
#FIXED,屬性是常量,不能更改。<!ATTLIST checkbox checked CDATA #FIXED "checked">表示checkbox元素的checked屬性必須是"checked"
Literal,作為一個引用字符串的實際缺省值。<!ATTLIST company name NMTOKEN "com.cn">如果沒有顯示指明company 元素的name屬性,則該值為"com.cn"。
ID類型:屬性必須包含一個XML名稱,而且該名稱在文檔中是獨一無二的。ID屬性可為元素分配一個唯一的標識符。<!ATTLIST name card_id ID #REQUIRED>由于數字不是合法的XML名稱,所以ID編號不能以數字開頭,解決辦法是在前面加下劃線或字母。
IDREF類型:屬性指向文檔中某元素的ID類型的屬性。因此,它必須是一個XML名稱,它的作用是當簡單的包含關系不能滿足要求時在元素間建立多對多關系。如:
<project project_id="p1">
<goal>deploy linux</goal>
<team_member person_card_id="c123">
</project>
<person card_id="c123">
<name>linuxsir</name>
<assignment project_project_id="p1">
</person>
對應的聲明如下:
<!ATTLIST person card_id ID #REQUIRED>
<!ATTLIST project project_id ID #REQUIRED>
<!ATTLIST team_member person_card_id IDREF #REQUIRED>
<!ATTLIST assignment project_project_id IDREF #REQUIRED>
IDREFS類型:屬性包含一個XML名稱列表。名稱間用空白間隔,且每個名稱都是文檔中某個元素的ID。當某個元素需要引用多個其他元素時使用該元素。如:
<!ATTLIST project project_id ID #REQUIRED team IDREFS #REQUIRED>
<!ATTLIST person card_id ID #REQUIRED>
對應的文檔可寫成:
<project project_id="p1" team="c123 c456">
<gold>deploy linux</gold>
</project>
<person card_id="c123">
<name>Linuxsir</name>
</person>
<person card_id="c456">
<name>Linuxsir</name>
</person>
ENTITY類型:屬性包含在DTD的其它位置聲明的未析實體的名稱中。如movie元素可能有一個標識激活時播放mpeg或rm文件的實體屬性:<!ATTLIST movie src ENTITY #REQUIRED>如果DTD聲明了一個名為play的未析實體,則此movie元素可用于在XML文檔中嵌入視頻文件:<movie src="play" />
ENTITY翻譯為"實體",如果學過C的宏定義就很容易理解。使用ENTITY的好處在于:1)它可以減少差錯,文檔中多個相同的部分只需要輸入一遍就可以了。2)它提高維護效率。比如你有40個文檔都包含copyright的ENTITY,如果需要修改這個copyright,不需要所有的文件都修改,只要改最初定義的ENTITY語句就可以了。實體分為兩種:普通實體和參數實體。
普通實體
例如:定義版權<!ENTITY copyright "mycompany.com">這樣可以用©right;引用字符串"mycompany.com"。
引用外部XML文檔<!ENTITY newxml SYSTEM "/home/linux/myxml.xml">這樣可以使用&newxml;引用/home/linux/myxml.xml文檔。但是如果引用的類型不是XML能識別(不是文本字符)的,如jpeg照片,mpeg電影等。XML建議使用外部未析實體作為在文檔中嵌入這些內容的機制。DTD為包含非XML數據的實體指定一個名稱和URI。例如<!ENTITY Logo SYSTEM "Logo.gif" NDATA gif><!NOTATION gif SYSTEM "image/gif">avi是在NOTATION中定義的MIME媒體類型。在XML中嵌入未析實體很復雜且不規范,盡量不要使用。
參數實體:可定義一組通用的實體,在文檔中可通過該參數實體來引用實體。參數實體的定義與通用實體定義類似,只是中間多了一個%,引用時也是用%代碼;。
例如:<!ENTITY % imgParam "width CDATE #FIXED '100px' height CDATA #IMPLIED"><!ATTLIST img %imgParam;>就等價于<!ATTLIST img width CDATE #FIXED '100px' height CDATA #IMPLIED>
注釋聲明
使用IGNORE關鍵字可注釋聲明,如:<![IGNORE[ <!ELEMENT note (#PCDATA)>]]>等價于<!-- <!ELEMENT note (#PCDATA)> -->。
使用申明
INCLUDE關鍵字表示DTD中使用給定的聲明,如:<![INCLUDE[ <!ELEMENT note (#PCDATA)>]]>等價于<!ELEMENT note (#PCDATA)>。有沒有使用INCLUDE效果都一樣,但如果組合INCLUDE和IGNORE,可實現DTD功能的選擇。<!ENTITY % note_allowed "INCLUDE" ><![%note_allowed;[ <!ELEMENT note (#PCDATA)>]]>這樣元素聲明是有效的,把參數實體%note_allowed重新定義為IGNORE,這樣,該元素聲明就無效。
ENTITIES類型:屬性包含在DTD的其它位置聲明的多個未析實體名稱,其間用空白隔開。<!ATTLIST slide_show slides ENTITIES #REQUIRED>如果DTD聲明了未析實體slide1、slide2、slide3、
,則可使用slide_show元素在XML文檔中嵌入幻燈片。<slide_show slides="slide1 slide2 slide3" />
NOTATION類型:屬性包含在文檔的DTD中聲明的某個記法的名稱。該屬性類型較少用。理論上,可以使用該屬性使某些特殊元素與類型相關聯,下例聲明為不同的圖像類型定義了4個記法,然后規定每個image元素都必須從中選擇一種type屬性。
<!NOTATION gif SYSTEM "image/gif">
<!NOTATION tiff SYSTEM "image/tiff">
<!NOTATION jpeg SYSTEM "image/jpeg">
<!NOTATION png SYSTEM "image/png">
<!ATTLIST image type NOTATION (gif | tiff | jpeg | png) #REQUIRED>
每個image元素的type屬性的值可以為gif,tiff,jpeg和png四個值中的一個。該屬性比枚舉類型稍具優勢,因為記法的實際MIME媒體類型在理論上是可用的。由于斜杠在XML名稱中不是一個合法字符,所以枚舉類型不能指定image/png或image/jpeg作為允許值。
這十種類型,又可分為三個大類。第一大類是字符串類型,指的是CDATA,它的值可以是任何合法的字符串。第二大類是枚舉類型,包括ATTLIST和NOTATION,需要在DTD中為它們聲明可取值的列表。剩下的七種類型都屬于第三大類,又稱為記法類型,含有不同的詞法及語意限定。
☆
參考資料
XML認證教程,第 1 部分: XML簡介
http://www.ibm.com/developerworks/cn/xml/x-cert/part1/index.html
XML及相關技術認證系列
http://bbs.itren.cn/html/bbs25730.
XML 標準概覽: 第 1 部分
http://www.ibm.com/developerworks/cn/xml/x-stand1/
XM語法大全
http://blog.csdn.net/cyzhang1983/archive/2007/07/20/1699784.aspx
posted on 2007-08-31 21:57
破繭而出 閱讀(1714)
評論(0) 編輯 收藏 所屬分類:
XML