XML經(jīng)典總結(jié)

xml經(jīng)典總結(jié)

XML(eXtensible Markup Language)是萬(wàn)維網(wǎng)聯(lián)盟(World Wide Web Consortium W3C)定義的一種可擴(kuò)展標(biāo)志語(yǔ)言议惰。

? ? 可擴(kuò)展性指允許用戶按照XML規(guī)則自定義標(biāo)記(tags 標(biāo)簽)。

強(qiáng)項(xiàng):輕松表達(dá)多層結(jié)構(gòu)的數(shù)據(jù)能颁;可擴(kuò)展洒敏。

優(yōu)點(diǎn):平臺(tái)無(wú)關(guān)拾弃,語(yǔ)言無(wú)關(guān)谱仪。設(shè)計(jì)目標(biāo)是描述數(shù)據(jù)并集中于數(shù)據(jù)的內(nèi)容旷祸,與顯示分離贡未。

提醒:不能用XML來(lái)直接寫網(wǎng)頁(yè)熊榛。即便是包含了XML數(shù)據(jù)锚国,依然要轉(zhuǎn)換成HTML格式才能在瀏覽器上顯示。

語(yǔ)法規(guī)則:

? ? XML文件有且僅有一個(gè)根標(biāo)記玄坦,其他標(biāo)記必須封裝在根標(biāo)記中血筑,文件的標(biāo)記必須形成樹狀結(jié)構(gòu)。

? ? 大小寫敏感煎楣。

? ? 標(biāo)記的屬性必須用""或''括起來(lái)豺总。

XML細(xì)節(jié):

一、 聲明

? ? 大多數(shù)XML文檔以XML聲明作為開始择懂,它向解析器提供了關(guān)于文檔的基本信息喻喳。

? ? 建議使用XML聲明,但它不是必需的困曙。如果有的話表伦,那么它一定是文檔的第一行內(nèi)容。

? ? ? 如:<?xml? version="1.0"? encoding="UTF-8" standalone="no"?>

? ? 聲明最多可以包含三個(gè)名稱-值對(duì)(許多人稱它們?yōu)閷傩钥独觯M管在技術(shù)上它們并不是)蹦哼。

? ? ? <?xml 問號(hào)與xml之間不能有空格。

? ? 1)version 是使用的XML 版本:1.0, 1.1

? ? 2)encoding 是該文檔所使用的字符集要糊。該聲明中引用的ISO-8859-1 字符集包括大多數(shù)西歐語(yǔ)言用到的所有字符翔怎。

? ? ? 默認(rèn)字符在UTF-8字符集中,這是一個(gè)幾乎支持世界上所有語(yǔ)言的字符和象形文字的Unicode 標(biāo)準(zhǔn)杨耙。

? ? 3)standalone(可以是yes 或no)定義了是否孤立處理該文檔。

? ? ? 如果XML文檔沒有引用任何其它文件飘痛,則可以指定 standalone="yes"珊膜。

? ? ? 如果XML文檔引用其它描述該文檔可以包含什么的文件(如DTD),則 standalone="no"宣脉。默認(rèn)值為"no"

二车柠、 標(biāo)記

? ? 左尖括號(hào)“<“和右尖括號(hào)“>“之間的文本

? ? ? 1. 在<? >中的稱為開始標(biāo)記;在</? >中的稱為結(jié)束標(biāo)記

? ? ? 2. 空標(biāo)記:不包含元素的標(biāo)記≈竦唬空標(biāo)簽必須以“/>”結(jié)束谈跛。格式: <空標(biāo)記的名稱/> <空標(biāo)記的名稱 屬性列表/>

? ? 注意:

? ? ? 除空標(biāo)記外,標(biāo)簽必須成對(duì):有始有終塑陵。所有的開始標(biāo)簽和結(jié)束標(biāo)簽必須匹配感憾。

? ? ? 在標(biāo)記符“<“和"標(biāo)記的名稱"之間不能含有空格。在標(biāo)記符"/>"前面可以有空格或回行令花。

? ? ? 標(biāo)簽必須嵌套正確阻桅。

? ? XML標(biāo)記必須遵循下面的命名規(guī)則:

? ?  1.名字中可以包含字母、數(shù)字以及其它字母或文字兼都;還可包含下劃線(_)嫂沉、點(diǎn)(.)、連字符(-)

? ?  2.名字不能以數(shù)字開頭扮碧;可以用字母趟章、文字或者下劃線開頭。

? ?  3.名字不能以字母xml (或XML 或Xml ..) 開頭慎王;

? ?  4.名字中不能包含空格蚓土。

三、 元素

? ? 位于開始標(biāo)記與結(jié)束標(biāo)記間

? ? 一份文檔有且只有一個(gè)根元素柬祠。

? ? 根元素下的所有元素叫“子元素”北戏。

? ? 標(biāo)簽必須嵌套正確。

? ? 不包含自子元素的元素叫“葉子”漫蛔;包含子元素的元素叫“分支”嗜愈。

? ? 如: <eric>…… </eric>

四、 屬性

? ? 一個(gè)元素的開始標(biāo)志中的名稱-值對(duì)

? ? 所有的屬性值必須位于單引號(hào)或雙引號(hào)中莽龟。

? ? 每一個(gè)元素的屬性不允許出現(xiàn)超過(guò)一次蠕嫁。

? ? 開始標(biāo)志內(nèi),類似賦值語(yǔ)句

? ? 如:<eric age="80">……</eric>

五毯盈、 注釋

? ? 注釋可以出現(xiàn)在文檔的任何位置剃毒。(但不建議放在聲明前面,部分瀏覽器會(huì)報(bào)錯(cuò))

? ? 注釋以 <!-- 開始搂赋,以 -->? 結(jié)束赘阀。

? ? 注釋內(nèi)不能包含雙連字符(--);除此之外脑奠,注釋可以包含任何內(nèi)容基公。

? ? 注釋內(nèi)的任何標(biāo)記都被忽略

六、 處理指令

? ? 處理指令是為使用一段特殊代碼而設(shè)計(jì)的標(biāo)記宋欺,簡(jiǎn)稱為PI帽驯。

? ? 大多數(shù)XML 文檔都是以XML 聲明開始,該聲明本身就是特殊的處理指令兵扬。

? ? 處理指令對(duì)應(yīng)用程序特定的數(shù)據(jù)進(jìn)行編碼。一條處理指令包含一個(gè)目標(biāo)骂租,后跟數(shù)據(jù)。用<?和?>定界符將處理指令包起來(lái)斑司。

? ? 目標(biāo)確定應(yīng)用程序渗饮,而對(duì)應(yīng)用程序不能識(shí)別的目標(biāo),其會(huì)忽略這些處理指令陡厘。

七抽米、 實(shí)體

? ? XML 規(guī)范預(yù)定義了五個(gè)實(shí)體。

? ? ? <? ==== <

? ? ? >? ==== >

? ? ? " ==== ”

? ? ? ' ==== ‘

? ? ? &? ==== &

? ? 自定義實(shí)體:在DTD中定義 <!ENTITY 實(shí)體標(biāo)志 "實(shí)體內(nèi)容">

? ? ? 在xml中引用自定義實(shí)體糙置,用? &實(shí)體標(biāo)志;? 代表實(shí)體內(nèi)容云茸。

? ? 另外,無(wú)法從鍵盤輸入的字符可以使用字符引用谤饭,就是用字符的Unicode代碼點(diǎn)來(lái)引用該字符标捺。

? ? ? 以""開始字符引用,以分號(hào)結(jié)尾揉抵,x必須為小寫亡容,使用十六進(jìn)制。如: = 表示等于號(hào)冤今。

? ? ? 也可以使用字符引用來(lái)引用 <,>,',",&? "

? ? ? 查看字符的代碼點(diǎn)(附件-> 系統(tǒng)工具-> 字符映射表)闺兢。

八、 CDATA

? ? 當(dāng)一段文本中出現(xiàn)很多實(shí)體引用和字符引用時(shí)戏罢,會(huì)導(dǎo)致文本數(shù)據(jù)的讀寫困難屋谭,CDATA段就是為了解決這一問題引入的。

? ? DATA區(qū)段開始于 "<![CDATA["? 結(jié)束于? "]]>"

? ? CDATA內(nèi)部的所有東西都會(huì)被解析器忽略解析龟糕,不用檢查它的格式桐磁。

? ? 但是CDATA段中不能嵌套另一個(gè)CDATA段。

九讲岁、 屬性

? ? 屬性是標(biāo)記的屬性我擂,可以為標(biāo)記添加附加信息。

? ? (1)屬性的組成

? ? ? 屬性是一個(gè)名值對(duì)缓艳,必須由名稱和值組成校摩,屬性必須在標(biāo)記的開始標(biāo)記或空標(biāo)記中聲明,用"="為屬性指定一個(gè)值阶淘。

? ? ? 語(yǔ)法如下:

? ? ? ? ? <標(biāo)記名稱 屬性列表/>

? ? ? ? ? <標(biāo)記名稱 屬性列表>XXX</標(biāo)記名稱>

? ? ? 例如: <桌子 width="40" height='100'/>

? ? (2)使有屬性的原則

? ? ? 屬性不體現(xiàn)數(shù)據(jù)的結(jié)構(gòu)秧耗,只是數(shù)據(jù)的附加信息;

? ? ? 一個(gè)信息是作為一個(gè)標(biāo)記的屬性或子標(biāo)記舶治,取決于具體問題分井,不要因?yàn)閷傩缘念l繁使用破壞XML的數(shù)據(jù)結(jié)構(gòu)。

? ? ? 下面是一個(gè)結(jié)構(gòu)清晰的XML文件:

? ? ? ? ? <樓房 height="23m" width="12m">

? ? ? ? ? ? ? <結(jié)構(gòu)>混凝土</結(jié)構(gòu)>

? ? ? ? ? ? ? <類別>商用</類別>

? ? ? ? ? </樓房>

? ? ? 下面是一個(gè)結(jié)構(gòu)不清晰的XML文件:

? ? ? ? ? <樓房 height="23m" width="12m" 結(jié)構(gòu)="混凝土" 建筑商="華海集團(tuán)" 類別="商用"></樓房>

十霉猛、 名稱空間/包

? ? XML文件允許自定義標(biāo)記尺锚,所以可能出現(xiàn)同名字的標(biāo)記,為了區(qū)分這些標(biāo)記惜浅,就需要使用名稱空間瘫辩。

? ? 名稱空間的目的是有效的區(qū)分相同的標(biāo)記,其實(shí)并不真實(shí)存在坛悉。

? ? 語(yǔ)法: 聲明有前綴的名稱空間? xmlns:前綴名=名稱空間的名字

? ? ? ? ? 聲明無(wú)前綴的名稱空間? xmlns=名稱空間的名字? (缺省)

? ? 注意:當(dāng)且僅當(dāng)它們的名字相同時(shí)稱二個(gè)名稱空間相同伐厌,也就是說(shuō),對(duì)于有前綴的名稱空間裸影,如果二個(gè)名稱空間的名字相同挣轨,即使前綴不相同,也是相同的名稱空間轩猩,返之同然卷扮。前綴只是方便引用而已。


基本術(shù)語(yǔ)

? ? 一均践、序言Prolog:包括XML聲明(XML Declaration)和文檔類型聲明(Document Type Declaration)晤锹。

? ? 二、良構(gòu)(well-formed 規(guī)范的):符合W3C定義的XML文檔彤委。

驗(yàn)證

? ? 為什么需要驗(yàn)證鞭铆?

? ? 對(duì)XML文件施加額外的約束,以便交流焦影。

一车遂、DTD驗(yàn)證

? ? 文檔類型定義(Document Type Definition)

? ? DTD定義了XML文檔內(nèi)容的結(jié)構(gòu),保證XML以一致的格式存儲(chǔ)數(shù)據(jù)偷办。精確的定義詞匯表艰额,對(duì)XML的內(nèi)容施加約束。

? ? 符合DTD的規(guī)范XML文檔稱為有效的文檔椒涯。由DTD定義的詞匯表以及文檔語(yǔ)法柄沮,XML解析器可以檢查XML文檔內(nèi)容的有效性。

? ? 規(guī)范的XML文件不一定是有效的废岂;有效的一定是規(guī)范的祖搓。

1、 DTD聲明

? ? 1) DTD聲明可以在單獨(dú)的一個(gè)文件中

? ? 2) DTD聲明可以內(nèi)嵌在XML文件中

? ? 3) DTD聲明可以一部分在單獨(dú)的文件中湖苞,另一部分內(nèi)嵌在XML文件中

2拯欧、 引入外部DTD文件

? ? <!DOCTYPE data SYSTEM "Client.dtd">

? ? Data:根節(jié)點(diǎn)名稱

? ? Client.dtd:dtd文件路徑

3、 DTD四種標(biāo)記聲明

? ? 元素(ELEMENT)财骨、屬性(ATTLIST)镐作、實(shí)體(ENTITY)藏姐、符號(hào)(NOTATION)

? 1) 元素(ELEMENT) XML元素類型聲明

? ? 聲明元素: <!ELEMENT elementName (contentModel)>

? ? 元素的內(nèi)容通過(guò)內(nèi)容模式來(lái)描述。

? ? DTD 內(nèi)容模式的種類有:

? ? ? ? EMPTY? 元素不能包含任何數(shù)據(jù)该贾,但可以有屬性(前提是必須聲明其屬性)羔杨。

? ? ? ? ? ? ? ? 不能有子元素。不能有文本數(shù)據(jù)(包括空白杨蛋,換行符)兜材。

? ? ? ? ? ? ? ? DTD中定義: <!ELEMENT elementName EMPTY>

? ? ? ? ? ? ? ? XML中:<elementName/>(推薦) 或者:<elementName></elementName>

? ? ? (#PCDATA) 規(guī)定元素只包含已析的字符數(shù)據(jù),而不包含任何類型的子元素的內(nèi)容類型逞力。

? ? ? ? ? ? ? ? DTD中定義: <!ELEMENT student (#PCDATA)>

? ? ? ? ? ? ? ? XML中合法內(nèi)容: <student>watching TV</student>

? ? ? (Elements) 元素由內(nèi)容模式部件指定曙寡。

? ? ? ? ? ? ? ? <!ELEMENT? name? (child particles) >

? ? ? ? ? ? ? ? 內(nèi)容模式部件可以是下表列出的內(nèi)容。

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a,b)>? 子元素a寇荧、b必須出現(xiàn)举庶,且按照列表的順序

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a|b)>? 選擇;子元素a砚亭、b只能出現(xiàn)一個(gè)

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)? >? 子元素a只能且必須出現(xiàn)一次

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)+ >? 子元素a出現(xiàn)一次或多次

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)* >? 子元素a出現(xiàn)任意次(包括零次灯变、一次及多次)

? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)? >? 子元素a出現(xiàn)一次或不出現(xiàn)

? ? ? ? Mixed? ? 混合模式:子元素中既可有文本數(shù)據(jù)又可有下級(jí)子元素。

? ? ? ? ? ? ? ? <!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必須寫捅膘。

? ? ? ? ? ? ? ? 上句表示在 rn 內(nèi)添祸,字符數(shù)據(jù) 或 en及an 可以出現(xiàn)任意多次,順序不限寻仗。

? ? ? ? ? ? ? ? 優(yōu)先寫(#PCDATA)? 如:(#PCDATA|name)* 正確? (name|#PCDATA)* 錯(cuò)誤

? ? ? ? ANY? ? 元素可以包含任何類型的數(shù)據(jù)刃泌。子元素(必須在DTD中有定義) 和 文本數(shù)據(jù)(包括空白)。

? ? ? ? ? ? ? ? DTD中定義: <!ELEMENT a ANY> <!ELEMENT b ANY>

? ? ? ? ? ? ? ? XML中合法內(nèi)容: <a>somngthing</a> 或者 <a/> 或者 <a><b>oo</b></a>

? 2) 屬性(ATTLIST) 特定元素類型可設(shè)置的屬性&屬性的允許值聲明

? ? ? ? <!ATTLIST elementName

? ? ? ? attributeName1 attributeType attributeDefault

? ? ? ? .......

? ? ? ? attributeNameN attributeType attributeDefault>

? ? 屬性類型 (Attribute Type):

? ? ? ? CDATA該屬性只能包含字符數(shù)據(jù)(注意與CDATA段署尤、PCDATA的區(qū)別)

? ? ? ? NMTOKEN? 是CDATA的子集耙替,它的字符只能是字母,數(shù)字,句點(diǎn),破折號(hào),下劃線或冒號(hào)。

? ? ? ? NMTOKENS 類似NMTOKEN曹体,但這個(gè)可以包含多個(gè)值俗扇,每個(gè)值之間用空格隔開。

? ? ? ? ID? ? ? 該屬性的取值在同一文檔內(nèi)是唯一的箕别。一個(gè)元素只能有一個(gè)ID類型的屬性铜幽。

? ? ? ? IDREF? ? 類似指針,指向文檔中其他地方聲明的ID值串稀。如果該屬性取值和指向的ID值不匹配除抛,則返回錯(cuò)誤。

? ? ? ? IDREFS? 類似IDREF母截,但它可以具有由空格分隔開的多個(gè)引用到忽。

? ? ? ? ENTITY? 該屬性的值必須對(duì)應(yīng)一個(gè)在文檔內(nèi)部聲明的但還沒有分析過(guò)的實(shí)體。

? ? ? ? ENTITYS? 類似ENTITY清寇,但它可以包含由空格分隔開的多個(gè)實(shí)體喘漏。

? ? ? ? NOTATION 該屬性的值必須引用在文檔中其他地方聲明的某個(gè)注釋的名稱护蝶。

? ? ? ? (enumerated) 類似枚舉的變量,該屬性必須匹配所列的值陷遮。各值用“|”分隔開滓走。

? ? ? ? ? ? ? ? 如: (春|夏|秋|冬) 實(shí)際內(nèi)容文檔只能從中取一個(gè)。

? ? 屬性特性 (Attribute Default) :

? ? ? ? #REQUIRED? 必須有且只能有一個(gè)屬性帽馋。

? ? ? ? #IMPLIED? ? 可有可無(wú)。

? ? ? ? #FIXED? ? ? 在DTD中定義默認(rèn)值比吭,XML中可以不指定绽族,指定則必須等于該默認(rèn)值。

? ? ? ? attribute-value 如果不指定則用DTD定義的默認(rèn)值衩藤,指定則用指定的值吧慢。

<![CDATA[############ 屬性(ATTLIST)的舉例 ############## ]]>

例一(#REQUIRED)

? ? DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED? at2 CDATA #REQUIRED>

? ? XML中,正確: <el at1 = "10 20"? at2="10" >something</el>

? ? XML中赏表,錯(cuò)誤: <el at="10">something</el>? (沒有寫另一個(gè)#REQUIRED的屬性 at2 )

例二(#IMPLIED检诗,#FIXED)

? ? DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10"? at2 CDATA #IMPLIED >

? ? XML中,正確: <el? at2="20" >something</el> (at有默認(rèn)值"10"瓢剿,at2 可寫可不寫)

? ? XML中逢慌,錯(cuò)誤: <el at="11" >something</el>(at要么不寫,要寫只能寫成跟默認(rèn)值相同的)

例三(attribute-value)

? ? DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >

? ? XML中间狂,正確: <el at="11" >something</el>

例四(enumerated + attribute-value)

? ? DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">

? ? XML中攻泼,正確: <el at="20">something</el>? (at要么不寫,默認(rèn)值 10鉴象;要么在(10|20|30)中選一個(gè)寫)

<![CDATA[############ 屬性(ATTLIST)舉例 完畢 ############## ]]>

? 3) 實(shí)體(ENTITY)? 可重用的內(nèi)容聲明

? ? 在DTD中定義 <!ENTITY 實(shí)體標(biāo)志 "實(shí)體內(nèi)容">

? ? 在xml中引用自定義的實(shí)體忙菠,用? &實(shí)體標(biāo)志;? 代表實(shí)體內(nèi)容。

? ? ? 4) 符號(hào)(NOTATION) 不要解析的外部?jī)?nèi)容的格式聲明纺弊。

? ?

3牛欢、 內(nèi)部實(shí)體:在xml文件里面寫(少用)

? ? 外部實(shí)體:另外在xml同一文件夾下建立一個(gè)dtd文件(提倡)

<!--**************** 內(nèi)外部的實(shí)體舉例 ***************** -->

外部的:

? ? ? <?xml? version="1.0"? encoding="UTF-8" standalone="no"?>

? ? ? <!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用這句引用外部dtd-->

? ? ? <root><goodsInfo>

? ? ? ? ? <goodsName>goodsName</goodsName>

? ? ? ? ? <goodsPrice>goodsPrice</goodsPrice>

? ? ? </goodsInfo></root>

? ? ? 以下是名為"goodsInfo.dtd"文件

? ? ? <!ELEMENT root? (goodsInfo)>

? ? ? <!ELEMENT goodsInfo? (goodsName,goodsPrice)>

? ? ? <!ELEMENT goodsName? (#PCDATA)>

? ? ? <!ELEMENT goodsPrice (#PCDATA)>

內(nèi)部的:

? ? ? <?xml? version="1.0"?>

? ? ? <!DOCTYPE root [

? ? ? ? ? <!ELEMENT root(student)>

? ? ? ? ? <!ELEMENT student (#PCDATA)>

? ? ? ? ? <!ENTITY CCTV? "中央電視臺(tái)">

? ? ? ]>? <!--把DTD文件寫在體內(nèi)-->

? ? ? <root><student>

? ? ? ? ? student watch &CCTV;<!--使用自定義實(shí)體 CCTV-->

? ? ? </student></root>

<!--***************** 內(nèi)外部的實(shí)體舉例 完畢 ********************** -->

XML處理模式

一、 DOM 文檔對(duì)象模式

? ? 1.DOM特點(diǎn):

? ? ? 以樹型結(jié)構(gòu)訪問XML文檔淆游。 一棵DOM樹包含全部元素節(jié)點(diǎn)和文本節(jié)點(diǎn)傍睹。可以前后遍歷樹中的每一個(gè)節(jié)點(diǎn)稽犁。

? ? ? 整個(gè)文檔樹在內(nèi)存中焰望,便于操作;支持刪除已亥、修改熊赖、重新排列等多種功能。

? ? ? 將整個(gè)文檔調(diào)入內(nèi)存(包括無(wú)用的節(jié)點(diǎn))虑椎,浪費(fèi)時(shí)間和空間震鹉。

? ? ? 一旦解析了文檔還需多次訪問這些數(shù)據(jù)俱笛;硬件資源充足(內(nèi)存、CPU)情況下使用传趾。

? ? 2.DOM樹與節(jié)點(diǎn)

? ? ? XML文檔被解析成樹型結(jié)構(gòu)迎膜。

? ? ? 樹由節(jié)點(diǎn)組成。共有12種不同的節(jié)點(diǎn)浆兰。

? ? ? 節(jié)點(diǎn)可以包含其他節(jié)點(diǎn)(依賴于節(jié)點(diǎn)的類型)磕仅。

? ? ? 父節(jié)點(diǎn)包含子節(jié)點(diǎn)。葉子節(jié)點(diǎn)沒有子節(jié)點(diǎn)簸呈。

? ? 3.節(jié)點(diǎn)類型

? ? ? Document node? 包含:一個(gè)根Element節(jié)點(diǎn)榕订。一個(gè)或多個(gè)處理指令節(jié)點(diǎn)。

? ? ? Document Fragment node

? ? ? Element node包含:其他Element節(jié)點(diǎn)蜕便。若干個(gè)Text節(jié)點(diǎn)劫恒。若干個(gè)Attribute節(jié)點(diǎn)。

? ? ? Attribute node? 包含:一個(gè)Text節(jié)點(diǎn)轿腺。

? ? ? Text node

? ? ? Comment node

? ? ? Processing instruction node

? ? ? Document type node

? ? ? Entity node

? ? ? Entity reference node

? ? ? CDATA section node

? ? ? Notation node

二两嘴、 SAX 基于事件處理模式

? ? 解析器向一個(gè)事件處理程序發(fā)送事件,比如元素開始和元素結(jié)束族壳,而事件處理器則處理該信息憔辫。

? ? 然后應(yīng)用程序本身就能夠處理該數(shù)據(jù)。原始的文檔仍然保留完好無(wú)損决侈。

<![CDATA[################## SAX處理器(遍歷XML) ###########################]]>

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.SAXParseException;

import org.xml.sax.helpers.DefaultHandler;

public class TestSAXParser {

? ? /** 基于SAX方式解析XML文檔 */

? ? public static void main(String[] args)

? ? throws SAXException,ParserConfigurationException,IOException{

? ? ? ? SAXParserFactory factory = SAXParserFactory.newInstance(); //創(chuàng)建SAX解析器工廠

? ? ? ? factory.setValidating(true);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //讓error方法生效

? ? ? ? SAXParser parser = factory.newSAXParser();? ? ? ? ? ? ? ? //生成一個(gè)具體的SAX解析器

? ? ? ? parser.parse("src/file/student.xml",new XMLreader());? ? ? //開始解析

}}

class XMLreader extends DefaultHandler {

? ? // 只需覆蓋我們感興趣的方法

? ? private int counter = 0;// 定義一個(gè)計(jì)數(shù)器螺垢,保存XML文檔觸發(fā)事件的次數(shù)

?

? ? @Override? // 文檔開始事件觸發(fā)

? ? public void startDocument() throws SAXException {

? ? ? ? counter++;

? ? ? ? System.out.println(counter + ".解析XML文件開始...");}

? ?

? ? @Override? // 文檔結(jié)束事件觸發(fā)

? ? public void endDocument() throws SAXException {

? ? counter++;

? ? System.out.println("/r/n"+counter + ".解析XML文件結(jié)束...");}

? ?

? ? @Override? // 元素開始事件觸發(fā)

? ? public void startElement(String uri, String localName, String qName,

? ? Attributes atts) throws SAXException {

? ? ? counter++;

? ? ? System.out.print(counter+".<"+qName);

? ? ? ? for(int i=0; i<atts.getLength();i++){ //讀取標(biāo)志的所有屬性

? ? ? ? ? System.out.print(" "+atts.getLocalName(i)+"="+atts.getValue(i));

? ? ? }System.out.print(">"); }

? ?

? ? @Override? // 元素結(jié)束事件觸發(fā)

? ? public void endElement(String uri, String localName, String qName) throws SAXException {

? ? ? ? counter++;

? ? ? ? System.out.print(counter +".</"+qName+">");}

? ?

? ? @Override // 文本事件觸發(fā)? 打印時(shí)盡量不要換行,否則很難看

? ? public void characters(char[] ch, int start, int length)throws SAXException {

? ? ? ? counter++;

? ? ? ? String text = new String(ch, start, length); // 當(dāng)前元素的文本值

? ? ? ? System.out.print(counter + ".Text=" + text);}

? ?

? ? @Override //這是可恢復(fù)錯(cuò)誤赖歌。需在SAXParserFactory設(shè)置有效性錯(cuò)誤才能生效

? ? public void error(SAXParseException e) throws SAXException {

? ? ? ? System.out.println("xml文檔有效性錯(cuò)誤:"+e);}

? ?

? ? @Override //嚴(yán)重錯(cuò)誤

? ? public void fatalError(SAXParseException e) throws SAXException {

? ? ? ? System.out.println("xml文檔嚴(yán)重的有效性錯(cuò)誤:"+e);}

}

<![CDATA[################## SAX處理器(遍歷XML)結(jié)束 ###########################]]>

三枉圃、 DOM

<![CDATA[######################### DOM遍歷方式 ###########################]]>

import java.io.File;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

/**基于DOM的解析XML文檔*/

public class TestDOMParser {

public static void main(String[] args)

throws ParserConfigurationException,SAXException,IOException{

? //創(chuàng)建一個(gè)DOM解析器工廠

? DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();?

? //從工廠中生成一個(gè)DOM解析器; throws ParserConfigurationException

? DocumentBuilder builder = factory.newDocumentBuilder();?

? //綁定需要解析的XML文件

? File xmlFile = new File("src/file/student.xml");//相對(duì)地址庐冯,相對(duì)于這個(gè)工程?

? //開始解析 孽亲;throws SAXException,IOException

? Document document = builder.parse(xmlFile);

? //取出唯一的根元素

? Element rootElement = document.getDocumentElement();

? ? ? ? //調(diào)用業(yè)務(wù)方法: 遍歷根元素

? printElement(rootElement);

}

/** 遍歷元素,包含: 子元素展父、屬性返劲、文本內(nèi)容 */

private static void printElement(Element e){

? //打印出元素的標(biāo)簽名

? System.out.print("<"+e.getTagName());

? //獲取開始標(biāo)簽的屬性

? NamedNodeMap attMap = e.getAttributes();

? //循環(huán)遍歷所有的屬性

? for (int i=0;i<attMap.getLength();i++){

? Attr attr = (Attr)attMap.item(i);

? System.out.print(" "+attr.getName()+"="+attr.getValue());}

? System.out.print(">");

?

? //獲取當(dāng)前元素的所有子節(jié)點(diǎn)

? NodeList nl = e.getChildNodes();

? for (int j=0;j<nl.getLength();j++){

? Node n = nl.item(j);

? if (Node.ELEMENT_NODE==n.getNodeType()){

? ? printElement((Element)n);//遞歸調(diào)用,以遍歷下一個(gè)元素

? } else {

? ? System.out.print(n.getTextContent());

? }

? }

? //打印結(jié)束標(biāo)簽

? System.out.print("</"+e.getTagName()+">");

}}

<![CDATA[ ###################### DOM遍歷 完畢 ##########################]]>

比較DOM與SAX:

? ? DOM:處理大型文件時(shí)其性能下降的非常厲害栖茉。這個(gè)問題是由DOM的樹結(jié)構(gòu)所造成的篮绿,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì)XML的隨機(jī)訪問

? ? 優(yōu)點(diǎn):1.提供隨機(jī)定義元素操作吕漂,來(lái)回移動(dòng)指針

? ? ? ? 2.將整個(gè)XML文件一次性加載到內(nèi)存亲配,形成虛的內(nèi)存樹

? ? 缺點(diǎn):1.如果XML文件較大,內(nèi)存空間占用較大

? ? ? ? 2.強(qiáng)制將較大的XML文件加載到內(nèi)存中,有可能損害文件

? ? ? ? 3.功能通用性

? ? SAX:不同于DOM,SAX是事件驅(qū)動(dòng)型的XML解析方式吼虎。它順序逐行讀取XML文件犬钢,不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開頭思灰,文檔結(jié)束玷犹,或者標(biāo)簽開頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸發(fā)一個(gè)事件洒疚,用戶通過(guò)在其回調(diào)事件中寫入處理代碼來(lái)處理XML文件歹颓,適合對(duì)XML的順序訪問

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市油湖,隨后出現(xiàn)的幾起案子晴股,更是在濱河造成了極大的恐慌,老刑警劉巖肺魁,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隔节,居然都是意外死亡鹅经,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門怎诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘾晃,“玉大人,你說(shuō)我怎么就攤上這事幻妓”奈螅” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵肉津,是天一觀的道長(zhǎng)强胰。 經(jīng)常有香客問我,道長(zhǎng)妹沙,這世上最難降的妖魔是什么偶洋? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮距糖,結(jié)果婚禮上玄窝,老公的妹妹穿的比我還像新娘。我一直安慰自己悍引,他們只是感情好恩脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趣斤,像睡著了一般俩块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天典阵,我揣著相機(jī)與錄音奋渔,去河邊找鬼。 笑死壮啊,一個(gè)胖子當(dāng)著我的面吹牛嫉鲸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歹啼,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼玄渗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狸眼?” 一聲冷哼從身側(cè)響起藤树,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓萌,沒想到半個(gè)月后岁钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微王,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年屡限,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕倘。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钧大,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罩旋,到底是詐尸還是另有隱情啊央,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布涨醋,位于F島的核電站瓜饥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏东帅。R本人自食惡果不足惜压固,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠闭。 院中可真熱鬧帐我,春花似錦、人聲如沸愧膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)檩淋。三九已至芬为,卻和暖如春萄金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媚朦。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工氧敢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人询张。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓孙乖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親份氧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唯袄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. XML簡(jiǎn)介 以下內(nèi)容來(lái)自于http://www.w3school.com.cn/xml 基本知識(shí) XML 和...
    WebSSO閱讀 1,905評(píng)論 1 7
  • 經(jīng)過(guò)兩天的奮戰(zhàn),終于把xml簡(jiǎn)略的過(guò)了一遍蜗帜。 1.1XML介紹 xml是Extensible Markup lan...
    Ystrator閱讀 807評(píng)論 0 2
  • ??DOM(文檔對(duì)象模型)是針對(duì) HTML 和 XML 文檔的一個(gè) API(應(yīng)用程序編程接口)厅缺。 ??DOM 描繪...
    霜天曉閱讀 3,619評(píng)論 0 7
  • 春天的柳絮 夏天的熱風(fēng) 秋天的颯爽 冬天的白凈 一季 又一季 像所有的 遇見 又分離了 在他鄉(xiāng) 遇見故鄉(xiāng)的你 最美...
    珊瑚的魚閱讀 146評(píng)論 0 1
  • 每個(gè)時(shí)代流行的文化都不一樣 Q:為什么韓國(guó)文化會(huì)成為中國(guó)現(xiàn)在年輕人最喜歡的一種流行文化趨勢(shì)蔬顾? 韓國(guó)經(jīng)濟(jì)地位的改變 ...
    ruofeng8閱讀 1,072評(píng)論 0 0