XML編程詳細(xì)講解_第1頁(yè)
XML編程詳細(xì)講解_第2頁(yè)
XML編程詳細(xì)講解_第3頁(yè)
XML編程詳細(xì)講解_第4頁(yè)
XML編程詳細(xì)講解_第5頁(yè)
已閱讀5頁(yè),還剩66頁(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概述主要內(nèi)容XML及其語(yǔ)法XML約束之DTDXML編程(CRUD---CreateReadUpdateDelete)XML約束之Schema什么是XMLXML是指可擴(kuò)展標(biāo)記語(yǔ)言(eXtensible

MarkupLanguage),它是一種標(biāo)記語(yǔ)言,很類似HTML。它被設(shè)計(jì)的宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)。XML標(biāo)簽沒(méi)有被預(yù)定義,需要用戶自行定義標(biāo)簽。XML技術(shù)是W3C組織(WorldWideWebConsortium萬(wàn)維網(wǎng)聯(lián)盟)發(fā)布的,目前遵循的是W3C組織于2000年發(fā)布的XML1.0規(guī)范。XML被廣泛認(rèn)為是繼Java之后在Internet上最激動(dòng)人心的新技術(shù)。XML技術(shù)用于解決什么問(wèn)題?在現(xiàn)實(shí)生活中存在大量有關(guān)系的數(shù)據(jù),如右圖所示。問(wèn)題:這樣的數(shù)據(jù)該如何表示并交給計(jì)算機(jī)處理呢?XML技術(shù)用于解決什么問(wèn)題?XML語(yǔ)言出現(xiàn)的根本目的在于描述向上圖那種有關(guān)系的數(shù)據(jù)。XML是一種通用的數(shù)據(jù)交換格式。在XML語(yǔ)言中,它允許用戶自定義標(biāo)簽。一個(gè)標(biāo)簽用于描述一段數(shù)據(jù);一個(gè)標(biāo)簽可分為開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽,在起始標(biāo)簽之間,又可以使用其它標(biāo)簽描述其它數(shù)據(jù),以此來(lái)實(shí)現(xiàn)數(shù)據(jù)關(guān)系的描述。XML中的數(shù)據(jù)必須通過(guò)軟件程序來(lái)解析執(zhí)行或顯示,如IE;這樣的解析程序稱之為Parser(解析器)。<?xmlversion="1.0"encoding="UTF-8"?><中國(guó)> <北京> <海淀></海淀> <豐臺(tái)></豐臺(tái)> </北京> <山東> <濟(jì)南></濟(jì)南> <青島></青島> </山東> <湖北> <武漢></武漢> <荊州></荊州> </湖北></中國(guó)>XML常見(jiàn)應(yīng)用在Java開(kāi)發(fā)中,傳統(tǒng)的配置文件是*.properties屬性文件(key=value),而XML表示的數(shù)據(jù)更為豐富。XML技術(shù)除用于描述有關(guān)系的數(shù)據(jù)外,還經(jīng)常用作軟件配置文件,以描述程序模塊之間的關(guān)系。(如后面將要學(xué)習(xí)到的Struts、Spring和Hibernate都是基于XML作為配置文件的)在一個(gè)軟件系統(tǒng)中,通過(guò)XML配置文件可以提高系統(tǒng)的靈活性。即程序的行為是通過(guò)XML文件來(lái)配置的,而不是硬編碼。XML語(yǔ)法XML文檔的組成一個(gè)XML文件一般由以下幾部分組成:文檔聲明元素元素的屬性注釋CDATA區(qū)特殊字符處理指令(PI:Processing

Instruction)文檔聲明在編寫XML文檔時(shí),需要先使用文檔聲明來(lái)聲明XML文檔。且必須出現(xiàn)在文檔的第一行。最簡(jiǎn)單的語(yǔ)法:<?xmlversion=“1.0”?>用encoding屬性說(shuō)明文檔所使用的字符編碼,默認(rèn)為UTF-8。保存在磁盤上的文件編碼要與聲明的編碼一致。

如:<?xmlversion=“1.0”encoding=“GB2312”?>用standalone屬性說(shuō)明文檔是否獨(dú)立,即是否依賴其他文檔。 如:<?xmlversion=“1.0”standalone=“yes”?>元素(1)XML元素指XML文件中出現(xiàn)的標(biāo)簽。一個(gè)標(biāo)簽分為起始和結(jié)束標(biāo)簽(不能省略)。一個(gè)標(biāo)簽有如下幾種書寫形式:包含標(biāo)簽主體:<mytag>somecontent</mytag>不含標(biāo)簽主體:<mytag/>一個(gè)標(biāo)簽中可以嵌套若干子標(biāo)簽,但所有標(biāo)簽必須合理的嵌套,不允許有交叉嵌套。<mytag1><mytag2></mytag1></mytag2>WRONG一個(gè)XML文檔必須有且僅有一個(gè)根標(biāo)簽,其他標(biāo)簽都是這個(gè)根標(biāo)簽的子標(biāo)簽或?qū)O標(biāo)簽。元素(2)XML中不會(huì)忽略主體內(nèi)容中出現(xiàn)的空格和換行。注:由于在XML中,空格和換行都作為原始內(nèi)容被處理,所以,在編寫XML文件時(shí),使用換行和縮進(jìn)等方式來(lái)讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。第一段:<中國(guó)><北京><海淀/></北京></中國(guó)>

第二段:<中國(guó)>\r\n\t <北京> <海淀/> </北京></中國(guó)>給人看元素(3)--元素命名規(guī)范元素(標(biāo)簽)的名稱可以包含字母、數(shù)字、減號(hào)、下劃線和英文句點(diǎn),但必須遵守下面的一些規(guī)范:嚴(yán)格區(qū)分大小寫;<P><p>只能以字母或下劃線開(kāi)頭;abc_abc不能以xml(或XML、Xml等)開(kāi)頭----W3C保留日后使用;名稱字符之間不能有空格或制表符;ab名稱字符之間不能使用冒號(hào);(有特殊用途)元素的屬性一個(gè)元素可以有多個(gè)屬性,每個(gè)屬性都有它自己的名稱和取值,例如:<mytagname=“value”…/>屬性值一定要用引號(hào)(單引號(hào)或雙引號(hào))引起來(lái)。屬性名稱的命名規(guī)范與元素的命名規(guī)范相同元素中的屬性是不允許重復(fù)的在XML技術(shù)中,標(biāo)簽屬性所代表的信息也可以被改成用子元素的形式來(lái)描述,例如:<mytag> <name> <firstName/> <lastName/> </name></mytag>注釋XML中的注釋語(yǔ)法為:<!--這是注釋-->注意:XML聲明之前不能有注釋注釋不能嵌套,例如:<!--大段注釋… <!--有一段注釋-->…-->WRONGCDATA區(qū)CDATA是CharacterData的縮寫作用:把標(biāo)簽當(dāng)做普通文本內(nèi)容;語(yǔ)法:<![CDATA[內(nèi)容]]><![CDATA[

<itcast></itcast>]]>以上紅色部分被當(dāng)做普通文本而不是標(biāo)簽特殊字符對(duì)于一些特殊字符,若要在元素主體內(nèi)容中顯示,必須進(jìn)行轉(zhuǎn)義。處理指令處理指令,簡(jiǎn)稱PI(Processing

Instruction)。作用:用來(lái)指揮軟件如何解析XML文檔。語(yǔ)法:必須以“<?”作為開(kāi)頭,以“?>”作為結(jié)尾。常用處理指令:XML聲明:<?xmlversion=“1.0”encoding=“GB2312”?>xml-stylesheet指令:作用:指示XML文檔所使用的CSS樣式XSL。<?xml-stylesheettype=“text/css”href=“some.css”?>注:對(duì)中文命名的標(biāo)簽元素不起作用XML約束之DTD為什么需要約束XML都是用戶自定義的標(biāo)簽,若出現(xiàn)小小的錯(cuò)誤,軟件程序?qū)⒉荒苷_地獲取文件中的內(nèi)容而報(bào)錯(cuò)。(如:Tomcat)XML技術(shù)中,可以編寫一個(gè)文檔來(lái)約束一個(gè)XML的書寫規(guī)范,這個(gè)文檔稱之為約束。兩個(gè)概念:格式良好的XML:遵循XML語(yǔ)法的XML有效的XML:遵循約束文檔的XML總之:約束文檔定義了在XML中允許出現(xiàn)的元素名稱、屬性及元素出現(xiàn)的順序等等。常用的約束技術(shù)XMLDTDXDRSOXXMLSchemaDTD快速入門DTD(DocumentTypeDefinition):文檔類型定義。作用:約束XML的書寫規(guī)范文件清單:book.xml<?xmlversion="1.0"?><!DOCTYPE書架SYSTEM"book.dtd"><書架> <書> <書名>Java就業(yè)培訓(xùn)教程</書名> <作者>張孝祥</作者> <售價(jià)>39.00元</售價(jià)> </書> <書> <書名>JavaScript網(wǎng)頁(yè)開(kāi)發(fā)</書名> <作者>張孝祥</作者> <售價(jià)>28.00元</售價(jià)> </書></書架>文件清單:book.dtd

<!ELEMENT書架(書+)> <!ELEMENT書(書名,作者,售價(jià))> <!ELEMENT書名(#PCDATA)> <!ELEMENT作者(#PCDATA)> <!ELEMENT售價(jià)(#PCDATA)>驗(yàn)證XML的有效性如何根據(jù)DTD中定義的內(nèi)容來(lái)驗(yàn)證XML書寫是否正確呢?答:需要軟件程序,即解析器根據(jù)能否對(duì)XML文檔進(jìn)行約束模式校驗(yàn),可以將解析器分為兩類:非校驗(yàn)解析器,如IE校驗(yàn)解析器編程校驗(yàn)XML文檔的正確性IE5以上瀏覽器內(nèi)置了XML解析工具:Microsort.XMLDOM,開(kāi)發(fā)人員可以編寫javascript代碼,利用這個(gè)解析工具裝載xml文件,并對(duì)xml文件進(jìn)行dtd驗(yàn)證。創(chuàng)建xml文檔解析器對(duì)象var

xmldoc=newActiveXObject("Microsoft.XMLDOM");開(kāi)啟xml校驗(yàn)xmldoc.validateOnParse="true";裝載xml文檔xmldoc.load("book.xml");獲取錯(cuò)誤信息xmldoc.parseError.reason;xmldoc.parseError.line編寫DTD的方式DTD約束文檔可以在XML文檔中直接定義,也可以作為單獨(dú)的文檔進(jìn)行編寫(單獨(dú)的文檔必須以UTF-8編碼進(jìn)行保存)。在XML文檔中編寫DTD示例<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><!DOCTYPE書架[ <!ELEMENT書架(書+)> <!ELEMENT書(書名,作者,售價(jià))> <!ELEMENT書名(#PCDATA)> <!ELEMENT作者(#PCDATA)> <!ELEMENT售價(jià)(#PCDATA)>]><書架> <書> <書名>Java就業(yè)培訓(xùn)教程</書名> <作者>張孝祥</作者> <售價(jià)>39.00元</售價(jià)> </書> ...</書架>引入外部DTD文檔XML使用DOCTYPE聲明語(yǔ)句來(lái)指明它所遵循的DTD文檔,有兩種形式:當(dāng)引用的DTD文檔在本地時(shí),采用如下方式:<!DOCTYPE根元素SYSTEM“DTD文檔路徑”>如:<!DOCTYPE書架SYSTEM“book.dtd”>當(dāng)引用的DTD文檔在公共網(wǎng)絡(luò)上時(shí),采用如下方式:<!DOCTYPE根元素PUBLIC“DTD名稱”“DTD文檔的URL”>如:<!DOCTYPEweb-appPUBLIC "-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN" "/dtd/web-app_2_3.dtd">DTD語(yǔ)法細(xì)節(jié)DTD文檔的語(yǔ)法主要涉及以下內(nèi)容的定義:定義元素定義屬性定義實(shí)體DTD-定義元素在DTD文檔中使用ELEMENT關(guān)鍵字來(lái)聲明一個(gè)XML元素。語(yǔ)法:<!ELEMENT元素名稱使用規(guī)則>使用規(guī)則:(#PCDATA):指示元素的主體內(nèi)容只能是普通的文本.(ParsedCharacterData)EMPTY:用于指示元素的主體為空。比如<br/>ANY:用于指示元素的主體內(nèi)容為任意類型。(子元素):指示元素中包含的子元素定義子元素及描述它們的關(guān)系:如果子元素用逗號(hào)分開(kāi),說(shuō)明必須按照聲明順序去編寫XML文檔。如:<!ELEMENTFILE(TITLE,AUTHOR,EMAIL)如果子元素用“|”分開(kāi),說(shuō)明任選其一。如:<!ELEMENTFILE(TITLE|AUTHOR|EMAIL)用+、*、?來(lái)表示元素出現(xiàn)的次數(shù)如果元素后面沒(méi)有+*?:表示必須且只能出現(xiàn)一次+:表示至少出現(xiàn)一次,一次或多次*:表示可有可無(wú),零次、一次或多次?:表示可以有也可以無(wú),有的話只能有一次。零次或一次如:<!ELEMENTMYFILE((TITLE*,AUTHOR?,EMAIL)*|COMMENT)>DTD--定義屬性1在DTD文檔中使用ATTLIST關(guān)鍵字來(lái)為一個(gè)元素聲明屬性。語(yǔ)法:<!ATTLIST元素名 屬性名1屬性值類型設(shè)置說(shuō)明 屬性名2屬性值類型設(shè)置說(shuō)明

…>例如:<!ATTLIST商品 類別

CDATA#REQUIRED

顏色

CDATA#IMPLIED>對(duì)應(yīng)的XML為:<商品類別=“服裝”顏色=“黃色”/>DTD--定義屬性2屬性值類型:CDATA:表示屬性的取值為普通的文本字符串ENUMERATED(DTD沒(méi)有此關(guān)鍵字):表示枚舉,只能從枚舉列表中任選其一,如(雞肉|牛肉|豬肉|魚肉)ID:表示屬性的取值不能重復(fù)設(shè)置說(shuō)明#REQUIRED:表示該屬性必須出現(xiàn)#IMPLIED:表示該屬性可有可無(wú)#FIXED:表示屬性的取值為一個(gè)固定值。語(yǔ)法:#FIXED"固定值"直接值:表示屬性的取值為該默認(rèn)值DTD--定義屬性示例1、<!ATTLIST

頁(yè)面作者 姓名CDATA#IMPLIED

年齡CDATA#IMPLIED

聯(lián)系信息CDATA#REQUIRED

網(wǎng)站職務(wù)CDATA#FIXED"頁(yè)面作者"

個(gè)人愛(ài)好CDATA"上網(wǎng)"

>

2、<?xmlversion="1.0"encoding="GB2312"standalone="yes"?><!DOCTYPE購(gòu)物籃[ <!ELEMENT肉EMPTY> <!ATTLIST肉品種(雞肉|牛肉|豬肉|魚肉)"雞肉">]><購(gòu)物籃> <肉品種="魚肉"/> <肉品種="牛肉"/> <肉/></購(gòu)物籃>DTD--定義屬性示例ID表示屬性的設(shè)置值為一個(gè)唯一值。<?xmlversion="1.0"encoding="GB2312"?><!DOCTYPE聯(lián)系人列表[ <!ELEMENT聯(lián)系人列表ANY> <!ELEMENT聯(lián)系人(姓名,EMAIL)> <!ELEMENT姓名(#PCDATA)> <!ELEMENTEMAIL(#PCDATA)>

<!ATTLIST聯(lián)系人編號(hào)ID#REQUIRED>]><聯(lián)系人列表> <聯(lián)系人編號(hào)=“a"> <姓名>張三</姓名> <EMAIL>zhang@</EMAIL></聯(lián)系人> <聯(lián)系人編號(hào)=“b"> <姓名>李四</姓名> <EMAIL>li@</EMAIL> </聯(lián)系人></聯(lián)系人列表>DTD--定義實(shí)體定義實(shí)體就是為一段內(nèi)容指定一個(gè)名稱,使用時(shí)通過(guò)這個(gè)名稱就可以引用其所代表的內(nèi)容。在DTD文檔中使用ENTITY關(guān)鍵字來(lái)聲明一個(gè)實(shí)體。實(shí)體可分為:引用實(shí)體和參數(shù)實(shí)體,兩者的語(yǔ)法不同定義引用實(shí)體概念:在DTD中定義,在XML中使用語(yǔ)法:<!ENTITY實(shí)體名稱“實(shí)體內(nèi)容”>引用方式(注意是在XML中使用):&實(shí)體名稱;DTD中定義: <!ENTITYcopyright“傳智播客版權(quán)所有”>XML中引用: ©right;定義參數(shù)實(shí)體(了解)概念:在DTD中定義,在DTD中使用語(yǔ)法:<!ENTITY%實(shí)體名稱“實(shí)體內(nèi)容”>引用方式(注意是在DTD中使用):%實(shí)體名稱;DTD中定義: <!ENTITY%TAG_NAMES"姓名|EMAIL|電話|地址">DTD中引用: <!ELEMENT個(gè)人信息(%TAG_NAMES;|生日)><!ELEMENT客戶信息(%TAG_NAMES;|公司名)>XML及DTD練習(xí)XML練習(xí)題右鍵復(fù)制DTD實(shí)例XML編程(用Java編寫解析器)Java解析XML概述XML解析方式分為兩種:DOM方式和SAX方式DOM:DocumentObjectModel,文檔對(duì)象模型。這種方式是W3C推薦的處理XML的一種方式。SAX:SimpleAPIforXML。這種方式不是官方標(biāo)準(zhǔn),屬于開(kāi)源社區(qū)XML-DEV,幾乎所有的XML解析器都支持它。XML解析開(kāi)發(fā)包JAXP:是SUN公司推出的解析標(biāo)準(zhǔn)實(shí)現(xiàn)。Dom4J:是開(kāi)源組織推出的解析開(kāi)發(fā)包。(牛,大家都在用,包括SUN公司的一些技術(shù)的實(shí)現(xiàn)都在用)JDom:是開(kāi)源組織推出的解析開(kāi)發(fā)包。JAXPJAXP:(JavaAPIforXMLProcessing)開(kāi)發(fā)包是JavaSE的一部分,它由以下幾個(gè)包及其子包組成:org.w3c.dom:提供DOM方式解析XML的標(biāo)準(zhǔn)接口org.xml.sax:提供SAX方式解析XML的標(biāo)準(zhǔn)接口javax.xml:提供了解析XML文檔的類javax.xml.parsers包中,定義了幾個(gè)工廠類。我們可以通過(guò)調(diào)用這些工廠類,得到對(duì)XML文檔進(jìn)行解析的DOM和SAX解析器對(duì)象。DocumentBuilderFactorySAXParserFactory使用JAXP進(jìn)行DOM解析javax.xml.parsers

包中的DocumentBuilderFactory用于創(chuàng)建DOM模式的解析器對(duì)象,DocumentBuilderFactory是一個(gè)抽象工廠類,它不能直接實(shí)例化,但該類提供了一個(gè)newInstance方法,這個(gè)方法會(huì)根據(jù)本地平臺(tái)默認(rèn)安裝的解析器,自動(dòng)創(chuàng)建一個(gè)工廠的對(duì)象并返回。獲得JAXP中的DOM解析器調(diào)用DocumentBuilderFactory.newInstance()方法得到創(chuàng)建DOM解析器的工廠。調(diào)用工廠對(duì)象的newDocumentBuilder方法得到DOM解析器對(duì)象。調(diào)用DOM解析器對(duì)象的parse()方法解析XML文檔,得到代表整個(gè)文檔的Document對(duì)象,進(jìn)行可以利用DOM特性對(duì)整個(gè)XML文檔進(jìn)行操作了。Tip:DOM編程DOM模型(documentobjectmodel)DOM解析器在解析XML文檔時(shí),會(huì)把文檔中的所有元素,按照其出現(xiàn)的層次關(guān)系,解析成一個(gè)個(gè)Node對(duì)象(節(jié)點(diǎn))。在dom中,節(jié)點(diǎn)之間關(guān)系如下:位于一個(gè)節(jié)點(diǎn)之上的節(jié)點(diǎn)是該節(jié)點(diǎn)的父節(jié)點(diǎn)(parent)一個(gè)節(jié)點(diǎn)之下的節(jié)點(diǎn)是該節(jié)點(diǎn)的子節(jié)點(diǎn)(children)同一層次,具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)是兄弟節(jié)點(diǎn)(sibling)一個(gè)節(jié)點(diǎn)的下一個(gè)層次的節(jié)點(diǎn)集合是節(jié)點(diǎn)后代(descendant)父、祖父節(jié)點(diǎn)及所有位于節(jié)點(diǎn)上面的,都是節(jié)點(diǎn)的祖先(ancestor)節(jié)點(diǎn)類型(下頁(yè)ppt)Node對(duì)象Node對(duì)象提供了一系列常量來(lái)代表結(jié)點(diǎn)的類型,當(dāng)開(kāi)發(fā)人員獲得某個(gè)Node類型后,就可以把Node節(jié)點(diǎn)轉(zhuǎn)換成相應(yīng)的節(jié)點(diǎn)對(duì)象(Node的子類對(duì)象),以便于調(diào)用其特有的方法。(查看API文檔)Node對(duì)象提供了相應(yīng)的方法去獲得它的父結(jié)點(diǎn)或子結(jié)點(diǎn)。編程人員通過(guò)這些方法就可以讀取整個(gè)XML文檔的內(nèi)容、或添加、修改、刪除XML文檔的內(nèi)容了。DOM方式解析XML文件DOM解析編程1、得到某個(gè)具體的節(jié)點(diǎn)內(nèi)容2、遍歷所有元素節(jié)點(diǎn)3、修改某個(gè)元素節(jié)點(diǎn)的主體內(nèi)容4、向指定元素節(jié)點(diǎn)中增加子元素節(jié)點(diǎn)5、向指定元素節(jié)點(diǎn)上增加同級(jí)元素節(jié)點(diǎn)6、刪除指定元素節(jié)點(diǎn)7、操作XML文件屬性DOM編程練習(xí)更新XML文檔javax.xml.transform包中的Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出,例如把xml文件應(yīng)用樣式表后轉(zhuǎn)成一個(gè)html文檔。利用這個(gè)對(duì)象,當(dāng)然也可以把Document對(duì)象又重新寫入到一個(gè)XML文件中。Transformer類通過(guò)transform方法完成轉(zhuǎn)換操作,該方法接收一個(gè)源和一個(gè)目的地。我們可以通過(guò):javax.xml.transform.dom.DOMSource類來(lái)關(guān)聯(lián)要轉(zhuǎn)換的document對(duì)象,用javax.xml.transform.stream.StreamResult

對(duì)象來(lái)表示數(shù)據(jù)的目的地。

Transformer對(duì)象通過(guò)TransformerFactory獲得。SAX解析在使用DOM解析XML文檔時(shí),需要讀取整個(gè)XML文檔,在內(nèi)存中構(gòu)架代表整個(gè)DOM樹(shù)的Doucment對(duì)象,從而再對(duì)XML文檔進(jìn)行操作。此種情況下,如果XML文檔特別大,就會(huì)消耗計(jì)算機(jī)的大量?jī)?nèi)存,并且容易導(dǎo)致內(nèi)存溢出。SAX解析允許在讀取文檔的時(shí)候,即對(duì)文檔進(jìn)行處理,而不必等到整個(gè)文檔裝載完才會(huì)文檔進(jìn)行操作。SAX解析SAX采用事件處理的方式解析XML文件,利用SAX解析XML文檔,涉及兩個(gè)部分:解析器和事件處理器:解析器可以使用JAXP的API創(chuàng)建,創(chuàng)建出SAX解析器后,就可以指定解析器去解析某個(gè)XML文檔。解析器采用SAX方式在解析某個(gè)XML文檔時(shí),它只要解析到XML文檔的一個(gè)組成部分,都會(huì)去調(diào)用事件處理器的一個(gè)方法,解析器在調(diào)用事件處理器的方法時(shí),會(huì)把當(dāng)前解析到的xml文件內(nèi)容作為方法的參數(shù)傳遞給事件處理器。事件處理器由程序員編寫,程序員通過(guò)事件處理器中方法的參數(shù),就可以很輕松地得到sax解析器解析到的數(shù)據(jù),從而可以決定如何對(duì)數(shù)據(jù)進(jìn)行處理。SAX解析閱讀ContentHandlerAPI文檔,常用方法:startElement、endElement、charactersSAX方式解析XML文檔使用SAXParserFactory創(chuàng)建SAX解析工廠SAXParserFactory

spf=SAXParserFactory.newInstance();通過(guò)SAX解析工廠得到解析器對(duì)象 SAXParsersp=spf.newSAXParser();通過(guò)解析器對(duì)象得到一個(gè)XML的讀取器XMLReader

xmlReader=sp.getXMLReader();設(shè)置讀取器的事件處理器 xmlReader.setContentHandler(new

BookParserHandler());解析xml文件 xmlReader.parse("book.xml");SAX方式解析XML文檔SAX解析編程DOM4J解析XML文檔Dom4j是一個(gè)簡(jiǎn)單、靈活的開(kāi)放源代碼的庫(kù)。Dom4j是由早期開(kāi)發(fā)JDOM的人分離出來(lái)而后獨(dú)立開(kāi)發(fā)的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對(duì)要復(fù)雜一些,但它提供了比JDOM更好的靈活性。Dom4j是一個(gè)非常優(yōu)秀的JavaXMLAPI,具有性能優(yōu)異、功能強(qiáng)大和極易使用的特點(diǎn)?,F(xiàn)在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。使用Dom4j開(kāi)發(fā),需下載dom4j相應(yīng)的jar文件。Document對(duì)象DOM4j中,獲得Document對(duì)象的方式有三種:

1.讀取XML文件,獲得document對(duì)象

SAXReaderreader=newSAXReader();

Document

document=reader.read(new

File("input.xml")); 2.解析XML形式的文本,得到document對(duì)象.

Stringtext="<members></members>";

Documentdocument=DocumentHelper.parseText(text); 3.主動(dòng)創(chuàng)建document對(duì)象.

Documentdocument=DocumentHelper.createDocument();

//創(chuàng)建根節(jié)點(diǎn)

Elementroot=document.addElement("members");節(jié)點(diǎn)對(duì)象1.獲取文檔的根節(jié)點(diǎn).Elementroot=document.getRootElement();2.取得某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn). Elementelement=node.element(“書名");3.取得節(jié)點(diǎn)的文字

Stringtext=node.getText();節(jié)點(diǎn)對(duì)象4.取得某節(jié)點(diǎn)下所有名為“member”的子節(jié)點(diǎn),并進(jìn)行遍歷.

Listnodes=rootElm.elements("member");

for(Iteratorit=nodes.iterator();it.hasNext();){

Elementelm=(Element)it.next();

//dosomething

}5.對(duì)某節(jié)點(diǎn)下的所有子節(jié)點(diǎn)進(jìn)行遍歷.

for(Iteratorit=root.elementIterator();it.hasNext();){

Elementelement=(Element)it.next();

//dosomething

}6.在某節(jié)點(diǎn)下添加子節(jié)點(diǎn).

ElementageElm=newMemberElm.addElement("age");節(jié)點(diǎn)對(duì)象7.設(shè)置節(jié)點(diǎn)文字.

element.setText("29");8.刪除某節(jié)點(diǎn).

//childElm是待刪除的節(jié)點(diǎn),parentElm是其父節(jié)點(diǎn)

parentElm.remove(childElm);

9.添加一個(gè)CDATA節(jié)點(diǎn).

ElementcontentElm=infoElm.addElement("content");

contentElm.addCDATA(diary.getContent());節(jié)點(diǎn)對(duì)象屬性1.取得某節(jié)點(diǎn)下的某屬性

Elementroot=document.getRootElement();

//屬性名nameAttributeattribute=root.attribute("size");

2.取得屬性的文字

Stringtext=attribute.getText();3.刪除某屬性

Attributeattribute=root.attribute("size");

root.remove(attribute);節(jié)點(diǎn)對(duì)象屬性3.遍歷某節(jié)點(diǎn)的所有屬性

Elementroot=document.getRootElement();

for(Iteratorit=root.attributeIterator();it.hasNext();){

Attributeattribute=(Attribute)it.next();

Stringtext=attribute.getText();

System.out.println(text);

}4.設(shè)置某節(jié)點(diǎn)的屬性和文字.

newMemberElm.addAttribute("name","sitinspring");5.設(shè)置屬性的文字

Attributeattribute=root.attribute("name");

attribute.setText("sitinspring");將文檔寫入XML文件.1.文檔中全為英文,不設(shè)置編碼,直接寫入的形式.

XMLWriterwriter=newXMLWriter(new

FileWriter("output.xml"));

writer.write(document);

writer.close();2.文檔中含有中文,設(shè)置編碼格式寫入的形式.

OutputFormatformat=OutputFormat.createPrettyPrint();

//指定XML編碼

format.setEncoding("GBK");

XMLWriterwriter=newXMLWriter(new

FileOutputStream("output.xml"),format);

writer.write(document);

writer.close();Dom4j在指定位置插入節(jié)點(diǎn)1.得到插入位置的節(jié)點(diǎn)列表(list)2.調(diào)用list.add(index,elemnent),由index決定element的插入位置。Element元素可以通過(guò)DocumentHelper對(duì)象得到。示例代碼:Elementaaa=DocumentHelper.createElement("aaa");aaa.setText("aaa");Listlist=root.element("書").elements();list.add(1,aaa);//更新document字符串與XML的轉(zhuǎn)換1.將字符串轉(zhuǎn)化為XML

Stringtext="<members><member>sitinspring</member></members>";

Documentdocument=DocumentHelper.parseText(text);2.將文檔或節(jié)點(diǎn)的XML轉(zhuǎn)化為字符串.

SAXReaderreader=newSAXReader();

Document

document=reader.read(new

File("input.xml"));

Elementroot=document.getRootElement();

StringdocXmlText=document.asXML();

StringrootXmlText=root.asXML();

ElementmemberElm=root.element("member");

StringmemberXmlText=memberElm.asXML();XML約束之SchemaXMLSchemaXMLSchema也是一種用于定義和描述XML文檔結(jié)構(gòu)與內(nèi)容的模式語(yǔ)言,其出現(xiàn)是為了克服DTD的局限性XMLSchemaVSDTD:XMLSchema符合XML語(yǔ)法結(jié)構(gòu)。DOM、SAX等XMLAPI很容易解析出XMLSchema文檔中的內(nèi)容。XMLSchema對(duì)名稱空間支持得非常好。XMLSchema比XMLDTD支持更多的數(shù)據(jù)類型,并支持用戶自定義新的數(shù)據(jù)類型。XMLSchema定義約束的能力非常強(qiáng)大,可以對(duì)XML實(shí)例文檔作出細(xì)致的語(yǔ)義限制。XMLSchema不能像DTD一樣定義實(shí)體,比DTD更復(fù)雜,但XmlSchema現(xiàn)在已是w3c組織的標(biāo)準(zhǔn),它正逐步取代DTD。Schema約束快速入門XMLSchema文件自身就是一個(gè)XML文件,但它的擴(kuò)展名通常為.xsd。一個(gè)XMLSchema文檔通常稱之為模式文檔(約束文檔),遵循這個(gè)文檔書寫的xml文件稱之為實(shí)例文檔。和XML文件一樣,一個(gè)XMLSchema文檔也必須有一個(gè)根結(jié)點(diǎn),但這個(gè)根結(jié)點(diǎn)的名稱為schema。編寫了一個(gè)XMLSchema約束文檔后,通常需要把這個(gè)文件中聲明的元素綁定到一個(gè)URI地址上,在XMLSchema技術(shù)中有一個(gè)專業(yè)術(shù)語(yǔ)來(lái)描述這個(gè)過(guò)程,即把XMLSchema文檔聲明的元素綁定到一個(gè)名稱空間上,以后XML文件就可以通過(guò)這個(gè)URI(即名稱空間)來(lái)告訴解析引擎,xml文檔中編寫的元素來(lái)自哪里,被誰(shuí)約束。Schema入門案例<?xmlversion="1.0"encoding="UTF-8"?><xs:schemaxmlns:xs=“/2001/XMLSchema”//標(biāo)準(zhǔn)的名稱空間 targetNamespace=“http://www.”//將該schema文檔綁定到http://名稱空間 elementFormDefault="qualified"> <xs:elementname='書架'> <xs:complexType> <xs:sequence

maxOccurs='unbounded'> <xs:elementname='書'> <xs:complexType> <xs:sequence> <xs:elementname='書名'type='xs:string'/> <xs:elementname='作者'type='xs:string'/> <xs:elementname='售價(jià)'type='xs:string'/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element></xs:schema>book.xsd文件Schema入門案例<?xmlversion="1.0"encoding="UTF-8"?><itcast:書架xmlns:itcast="http://"

xmlns:xsi="/2001/XMLSchema-instance"

xsi:schemaLocation=“http://

book.xsd"> <itcast:書> <itcast:書名>JavaScript網(wǎng)頁(yè)開(kāi)發(fā)</itcast:書名> <itcast:作者>張孝祥</itcast:作者> <itcast:售價(jià)>28.00元</itcast:售價(jià)> </itcast:書></itcast:書架>名稱空間的概念

在XMLSchema中,每個(gè)約束模式文檔都可以被賦以一個(gè)唯一的名稱空間,名稱空間用一個(gè)唯一的URI(UniformResourceIdentifier,統(tǒng)一資源標(biāo)識(shí)符)表示。在Xml文件中書寫標(biāo)簽時(shí),可以通過(guò)名稱空間聲明(xmlns),來(lái)聲明當(dāng)前編寫的標(biāo)簽來(lái)自哪個(gè)Schema約束文檔。如:

<itcast:書架xmlns:itcast=“http

溫馨提示

  • 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)論