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

下載本文檔

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

文檔簡介

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

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

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

用standalone屬性說明文檔是否獨立:

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

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

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

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

<!--大段注釋

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

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

溫馨提示

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

評論

0/150

提交評論