XML基礎教程(第2版)第2章規(guī)范的XML文件_第1頁
XML基礎教程(第2版)第2章規(guī)范的XML文件_第2頁
XML基礎教程(第2版)第2章規(guī)范的XML文件_第3頁
XML基礎教程(第2版)第2章規(guī)范的XML文件_第4頁
XML基礎教程(第2版)第2章規(guī)范的XML文件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《XML基礎教程(第2版)》第2章規(guī)范的XML文件

本章主要內容第2章規(guī)范的XML文件§2.1規(guī)范性

符合W3C制定的基本語法規(guī)則的XML文件稱為規(guī)范的XML文件。規(guī)范的XML文件如果再符合額外的一些約束就稱為有效的XML文件?!?.2XML聲明規(guī)范的XML文件應當以XML聲明作為文件的第一行,在其前面不能有空白、其他的處理指令或注釋。XML聲明以

“<?xml”

標識開始、

以“?>”

標識結束。以下是一個最基本的XML聲明:

<?xmlversion=“1.0”?>

如果一個XML文件省略XML聲明,各種XML解析器將默認該XML文件是有XML聲明的,而且XML聲明是:

<?xmlversion="1.0"encoding="UTF-8"?>注:W3C在XML規(guī)范中建議每個XML文件都顯示地寫有XML聲明。

2.2.1version屬性

一個簡單的XML聲明中可以只包含屬性version,目前該屬性的只可以值可以取1.0,指出該XML文件使用的XML版本。2.2.2encoding屬性

encoding屬性規(guī)定XML文件采用哪種字符集進行編碼,該屬性的默認值是“UTF-8”.<?xmlversion="1.0"encoding="UTF-8"?>注:

encoding屬性值不同,XML文件保存時的編碼要與之對應。1.如果XML使用UTF-8編碼,那么標記的名字以及標記包含文本內容中就可以使用漢字、日文、英文等,XML解析器就會識別標記的名字并正確解析標記中的文本內容。這時XML文件必須選擇“UTF-8”編碼來保存。2.如果在編寫XML文件時只準備使用ASCII字符和漢字,可以將encoding屬性的值設置為“gb2312”。例:<?xmlversion="1.0"encoding="gb2312"?>這時XML文件必須使用“ANSI”編碼保存。

3.如果在編寫XML文件時只準備使用ASCII字符,可以將encoding屬性的值設置為“ISO-8859-1”。例如:<?xmlversion="1.0"encoding="ISO-8859-1"?>這時XML文件也必須使用“ANSI”編碼保存。ASCII、GB2312、GBK、unicode、UTF-8字符集編碼ASCII字符集編碼

ASCII碼是7位編碼,編碼范圍是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯數(shù)字和標點符號等字符。其中0x00-0x20和0x7F共33個控制字符。

只支持ASCII碼的系統(tǒng)會忽略每個字節(jié)的最高位,只認為低7位是有效位。HZ字符編碼就是早期為了在只支持7位ASCII系統(tǒng)中傳輸中文而設計的編碼。早期很多郵件系統(tǒng)也只支持ASCII編碼,為了傳輸中文郵件必須使用BASE64或者其他編碼方式。

GB2312字符集編碼

GB2312是基于區(qū)位碼設計的,區(qū)位碼把編碼表分為94個區(qū),每個區(qū)對應94個位,每個字符的區(qū)號和位號組合起來就是該漢字的區(qū)位碼。區(qū)位碼一般用10進制數(shù)來表示,如1601就表示16區(qū)1位,對應的字符是“啊”。在區(qū)位碼的區(qū)號和位號上分別加上0xA0就得到了GB2312編碼。

GB2312字符集中除常用簡體漢字字符外還包括希臘字母、日文平假名及片假名字母、俄語西里爾字母等字符,未收錄繁體中文漢字和一些生僻字??梢杂梅斌w漢字測試某些系統(tǒng)是不是只支持GB2312編碼。

GB2312的編碼范圍是0xA1A1-0x7E7E,去掉未定義的區(qū)域之后可以理解為實際編碼范圍是0xA1A1-0xF7FE。

EUC-CN可以理解為GB2312的別名,和GB2312完全相同。

區(qū)位碼更應該認為是字符集的定義,定義了所收錄的字符和字符位置,而GB2312及EUC-CN是實際計算機環(huán)境中支持這種字符集的編碼。HZ和ISO-2022-CN是對應區(qū)位碼字符集的另外兩種編碼,都是用7位編碼空間來支持漢字。區(qū)位碼和GB2312編碼的關系有點像Unicode和UTF-8。GBK字符集編碼

GBK編碼是GB2312編碼的超集,向下完全兼容GB2312,同時GBK收錄了Unicode基本多文種平面中的所有CJK漢字。同GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的漢字部首符號、豎排標點符號等字符。

GBK的整體編碼范圍是為0x8140-0xFEFE,不包括低字節(jié)是0×7F的組合。高字節(jié)范圍是0×81-0xFE,低字節(jié)范圍是0x40-7E和0x80-0xFE。

低字節(jié)是0x40-0x7E的GBK字符有一定特殊性,因為這些字符占用了ASCII碼的位置,這樣會給一些系統(tǒng)帶來麻煩。

有些系統(tǒng)中用0x40-0x7E中的字符(如“|”)做特殊符號,在定位這些符號時又沒有判斷這些符號是不是屬于某個GBK字符的低字節(jié),這樣就會造成錯誤判斷。在支持GB2312的環(huán)境下就不存在這個問題。需要注意的是支持GBK的環(huán)境中小于0x80的某個字節(jié)未必就是ASCII符號;另外就是最好選用小于0×40的ASCII符號做一些特殊符號,這樣就可以快速定位,且不用擔心是某個漢字的另一半。Big5編碼中也存在相應問題。

CP936和GBK的有些許差別,絕大多數(shù)情況下可以把CP936當作GBK的別名。unicode字符集編碼

每一種語言的不同的編碼頁,增加了那些需要支持不同語言的軟件的復雜度。因而人們制定了一個世界標準,叫做unicode。unicode為每個字符提供了唯一的特定數(shù)值,不論在什么平臺上、不論在什么軟件中,也不論什么語言。也就是說,它世界上使用的所有字符都列出來,并給每一個字符一個唯一特定數(shù)值。

Unicode的最初目標,是用1個16位的編碼來為超過65000字符提供映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸?shù)膯栴}(implantationhead-ache's),尤其在那些基于網(wǎng)絡的應用中。已有的軟件必須做大量的工作來程序16位的數(shù)據(jù)。

因此,Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列來編碼的,用一個或幾個字節(jié)來表示一個字符。這種方式的最大好處,是UTF-8保留了ASCII字符的編碼做為它的一部分,例如,在UTF-8和ASCII中,“A”的編碼都是0x41.

UTF-16和UTF-32分別是Unicode的16位和32位編碼方式??紤]到最初的目的,通常說的Unicode就是指UTF-16。在討論Unicode時,搞清楚哪種編碼方式非常重要。UTF-8字符集編碼

UnicodeTransformationFormat-8bit,是用以解決國際上字符的一種多字節(jié)編碼,它對英文使用8位(即一個字節(jié)),中文使用24為(三個字節(jié))來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。

GBK的文字編碼是用雙字節(jié)來表示的,即不論中、英文字符均使用雙字節(jié)來表示,為了區(qū)分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數(shù)據(jù)庫比GBD大。

GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:

GBK、GB2312--Unicode--UTF8

UTF8--Unicode--GBK、GB2312

對于一個網(wǎng)站、論壇來說,如果英文字符較多,則建議使用UTF-8節(jié)省空間。不過現(xiàn)在很多論壇的插件一般只支持GBK。Java應用程序,輸出的“你”的UTF-8編碼

classInputUTF_8{publicstaticvoidmain(Stringargs[]){Strings1="你",s2="α";try{byteb[]=s1.getBytes("UTF-8");System.out.print("漢字\'你\'的UTF-8編碼:");

for(intk=0;k<b.length;k++){Stringstr=Integer.toBinaryString(b[k]);

str=str.substring(str.length()-8);System.out.print(""+str);}}catch(Exceptione){}}}2.2.3

standalone屬性

在XML聲明中可以指定standalone屬性的值,該屬性的默認值是“no”。該屬性可以取值“yes”或“no”,以說明XML文件是否是完全自包含的。下列XML聲明指定standalone屬性的值為“yes”:<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>§2.3標記

XML文件中的標記分為空標記和非空標記兩種.2.3.1空標記_1.語法格式1.語法格式所謂空標記就是不含有任何內容的標記??諛擞浺浴?lt;”標識開始,用“/>”標識結束.空標記的語法格式分別為:<空標記的名稱屬性列表/>或

<空標記的名稱/>以下是2個空標記(正確的空標記):<張三age="28"sex="男"/><water/>錯誤的空標記:×<張三age="28"sex="男"/><water/>正確的空標記:<張三age="24"sex="男"/><water/>2.3.1空標記_2.作用

由于空標記不包含任何內容,因此在實際編寫XML文件時,空標記的名稱主要用于抽象帶有屬性的數(shù)據(jù),該數(shù)據(jù)本身并不需要用具體文本進行描述,比如,如果XML需要描述寬12、長20的長方形,但不準備有任何關于長方形的文字描述,那么就可以使用如下的標記:

<長方形width="12"length=20/>XML解析器主要關心空標記中的屬性,并可以解析出這些屬性的值。2.3.2非空標記_1.語法格式非空標記必須由“開始標簽”與“結束標簽”構成,它們之間是該標記的內容。開始標簽以“<”標識開始,用“>”標識結束,標識之間是標記的名稱和屬性列表開始標簽的語法格式分別為:<標記的名稱屬性列表>或<標記名稱>注意:在標識“<”和標記名稱之間不要含有空格,允許“>”的前面可以有空格或回行。

結束標簽以"</"標識開始,用">"標識結束,之間是標記的名稱。"</"和標記名稱之間不要含有空格,允許">"的前面可以有空格或回行。正確的空標記:<name>李云龍</name>錯誤的空標記:×<name>李云龍</name>2.3.2非空標記_2.非空標記的內容

例子1說明標記內容中的文本數(shù)據(jù)和子標記,為了敘述方便,用符號“□”表示編輯操作所輸入的空格、“?”代表編輯操作所輸入的回行符。

<?xmlversion="1.0"encoding="UTF-8"?><student>?<name>?□□□□□□張大山?□□□□□□<grade>?□□□□□□□□□一年級?□□□□□□</grade>?□□</name>?</student>2.3.2非空標記_3.作用非空標記包含的內容中既可以有文本數(shù)據(jù)也可以有子標記.當需要用“整體-部分”關系來描述數(shù)據(jù)時,就可以使用非空標記,XML文件中的可以有如下結構的標記:當需要使用文本來描述一個數(shù)據(jù)時,也需要使用非空標記

<學生><姓名>張三</姓名><學號>A1001</學號></學生><價格>129元</價格><ISBN>7-675-32591-2</ISBN>特別注意下列標記:<speak></speak>是不包含任何內容的非空標記,或者說是含有“\0”的非空標記,而<speak/>才是真正的空標記。2.3.3標記的名稱

名稱可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,但必須以字母或下劃線開頭。標記名稱區(qū)分大小寫.<name>張三</name>與<Name>張三</Name>是完全不同的標記。2.3.4根標記

XML文件必須有且僅有一個根標記,其它標記都必須封裝在根標記中。XML文件的標記必須形成樹型結構。

注意:以下是一個不規(guī)范的XML文件,標記未形成樹狀結構?!靶彰睒擞浀慕Y束標簽與“出生日期”標記的開始標簽之間形成交叉。

<root>×

<姓名>張三<出生日期></姓名>1998年12月28日</出生日期></root>2.3.5標記的子孫關系

規(guī)范的XML文件有且僅有一個根標記,其它標記都必須封裝在根標記中,文件的標記必須是樹形結構。一個標記的子標記的子標記稱作該標記的孫標記。稱一個標記的子標記為該標記的1級子標記,孫標記為該標記的2級子標記等,

§2.4特殊字符

XML有5種字符屬于特殊字符,左尖括號“<”、右尖括號“>”、與符號“&”

、單引號“'”和雙引號“"”。標記的內容可以有兩部分構成:文本數(shù)據(jù)和標記,按著W3C制定的規(guī)范,文本數(shù)據(jù)中不可以含有這些特殊字符,下列標記中的文本內容是非法的:<姓名>張&三</姓名>

在文本數(shù)據(jù)中通過實體引用使用這些特殊字符。下列標記中的文本內容是合法的:<姓名>張&三</姓名>解析器解析出該標記的文本數(shù)據(jù)是:張&三

<引用左尖括號:“<” >引用右尖括號“>” '引用單引號“'” "引用雙引號“"” &引用與符號“&”

§2.5CDATA段

CDATA段用“<![CDATA[”做為段的開始,用“]]>”作為段的結束,段開始和段結束之間稱為CDATA段的內容,解析器不對CDATA段的內容做分析處理。CDATA段中的內容可以包含任意的字符。但是,W3C規(guī)定,CDATA段中不可以嵌套另一個CDATA段。

以下是一個正確的CDATA段:<![CDATA[

booleanboo=true&&false<你好>]]>

§2.6標記的文本數(shù)據(jù)

一個標記的內容可以有兩部分構成:文本數(shù)據(jù)部分和子標記部分。一個標記包含的文本數(shù)據(jù)中可以有普通字符、CDATA段和所引用的特殊字符

。

例題2

page19<?xmlversion="1.0"encoding="UTF-8"?><car><audi>這是一汽生產(chǎn)的轎車。<![CDATA[<power>2.8</power>]]></audi></car>§2.7屬性

屬性是指標記的屬性,可以為標記添加附加信息。

2.7.1屬性的構成屬性是一個名值對,即屬性必須由名字和值組成。屬性必須在非空標記的開始標記或空標記中聲明,用“=”為屬性指定一個值。

語法如下<標記名稱

屬性列表>…</標記名稱><標記名稱

屬性列表/>

例如:<桌子width="300"height="600"length="1000">辦公專用桌</桌子><cloudcolor="white"/>屬性名字的命名規(guī)則和標記的命名規(guī)則相同,可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,但必須以字母或下劃線開頭。屬性的名字區(qū)分大小寫。屬性值是一個用單引號或雙引號括起的字符串,如果屬性值需要包含左尖括號“<”、右尖括號“>”、與符號“&”、單引號“'”或雙引號“"”符,就必須使用字符引用或實體引用。2.7.2使用屬性的原則屬性不體現(xiàn)數(shù)據(jù)的結構,只是數(shù)據(jù)的附加信息。

不要因為屬性的頻繁使用破壞XML的數(shù)據(jù)結構。<?xmlversion="1.0"encoding="UTF-8"?><root>

<樓房height="23m"length="56m"width="12m"><結構>混土結構</結構><建筑商>華海建筑集團</建筑商><類別>商用</類別></樓房></root>例子3example2_3.xml§2.8注釋

XML文件的注釋和HTML文件相同,注釋以“<!--

”開始,以“-->”結束,XML解析器將忽略注釋的內容,不對它們實施解析處理。例:<?xmlversion="1.0"encoding="UTF-8"?><!--簡單的XML文件--><root><speak>你好</speak></root>下列注釋出現(xiàn)的位置是錯誤的×<!--簡單的XML文件--><?xmlversion="1.0"encoding="UTF-8"?><root><speak>你好</speak></root>§2.9名稱空間名稱空間的目的是有效的區(qū)分名字相同的標記,當兩個標記的名字相同時,它們可以通過隸屬不同的名稱空間來相互區(qū)分。

名稱空間通過使用聲明名稱空間來建立,分為有前綴名稱空間和無前綴名稱空間.例子4example2_4.xml<?xmlversion="1.0"encoding="UTF-8"?><簡歷總匯><張三>1990年出生,獲得過二等獎學金。</張三><張三>1991年出生,曾獲得數(shù)學競賽一等獎。</張三></簡歷總匯>2.9.1有前綴和無前綴的名稱空間◆聲明有前綴的名稱空間的語法如下

xmlns:前綴=名稱空間的名字例如xmlns:person="China.dalian"聲明了一個名字為“China.dalian”的名稱空間◆無前綴的名稱空間聲明語法如下

xmlns=名稱空間的名字例如:xmlns=

稱兩個名稱空間相同當且僅當它們的名字相同.

名稱空間的前綴僅僅為了方便地引用名稱空間而已,不能用于區(qū)分名稱空間是否相同。

下列是兩個相同的名稱空間(名稱為apple):xmlns:hello="apple"

xmlns:ok="apple"

下列是三個不同的名稱空間:xmlns:north="liaoning"xmlns:north="Liaoning"xmlns:center="beijing"2.9.2標記中聲明名稱空間

名稱空間的聲明必須在標記的“開始標簽”中,而且名稱空間的聲明必須放在開始標簽中標記名字的后面,例如:<張三xmlns:p1="liaoning">1986年出生。</張三>

2.9.3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論