分析詳解什么尚_第1頁(yè)
分析詳解什么尚_第2頁(yè)
分析詳解什么尚_第3頁(yè)
分析詳解什么尚_第4頁(yè)
分析詳解什么尚_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

講師:佟剛新浪微博:尚硅谷-佟剛XML及XML解析什么是XML什么是XML,為什么學(xué)習(xí)XML?中國(guó)北京湖南湖北海淀豐臺(tái)長(zhǎng)沙岳陽(yáng)武漢荊州在現(xiàn)實(shí)生活中大量存在有關(guān)系的數(shù)據(jù),如圖所示。問(wèn)題:這樣的數(shù)據(jù)如何交給計(jì)算機(jī)處理呢?ExtensibleMarkupLanguage,翻譯過(guò)來(lái)為可擴(kuò)展標(biāo)記語(yǔ)言。Xml技術(shù)是w3c組織發(fā)布的,目前推薦遵循的是W3C組織于2000發(fā)布的XML1.0規(guī)范。XML技術(shù)用于解決什么問(wèn)題?<?xmlversion="1.0"encoding="UTF-8"?><中國(guó)> <北京> <海淀></海淀> <豐臺(tái)></豐臺(tái)> </北京> <遼寧> <沈陽(yáng)></沈陽(yáng)> <大連></大連> </遼寧> <吉林> <長(zhǎng)春></長(zhǎng)春> <四平></四平> </吉林></中國(guó)>XML語(yǔ)言出現(xiàn)的根本目標(biāo)在于描述上圖那種,在現(xiàn)實(shí)生活中經(jīng)常出現(xiàn)的有關(guān)系的數(shù)據(jù)。在XML語(yǔ)言中,它允許用戶自定義標(biāo)簽。一個(gè)標(biāo)簽用于描述一段數(shù)據(jù);一個(gè)標(biāo)簽可分為開始標(biāo)簽和結(jié)束標(biāo)簽,在開始標(biāo)簽和結(jié)束標(biāo)簽之間,又可以使用其它標(biāo)簽描述其它數(shù)據(jù),以此來(lái)實(shí)現(xiàn)數(shù)據(jù)關(guān)系的描述。例如:XML常見(jiàn)應(yīng)用XML技術(shù)除用于保存有關(guān)系的數(shù)據(jù)之外,它還經(jīng)常用作軟件配置文件,以描述程序模塊之間的關(guān)系。在一個(gè)軟件系統(tǒng)中,為提高系統(tǒng)的靈活性,它所啟動(dòng)的模塊通常由其配置文件決定例如一個(gè)軟件在啟動(dòng)時(shí),它需要啟動(dòng)A、B兩個(gè)模塊,而A、B這兩個(gè)模塊在啟動(dòng)時(shí),又分別需要A1、A2和B1、B2模塊的支持,為了準(zhǔn)確描述這種關(guān)系,此時(shí)使用XML文件最為合適不過(guò)。XML文檔規(guī)則XML文檔的分類格式不良好(malformed)的xml文檔:完全沒(méi)有遵守xml文檔的基本規(guī)范的xml文檔。格式良好(well-formed)的但無(wú)效的xml文檔:遵守xml文的基本規(guī)范,但沒(méi)有使用dtd或schema定義語(yǔ)義約束的xml文檔。有效(valid)的xml文檔:遵守xml文的基本規(guī)范,并使用dtd或schema定義語(yǔ)義約束,而且也完全遵守了dtd或schema定義語(yǔ)義約束的xml文檔。XML語(yǔ)法一個(gè)XML文件分為如下幾部分內(nèi)容:文檔聲明元素屬性注釋CDATA區(qū)、特殊字符處理指令(processinginstruction)XML語(yǔ)法-文檔聲明在編寫XML文檔時(shí),需要先使用文檔聲明,聲明XML文檔的類型。最簡(jiǎn)單的聲明語(yǔ)法:

<?xmlversion="1.0"?>用encoding屬性說(shuō)明文檔的字符編碼:

<?xmlversion="1.0"encoding="GB2312"?>

用standalone屬性說(shuō)明文檔是否獨(dú)立:

<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>常見(jiàn)錯(cuò)誤,見(jiàn)PPT下面的備注區(qū)元素(1)XML元素指XML文件中出現(xiàn)的標(biāo)簽,一個(gè)標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽,一個(gè)標(biāo)簽有如下幾種書寫形式,例如:包含標(biāo)簽體:<a>atguigu</a>不含標(biāo)簽體的:<a/>一個(gè)標(biāo)簽中也可以嵌套若干子標(biāo)簽。但所有標(biāo)簽必須合理的嵌套,絕對(duì)不允許交叉嵌套,例如:

<a>eto<b>atguigu</a></b>格式良好的XML文檔必須有且僅有一個(gè)根標(biāo)簽,其它標(biāo)簽都是這個(gè)根標(biāo)簽的子孫標(biāo)簽。元素(2)對(duì)于XML標(biāo)簽中出現(xiàn)的所有空格和換行,XML解析程序都會(huì)當(dāng)作標(biāo)簽內(nèi)容進(jìn)行處理。例如:下面兩段內(nèi)容的意義是不一樣的。第一段:<網(wǎng)址>atguigu</網(wǎng)址>第二段:

<網(wǎng)址> atguigu </網(wǎng)址>由于在XML中,空格和換行都作為原始內(nèi)容被處理,所以,在編寫XML文件時(shí),使用換行和縮進(jìn)等方式來(lái)讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。元素(3)——命名規(guī)范一個(gè)XML元素可以包含字母、數(shù)字以及其它一些可見(jiàn)字符,但必須遵守下面的一些規(guī)范:區(qū)分大小寫,例如,<P>和<p>是兩個(gè)不同的標(biāo)記。不能以數(shù)字或"_"(下劃線)開頭。不能以xml(或XML、或Xml等)開頭。不能包含空格。名稱中間不能包含冒號(hào)(:)。屬性一個(gè)標(biāo)簽可以有多個(gè)屬性,每個(gè)屬性都有它自己的名稱和取值,例如:<inputname=“text”/>屬性值一定要用雙引號(hào)(")或單引號(hào)(')引起來(lái)定義屬性必須遵循與標(biāo)簽相同的命名規(guī)范多學(xué)一招:在XML技術(shù)中,標(biāo)簽屬性所代表的信息,也可以被改成用子元素的形式來(lái)描述,例如:

<input> <name>text</name> </input>注釋XML文件中的注釋采用:“<!--注釋-->”格式。注意:XML聲明之前不能有注釋注釋不能嵌套,例如:

<!--大段注釋

…… <!--局部注釋--> …… -->CDATA區(qū)在編寫XML文件時(shí),有些內(nèi)容可能不想讓解析引擎解析執(zhí)行,而是當(dāng)作原始內(nèi)容處理。遇到此種情況,可以把這些內(nèi)容放在CDATA區(qū)里,對(duì)于CDATA區(qū)域內(nèi)的內(nèi)容,XML解析程序不會(huì)處理,而是直接原封不動(dòng)的輸出。語(yǔ)法:<![CDATA[內(nèi)容]]> <![CDATA[ <atguigu> <br/> </atguigu> ]]>轉(zhuǎn)義字符對(duì)于一些單個(gè)字符,若想顯示其原始樣式,也可以使用轉(zhuǎn)義的形式予以處理。處理指令處理指令,簡(jiǎn)稱PI(processinginstruction)。處理指令用來(lái)指揮解析引擎如何解析XML文檔內(nèi)容。例如,在XML文檔中可以使用xml-stylesheet指令,通知XML解析引擎,應(yīng)用css文件顯示xml文檔內(nèi)容。

<?xml-stylesheettype="text/css"href="1.css"?>處理指令必須以“<?”作為開頭,以“?>”作為結(jié)尾,XML聲明語(yǔ)句就是最常見(jiàn)的一種處理指令。XML解析XML的解析器在解析XML文檔時(shí),通常是利用現(xiàn)有的XML解析器軟件對(duì)XML文檔進(jìn)行分析,而應(yīng)用程序則通過(guò)解析器提供的API接口得到XML數(shù)據(jù)XML文檔應(yīng)用程序APIXML解析器目前幾乎所有的解析器都對(duì)兩套標(biāo)準(zhǔn)的API提供了支持,他們是DOM和SAXDOM,SAX和JAXPDOM(DocumentObjectModel,即文檔對(duì)象模型)是W3C組織推薦的處理XML的標(biāo)準(zhǔn)接口SAX(SimpleAPIforXML)不是某個(gè)官方標(biāo)準(zhǔn),,但它是XML社區(qū)事實(shí)上的標(biāo)準(zhǔn),幾乎所有的XML解析器都支持它DOM和SAX只是定義了一些接口,以及接口的默認(rèn)實(shí)現(xiàn),一個(gè)應(yīng)用程序要想利用DOM或SAX訪問(wèn)XML,還需要一個(gè)實(shí)現(xiàn)了DOM或SAX的解析器不同解析器的實(shí)現(xiàn)類是不同的,在底層更換解析器時(shí),需要少量的修改應(yīng)用程序的代碼。為了屏蔽具體廠商的XML解析器實(shí)現(xiàn),使Java程序員以一種標(biāo)準(zhǔn)的方式對(duì)XML進(jìn)行編程,SUN公司制定了JAXP(JavaAPIforXMLProcessing)規(guī)范JAXP并沒(méi)有提供解析XML的新方法,也沒(méi)有為XML的處理器提供新功能,它只是在解析器之上提供了一個(gè)抽象層,允許程序員以獨(dú)立于廠商的API訪問(wèn)XML數(shù)據(jù)JAXP從JAXP1.1開始,JAXP成為了J2SE和J2EE的一部分JAXP開發(fā)包由javax.xml包及其子包,org.w3c.dom包及其子包,org.xml.sax包及其子包組成在javax.xml.parsers包中,定義了幾個(gè)工廠類,用于加載DOM和SAX的實(shí)現(xiàn)類。JAXP由接口,抽象類和一些輔助類組成,符合JAXP規(guī)范的解析器實(shí)現(xiàn)其中的接口和抽象類,程序員只要使用JAXP的API編程,底層的解析器就可以隨意切換了。DOM概述DOM是獨(dú)立于程序語(yǔ)言的,W3C組織以IDL(InterfaceDefinitionLanguage,接口定義語(yǔ)言)的形式定義了DOM中的接口某種程序語(yǔ)言要實(shí)現(xiàn)DOM,需要將DOM接口轉(zhuǎn)換為本語(yǔ)言中的對(duì)應(yīng)結(jié)構(gòu)。DOM結(jié)構(gòu)模型DOM中的核心概念是節(jié)點(diǎn)。DOM在解析XML文檔時(shí),將組成XML文檔的各個(gè)部分(元素,屬性,文本等)映射為一個(gè)對(duì)象,這個(gè)對(duì)象就是一個(gè)節(jié)點(diǎn)在內(nèi)存中,這些節(jié)點(diǎn)形成一棵文檔樹。整棵樹也是一個(gè)節(jié)點(diǎn),樹中的每一個(gè)子節(jié)點(diǎn)也是一棵樹(子樹).DOM就是對(duì)一棵樹的一個(gè)對(duì)象表示,通過(guò)訪問(wèn)樹中的節(jié)點(diǎn)來(lái)存取XML文檔的內(nèi)容。DOM定義了一個(gè)Node接口,用于表示文檔樹中的一個(gè)節(jié)點(diǎn)。從這個(gè)接口派生處更多的具體的接口:表示整個(gè)文檔的Document對(duì)象,表示XML文檔中元素的Element接口,表示屬性元素的Attr接口等DOM中的節(jié)點(diǎn)類型XML中最常見(jiàn)的節(jié)點(diǎn)類型是:文檔,元素,文本和屬性,在DOMAPI中對(duì)應(yīng)的接口是:Document,Element,Text和Attr。文檔節(jié)點(diǎn) 文檔節(jié)點(diǎn)是文檔樹的根節(jié)點(diǎn),也是文檔中其他所有節(jié)點(diǎn)的父節(jié)點(diǎn)。文檔節(jié)點(diǎn)并不是XML文檔的根元素,因?yàn)樵赬ML文檔中,處理指令,注釋等內(nèi)容可以出現(xiàn)在根節(jié)點(diǎn)之外,所以在構(gòu)造DOM樹時(shí),根元素并不適合作為根節(jié)點(diǎn),而作為文檔節(jié)點(diǎn)的子節(jié)點(diǎn)。在DOMAPI中根節(jié)點(diǎn)是通過(guò)org.w3c.dom.Document接口來(lái)表示的。為了得到XML文檔的根元素,在Document接口中可以調(diào)用如下方法:ElementgetDocumentElement();元素節(jié)點(diǎn)元素節(jié)點(diǎn)表示了XML文檔中的元素。元素?fù)碛凶釉?,文本?jié)點(diǎn)或兩者的組合元素節(jié)點(diǎn)也是唯一能夠擁有屬性的節(jié)點(diǎn)類型在DOMAPI中,元素節(jié)點(diǎn)是通過(guò)org.w3c.dom.Element接口定義的。文本節(jié)點(diǎn)文本節(jié)點(diǎn)是只包含文本內(nèi)容的節(jié)點(diǎn),也可以只包含空白在文檔樹中,元素和屬性的文本內(nèi)容都是由文本節(jié)點(diǎn)來(lái)表示的在DOMAPI中,文本節(jié)點(diǎn)是由org.w3c.dom.Text接口來(lái)表示的。屬性節(jié)點(diǎn)屬性節(jié)點(diǎn)代表了元素中的屬性在DOMAPI中,屬性節(jié)點(diǎn)通過(guò)org.w3c.dom.Attr接口來(lái)表示因?yàn)閷傩詫?shí)際上是附屬于元素的,所以屬性節(jié)點(diǎn)不是元素的子節(jié)點(diǎn),而不作為單獨(dú)的節(jié)點(diǎn)在文檔樹中出現(xiàn)NodeList接口NodeListorg.w3c.dom.NodeList接口提供了一個(gè)有序節(jié)點(diǎn)集合的抽象NodeList是活動(dòng)的:例如使用Node接口的getChildNodes()方法得到一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)列表,然后調(diào)用removeChild()等方法都會(huì)影響到NodeList對(duì)象,也就是說(shuō),當(dāng)再次調(diào)用getLength()方法的返回值和以前會(huì)不一樣。DOM解析工廠和DOM解析器在javax.xml.parsers包中,定義了DOM解析器工廠類DocumentBuilderFactory,用于產(chǎn)生DOM解析器。DocumentBuilderFactory是一個(gè)抽象類,在這個(gè)類中提供了一個(gè)靜態(tài)方法newInstance()方法來(lái)創(chuàng)建工廠類的一個(gè)實(shí)例DocumentBuilderFactory本身是一個(gè)抽象類,不能直接實(shí)例化,這就需要一個(gè)從DocumentBuilderFactory類繼承的實(shí)現(xiàn)類,而這個(gè)實(shí)現(xiàn)類是由JAXP規(guī)范的解析器提供商給出的。解析器的提供商為自身的解析器編寫一個(gè)從DocumentBuilderFactory類繼承的工廠類,然后由這個(gè)工廠類的實(shí)例負(fù)責(zé)產(chǎn)生解析器對(duì)象newInstance()方法通過(guò)一下4種途徑依次查找解析器工廠類:查看是否設(shè)置了javax.xml.parsers.DocumentBuilderFactory系統(tǒng)屬性查找jre目錄種的lib目錄下的perties文件在classpath環(huán)境變量所指定的jar文件種,查找META-INF/services目錄下的javax.xml.DocumentBuilderFactory文件,使用這個(gè)文件所指定的工廠類名來(lái)構(gòu)造工廠類的實(shí)例采用平臺(tái)默認(rèn)的解析器工廠類DOM解析XML文檔的步驟調(diào)用DocumentBuilderFactory.newInstance()方法得到DOM解析器工廠類實(shí)例調(diào)用解析器工廠實(shí)例類的newDocumentBuilder()方法得到DOM解析器對(duì)象調(diào)用DOM解析器對(duì)象的parse()方法解析XML文檔得到代表整個(gè)文檔的Document對(duì)象使用SAX解析XML文檔--Why在使用DOM解析XML文檔時(shí),需要讀取整個(gè)XML文檔,然后在內(nèi)存中創(chuàng)建DOM樹,生成DOM樹上的每個(gè)節(jié)點(diǎn)對(duì)象,只有在整個(gè)DOM樹創(chuàng)建完成后,才能做需要的修改操作,即使是只需要修改根元素節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)。當(dāng)XML文檔較大時(shí),構(gòu)建DOM樹將花大量的時(shí)間和內(nèi)存SAX允許在讀取文檔的時(shí)候,即對(duì)文檔進(jìn)行處理,解析完畢也就處理完成了,不必等到整個(gè)文檔被分析儲(chǔ)存之后才進(jìn)行操作SAX的處理機(jī)制SAX是一種基于事件驅(qū)動(dòng)的API利用SAX解析XML文檔,涉及兩個(gè)部分:解析器和事件處理器:解析器負(fù)責(zé)讀取XML文檔,并向事件處理器發(fā)送事件事件處理器負(fù)責(zé)對(duì)事件做出相應(yīng),對(duì)傳遞的XML數(shù)據(jù)進(jìn)行處理SAX解析器在解析這該文檔時(shí),會(huì)產(chǎn)生下列事件。這些事件被發(fā)送到事件處理器中然后由事件處理器中相應(yīng)的方法對(duì)事件做出相應(yīng)解析器----XMLReader接口SAX解析器接口和事件處理器接口在org.xml.sax包中定義XMLReader接口是SAX2.0解析器必須實(shí)現(xiàn)的接口。該接口允許應(yīng)用程序設(shè)置和查詢解析器的功能和特性,注冊(cè)處理文檔的事件處理器,以及啟動(dòng)文檔的解析XML解析器提供商負(fù)責(zé)提供實(shí)現(xiàn)XMLReader接口的解析器類事件處理器----ContentHander接口SAXAPI定義了許多事件,這些事件分別由事件處理器中的相應(yīng)方法去響應(yīng)如果應(yīng)用程序要獲得基本的解析事件,需要實(shí)現(xiàn)ContentHandler(內(nèi)容事件處理器)接口,并使用XMLReader對(duì)象的setContentHeader()方法向解析器注冊(cè)一個(gè)ContentHandler實(shí)例。解析器使用這個(gè)實(shí)例來(lái)報(bào)告與文檔相關(guān)的基本事件。如:元素的開始和結(jié)束等。在ContentHandler接口中,事件的順序反映了文檔自身信息的順序。如:元素的所有內(nèi)容(字符數(shù)據(jù),子元素)都將依次在startElement事件和endElem

溫馨提示

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

評(píng)論

0/150

提交評(píng)論