XML
XML語法
基本規則
(1).XML是區分大小寫的;
(2).所有元素的起始和結束標注必須成對出現,且要正確嵌套;
(3).如果使XML說明,則它必須是XML文檔的第一行:<?xml version=”1.0”?>,一般還要在里面指定編碼集,否則默認使用ISO-8859-1編碼,該編碼是不支持中文的。(文件保存的編碼集必須和文件查看的編碼集一致,否則會出現亂碼)
(4).元素屬性必須用引號引起來,單、雙引號都可以,但必須成對出現。如:
<basic attr=”1.0”>
<basic attr=’1.0’>
(5).XML命名規則:
①.XML名以下劃線或字母開始;
②.XML名可包含字母、數字、句點、下劃線和冒號;
③.XML名不能包含空格;
④.XML名不能以數字開始,但可包含數字;
⑤.XML名區分大小寫。
(6).保留標記字符,如果要在XML中顯示<或&之類的標記,就要使用字符的實體形式,XML中有五種預先定義了的實體:
<: 表示<字符
>: 表示>字符
&: 表示&字符
&apos: 表示’字符
": 表示”字符
我們也可用ENTITY自定義實體:
<!ENTITY linux “linux is a very good system”>
這樣我們可用&linux來調用。
(7).XML文檔內容中的空格是有意義的,在轉換后會保留。(所以要避免全角符號的出現特別是全角空格,該錯誤很難排查)
(8).元素以<開始并以/>結束,如<br/>。
元素(ELEMENT)
元素其實就是標記,或者也可以將元素視為標記名稱,并沒有很明確的定義,而只是一個形容詞而已。元素可以說XML文件里最重要的構成單元。有三種元素使用方法:⑴簡單內容,文本或其它數據出現在開始和結束標記之間。開始標記與結束標記有相同名字,但結束標記明要以一個斜杠開始。下面的元素包括一個開始標記、內容和一個結束標記
<author>Stephen Hawking</author>.
⑵把元素用作其它元素的容器,元素包含其他元素,呈現出一種分層或樹形數據結構。以下的book元素包含了author和title元素
<book>
<author>Stephen Hawking</author>
<title>A brief history of time</title>
</book>
⑶空元素用作屬性容器,當元素只包含屬性而無內容時,有一種不需使用開始和結束標記的元素簡寫方式。空元素的書寫可用標記名后跟著一個斜杠來表示
<book/>
他表示了:<book></book>空元素常用來包含屬性數據。<book title=”A brief history of time” author=”Stephen Hawking”/>
元素命名規則⑴名字可以包含字母、數字和其他字符。⑵名字不能以數字或標點開始。⑶名字不能用字符串“XML”開始,不管是小寫形式還是大寫形式。⑷名字不能包含空格,不能使用冒號。
屬性
屬性提供了有關元素的附加信息。再HTML中,當加載HTML文檔時,屬性用來規定圖像文件的名字:<img src=”inde01.gif”>屬性常用來表明信息,它不是元素中被描述數據的一部分。屬性也常用來描述有關數據本身的信息。以下的XML中屬性use告訴程序處理此文件不需要的數據
<file use=”optional”>index01.gif</file>
在XML中,屬性值必須用單引號或雙引號包圍。
一般共識:如果信息看起來像數據就使用元素;而在描述有關數據的信息時就使用屬性。不使用屬性來存儲數據的原因包括:⑴屬性不能包含多個值,而元素能包含多個子元素。⑵屬性不容易擴展以適應將來的變化。⑶與元素相比,用程序更難以操作屬性。⑷不容易檢查屬性值是否違反文檔類型定義(DTD)。
實體
實體用來替代XML文檔中的字符串.例如:短語”XML and the Data Revolution”當文檔中重復出現,就可在DTD中定義一個快捷實體聲明。
<!ENTITY xdr”XML and the Data Revolution”>
這樣,當要是用整個短語時,就可使用&xdr;而他在XML文檔中會被替換。使用實體就可以避免拼寫錯誤以及反復輸入同一件事的繁瑣。同時還有預定義實體和參數實體之分
XML文檔的組成
一個完整地XML應該具備以下規則:
1.文檔的開始必須是XML聲明。
2.含有數據的元素必須有起始標記和結束標記。
3.不含數據并且僅使用一個標記的元素必須以/>結束。
4.文檔只能包含一個能夠包含全部其他元素的元素。
5.元素只能嵌套不能重疊。
6.屬性值必須加引號。
7.字符<和&只能用于起始標記和實體引用。
8.出現的實體引用只有&、<、>、'和"。
XML聲明:
1.version,定義XML規范的版本號,到現在為止,只有一個版本號1.0 。
<?xml version="1.0" standalone="yes"?>
他的出現是文檔最開頭的部分,因為XML處理器會讀取文件最先的幾個字節并將它與字符串<?XML的不同編碼作比較來確定正在使用的字符串集。除去看不見的字節順序記號,在它之前不能有任何東西,包括空格。①在非空標記中使用起始和結束標記:如果忘了結束HTML的標記,Web瀏覽器并不嚴格追究。例如,如果文檔包含一個<B>標記卻沒有相應的</B>標記,在<B>標記之后的全部文檔將變為粗體。但文檔仍然能顯示。XML不會如此寬松,每個起始標記必須以相應的結束標記結束。如果一個文檔未能結束一個標記,瀏覽器或移交器將報告一個錯誤信息,并且不會以任何形式顯示任何文檔的內容。②用"/>"結束空標記:不包含數據的標記,例如HTML的<BR>、<HR>和<IMG>,不需要結束標記。但是XML空標記必須由/>結束,而不是>。例如<BR>、<HR>和<IMG>的XML等價物是<BR/>、<HR/>和<IMG/>。
當前的Web瀏覽器處理這種標記的方法不一致。但是如果想保持向后的兼容性,可以使用結束標記來代替,而且不能在其間包含任何文本。例如:
<BR></BR> 、 <HR></HR>、 <IMG></IMG>即使這樣,Netscape處理<BR></BR>也有困難(它把這兩個標記解釋為行間距,而不是前面所講的)。因此,在HTML中包含結構完整的空標記也并非總是可行的。
2.encoding,指定文檔的編碼系統。
3.standalone,定義文檔是獨立的還是需要裝入其他元素才能正確分析。如果XML文檔沒有外部實體或DTD,則可以設置為no,否則設置為yes。可用該值提高性能:如果為no,則可提高處理速度;如果設置為yes,則首先要分析文檔,確定需要其他哪些文件,然后才能完全分析文檔。
4.根元素,每篇XML文檔都需要有且只能有一個根元素。由元素是文檔的第一個元素,包含其它所有元素。下例的portal就是根元素,如:
<portal>
<name>jims</name>
<email></email>
…
</portal>
屬性,每個元素都可以設置一個或多個屬性,如:
<portal>
<name id=’1’,sex=”male”>Jims</name>
</portal>
元素和屬性都可以表示信息,屬性信息表現能力有限,它只能表示字符串。所以當需靈活表示信息時應該使用元素。一般把信息主體放到元素中,屬性只放一些注釋或額外的信息。
CDATA CDATA的格式:
|
〈![CDATA[ |
它用<![CDATA[和]]>表示,它們之間的數據作為原始字符顯示,唯一不能出現的標志是]]>。
注釋,注釋是很重要,不論是在編寫程序和文檔時,所以XML也提供了注釋功能,以<!--開頭,以-->結尾的一對區間為注釋。在以-->結束之前,不能出現“--”號,“---”更不允許。
處理指令,處理指令以<?開頭以?>結尾。處理指令是標記而不是元素。與注釋一樣,處理指令可出現在XML文檔的標簽外的任何位置,包括根元素之前或之后。最常見的處理指令是,xml-stylesheet樣式表指令,它會告訴瀏覽器在顯示文檔時應用什么樣式表。如:
<?xml-stylesheet href=”sample.css” type=”text/css”?>
<portal>
<name>…</name>
…
</portal>
命名空間
命名沖突問題是XML文檔中引入多DTD的老大難問題,那么,命名空間標準又是如何解決這一問題的呢?一個直接的想法是保證所引用到的DTD沒有重名的元素。可是,你所引用的DTD可能來自世界上各個地方,由不同的人制定,要求這成千上萬的DTD沒有重名現象似乎有些異想天開,且想想你身邊重名的人還有多少呢!再有一個想法就是要求所引用到的DTD改名字,把“聯系人列表”中的元素“姓名”改為“聯系人姓名”,“電話”改為“聯系人電話”;相應地,“企業經理”中的“姓名”改為“經理姓名”,“電話”改為“經理電話”。但是,如果出現了大量重名元素,這個修改的工作量就很大了,如此麻煩,多DTD的優勢消失殆盡,還不如自己重新定義一個呢。命名空間標準提供了一個很聰明的方法,就是所謂前綴標識法,即在元素名和屬性名前面增加一個標識,以唯一區分當前元素或屬性來自哪一個DTD。
命名空間聲明有兩種方式:直接定義方式和缺省定義方式:
|
直接定義 |
xmlns:<命名空間前綴> = <命名空間名> |
|
缺省定義 |
xmlns = <命名空間名> |
直接定義方式
命名空間聲明的屬性名部分由兩部分組成,即保留屬性名前綴"xmlns:"和命名空間前綴,且命名空間前綴是一個合法的XML名稱。例如,"xmlns: 聯系人"、"xmlns: 企業經理"都是合法的命名空間聲明的屬性名。
命名空間聲明的屬性值部分是一個URI引用,其功能是區分不同的命名空間,因此,這個URI引用被稱為“命名空間名”,它應該具有唯一性和持久性。
缺省定義方式
在缺省方式下,命名空間聲明的屬性名部分僅有保留屬性名xmlns,屬性值部分與直接定義方式相同。例如:
|
<聯系人:聯系人列表 xmlns ="http://xml.net.cn/聯系人列表.dtd" xmlns:企業經理 ="http://xml.net.cn/企業經理.dtd"> |
DTD的基本要素
DTD的全稱是“Document Type Definition“(文件類型定義)。他是用來規范XML文件的格式,它必須出現在文件頭(Prolog)中,以便XML校驗器在一開始便可以得到該份XML文件的格式定義。
XML分為兩類:有效XML文檔和簡化格式XML文檔。有效是指有一個DTD參考文件的XML文檔 ,一個有效的XML文檔必須是簡化格式的XML文檔,跟隨著這個文檔的DTD文件的有效性,促進了XML執行程序的運行以及文檔在兼容XML瀏覽器的顯示。
要使用DTD進行有效性檢驗,就要使用文檔類型定義聲明指定DTD。例如:<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal SYSTEM "http://www.w3c.com/dtd/portal.dtd">
<portal>
<name>Jims</name>
<email>Jims@163.com</email>
<email>Jims@21cn.com</email>
</portal>
文檔類型聲明位于XML聲明之后,根元素之前。如果DTD文檔位于本機,可用路徑名直接指出DTD文檔的位置。如果DTD位于XML文檔外,則叫外部DTD子集。我們可以結合內外DTD,共同組成一個DTD來為XML文檔作驗證。
具體地說,DTD是一個或是一些用XML書寫的文件。它包含了對一種文件的正式定義。它定義了文件中的元素能用什么名字,能放在什么位置,應該怎樣組合。在這里舉一個簡單的例子。比如說想要文件可以描述一組<List>,其中每個<List>由可以包含若干個<Item>。那么DTD中應該有以下語句:
<!ELEMENT List (Item)+>
<!ELEMENT Item (#PCDATA)>
這樣一個框架定義了一個表(list),它可以包含若干個項(items)。每一個項只能包括文本的內容。當處理器處理XML文件時將自動檢查DTD,以此確定文件中元素從哪而來,以及它們之間是什么關系。上面的框架允許生成下面的一個表:
<List><Item>Chocolate</Item><Item>Music</Item><Item>Surfing</Item></List>
而這樣一個表在屏幕上是怎樣一個表象,取決于樣式表(Stylesheet)。在HTML中要在文件中指定應是怎樣的形式。使用DTD表明你能夠確定一類文章的結構和格式。
文檔類型聲明中的每一項都是元素聲明,定義了每個元素的約束。元素聲明的格式為:
<!ELEMENT element_name (content_model)>
內容包括:1. #PCDATA,規定元素只包含已析的字符數據。
2. 子元素,可指明元素的子元素。也可用逗號為分隔符,指明多個子元素。并且子元素出現的次序必須按定義時的順序。
3. 子元素的個數,我們可通過正則表達式來規定子元素的個數。①?,允許零個或一個該元素 ②*,允許零個或多個該元素 ③+,允許一個或多個該元素
4. 可選項(|),選項是一個參數列表,每個參數間用“|”分隔,代表能且只能選一個子元素。
5. 小括號,可用小括號把選項括起來,以表達更豐富的意思,如我們想表示choice元素必須包含一個good子元素,并且必須包含ok子元素或bad子元素的一個。
6. 混合內容,在一些文檔中,一個元素可能既包含子元素,也包含字符串,這些內容叫混合內容。
7. 空元素,某些元素不用包含任何內容,稱之為空元素。寫成以/>結束的獨立標簽。
8. ANY,允許元素內包含任意內容。該選項在dtd測試時很有用,在生產系統中盡量不要使用。
一個有效的XML文檔,必須對元素的屬性進行聲明。使用ATTLIST聲明來完成,一個ATTLIST可以為一個元素類型聲明多個屬性。
有效文檔中使用的每個元素都必須在文檔的DTD中用元素聲明進行聲明。element_name可是任何合法的XML名稱,content_model(內容模型)指定元素可以或必須包含的子元素以及子元素的順序。

浙公網安備 33010602011771號