javascript快速入門24--XML基礎

水之原發表於2013-12-04

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

    <!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文件中的&nbsp;即是一個實體引用當文件被 XML 解析器解析時,實體就會被展開。
  • PCDATA , PCDATA 的意思是被解析的字元資料(parsed character data)。可把字元資料想象為 XML 元素的開始標籤與結束標籤之間的文字。PDATA 是會被解析器解析的文字。這些文字將被解析器檢查實體以及標記。文字中的標籤會被當作標記來處理,而實體會被展開。不過,被解析的字元資料不應當包含任何&、< 或者 > 字元;需要使用 &amp;、&lt; 以及 &gt; 實體來分別替換它們。
  • 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中對元素的宣告也應該包含名稱空間字首(即應與文件中所書寫的一致).另外,名稱空間不但作用於元素,還作用於屬性

相關文章