XML是指可擴展標記語言(eXtensible Markup Language),它是一種標記語言,很相似HTML。它被設計的宗旨是傳輸數據,而非顯示數據。 XML標籤沒有被預約義,須要用戶自行定義標籤。 XML技術是W3C組織(World Wide Web Consortium萬維網聯盟)發佈的,目前遵循的是W3C組織於2000年發佈的XML1.0規範。 XML被普遍認爲是繼Java以後在Internet上最激動人心的新技術。css
在現實生活中存在大量有關係的數據,如右圖所示。 html
問題:這樣的數據該如何表示並交給計算機處理呢?java
XML語言出現的根本目的在於描述向上圖那種有關係的數據。node
XML是一種通用的數據交換格式。程序員
在XML語言中,它容許用戶自定義標籤。一個標籤用於描述一段數據;一個標籤可分爲開始標籤和結束標籤,在起始標籤之間,又可使用其它標籤描述其它數據,以此來實現數據關係的描述。web
XML中的數據必須經過軟件程序來解析執行或顯示,如IE;這樣的解析程序稱之爲Parser(解析器)。spring
<?xml version="1.0" encoding="UTF-8"?> <中國> <北京> <海淀></海淀> <豐臺></豐臺> </北京> <山東> <濟南></濟南> <青島></青島> </山東> <湖北> <武漢></武漢> <荊州></荊州> </湖北> </中國>
XML技術除用於保存有關係的數據以外,它還常常用做軟件配置文件,以描述程序模塊之間的關係。(如後面將要學習到的Struts、Spring和Hibernate都是基於XML做爲配置文件的)數據庫
在一個軟件系統中,經過XML配置文件能夠提升系統的靈活性。即程序的行爲是經過XML文件來配置的,而不是硬編碼。編程
數據交換:不一樣語言之間用來交換數據網絡
小型數據庫:用來當數據庫存儲數據。
一個XML文件分爲以下幾部份內容:
文檔聲明 元素 屬性 註釋 CDATA區 、特殊字符 處理指令(PI:Processing Instruction)
在編寫XML文檔時,須要先使用文檔聲明來聲明XML文檔。且必須出如今文檔的第一行。而且必須指定
最簡單的語法:
<?xml version=「1.0」?>
用encoding屬性說明文檔所使用的字符編碼。保存在磁盤上的文件編碼要與聲明的編碼一致。如:
<?xml version=「1.0」 encoding=「GB2312」?>
用standalone屬性說明文檔是否獨立,便是否依賴其餘文檔。 如:
<?xml version=「1.0」 standalone=「yes」?>
yes不用引入外部的文件,no須要引入。(不經常使用)
XML元素指XML文件中出現的標籤。
一個標籤分爲起始和結束標籤(不能省略)。一個標籤有以下幾種書寫形式:
包含標籤主體:<mytag>some content</mytag>
不含標籤主體:<mytag/>
一個標籤中能夠嵌套若干子標籤,但全部標籤必須合理的嵌套,不容許有交叉嵌套。
<mytag1><mytag2></mytag1></mytag2> WRONG!
一個XML文檔必須有且僅有一個根標籤,其餘標籤都是這個根標籤的子標籤或孫標籤。
對於XML標籤中出現的全部空格和換行,XML解析程序都會看成標籤內容進行處理。例如:下面兩段內容的意義是不同的。
因爲在XML中,空格和換行都做爲原始內容被處理,因此,在編寫XML文件時,使用換行和縮進等方式來讓原文件中的內容清晰可讀的「良好」書寫習慣可能要被迫改變。
一個XML元素能夠包含字母、數字以及其它一些可見字符,但必須遵照下面的一些規範:
區分大小寫,例如,<P>和<p>是兩個不一樣的標記。
不能以數字或「-」 (中劃線)開頭。
不能以xml(或XML、或Xml 等)開頭。
不能包含空格。
名稱中間不能包含冒號(:)。
一個元素能夠有多個屬性,每一個屬性都有它本身的名稱和取值,例如:<mytag name=「value」 …/>
屬性值必定要用引號(單引號或雙引號)引發來。
屬性名稱的命名規範與元素的命名規範相同
元素中的屬性是不容許重複的
在XML技術中,標籤屬性所表明的信息也能夠被改爲用子元素的形式來描述,例如:
<mytag> <name> <firstName/> <lastName/> </name> </mytag>
XML中的註釋語法爲:<!--這是註釋-->
注意:
XML聲明以前不能有註釋
註釋不能嵌套,例如:
實體必須以符號"&"開頭,以符號";"結尾。
注意: 只有"<" 字符和"&"字符對於XML來講是嚴格禁止使用的。剩下的都是合法的,爲了減小出錯,使用實體是一個好習慣。
即:< 和 & 的符號要用轉義字符, > 「 ‘ 能夠不使用轉義字符。
CDATA是Character Data的縮寫
做用:把標籤當作普通文本內容;
語法:<![CDATA[內容]]>
<![CDATA[ <itcast>www.itcast.cn</itcast> ]]>
以上紅色部分被當作普通文本而不是標籤
處理指令,簡稱PI(Processing Instruction)。
做用:用來指揮軟件如何解析XML文檔。
語法:必須以「<?」做爲開頭,以「?>」做爲結尾。 經常使用處理指令:
經常使用處理指令:
XML聲明:
<?xml version=「1.0」 encoding=「GB2312」?>
xml-stylesheet指令: 做用:指示XML文檔所使用的CSS樣式XSL。
<?xml-stylesheet type=「text/css」 href=「some.css」?>
注:對中文命名的標籤元素不起做用
全部 XML 元素都須有關閉標籤
XML 標籤對大小寫敏感 XML
必須正確地嵌套順序
XML 文檔必須有根元素(只有一個)
XML 的屬性值須加引號
特殊字符必須轉義 --- CDATA
XML 中的空格、回車換行會解析時被保留
1.XML都是用戶自定義的標籤,若出現小小的錯誤,軟件程序將不能正確地獲取文件中的內容而報錯。(如:Tomcat)
2.XML技術中,能夠編寫一個文檔來約束一個XML的書寫規範,這個文檔稱之爲約束。
兩個概念:
格式良好的XML:遵循XML語法的XML
有效的XML:遵循約束文檔的XML
3.總之:約束文檔定義了在XML中容許出現的元素名稱、屬性及元素出現的順序等等。
1.什麼是XML約束
在XML技術裏,能夠編寫一個文檔來約束一個XML
文檔的書寫規範,這稱之爲XML約束。
2.爲何須要XML約束
3.經常使用的約束技術
XML DTD
XML Schema
1.DTD(Document Type Definition),全稱爲文檔類型定義。
2.書寫完成DTD,而且約束成功後,能夠總結書寫的過程,更方便記憶。
複雜標籤:<!ELEMENT 標籤名 (子節點)>
簡單標籤:<!ELEMENT 標籤名 (#PCDATA)>
引入DTD:<!DOCTYPE 根節點 SYSTEM 「dtd的地址」>
DTD約束便可以做爲一個單獨的文件編寫,也能夠在XML文件內編寫
1.使用內部DTD
<!DOCTYPE 根節點 [ DTD的代碼 ]>
2.使用外部DTD
<!DOCTYPE 根節點 SYSTEM 「DTD的地址」 >
3.使用網絡DTD
<!DOCTYPE 根節點 PUBLIC 「DTD的名稱」 「DTD的地址」 >
常見的使用網絡DTD約束有 Struts2的框架
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 書架 [ <!ELEMENT 書架 (書+)> <!ELEMENT 書 (書名,做者,售價)> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 做者 (#PCDATA)> <!ELEMENT 售價 (#PCDATA)> ]> <書架> <書> <書名>Java就業培訓教程</書名> <做者>張孝祥</做者> <售價>39.00元</售價> </書> ... </書架>
XML使用DOCTYPE聲明語句來指明它所遵循的DTD文檔,有兩種形式:
當引用的DTD文檔在本地時,採用以下方式:
<!DOCTYPE 根元素 SYSTEM 「DTD文檔路徑」>
如:
<!DOCTYPE 書架 SYSTEM 「book.dtd」>
當引用的DTD文檔在公共網絡上時,採用以下方式:
<!DOCTYPE 根元素 PUBLIC 「DTD名稱」 「DTD文檔的URL」>
如:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
元素定義 屬性定義 實體定義
在DTD文檔中使用ELEMENT關鍵字來聲明一個XML元素。
語法:<!ELEMENT 元素名稱 使用規則>
使用規則:
(#PCDATA):指示元素的主體內容只能是普通的文本.(Parsed Character Data)
EMPTY:用於指示元素的主體爲空。好比<br/>
ANY:用於指示元素的主體內容爲任意類型。
(子元素):指示元素中包含的子元素
定義子元素及描述它們的關係:
若是子元素用逗號分開,說明必須按照聲明順序去編寫XML文檔。
如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
若是子元素用「|」分開,說明任選其一。
如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
用+、*、?來表示元素出現的次數
若是元素後面沒有+*?:表示必須且只能出現一次
+:表示至少出現一次,一次或屢次
*:表示無關緊要,零次、一次或屢次
?:表示能夠有也能夠無,有的話只能有一次。零次或一次 如: <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
<!ATTLIST 商品 類別 CDATA #REQUIRED 必須的 顏色 CDATA #IMPLIED 可選的 >
對應的XML爲:<商品 類別=「服裝」 顏色=「黃色」/>
CDATA:表示屬性的取值爲普通的文本字符串
ENUMERATED (DTD沒有此關鍵字):表示枚舉,只能從枚舉列表中任選其一,如(雞肉|牛肉|豬肉|魚肉)
ID:表示屬性的取值不能重複(不能只寫數字)
#REQUIRED:表示該屬性必須出現
#IMPLIED:表示該屬性無關緊要
#FIXED:表示屬性的取值爲一個固定值。語法:#FIXED "固定值"
直接值:表示屬性的取值爲該默認值
<!ATTLIST 頁面做者 姓名 CDATA #IMPLIED 年齡 CDATA #IMPLIED 聯繫信息 CDATA #REQUIRED 網站職務 CDATA #FIXED "頁面做者" 我的愛好 CDATA "上網" >
屬性的類型能夠是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 購物籃 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉"> ]> <購物籃> <肉 品種="魚肉"/> <肉 品種="牛肉"/> <肉/> </購物籃>
表示屬性的設置值爲一個惟一值。
ID 屬性的值只能由字母,下劃線開始,不能出現空白字符
?xml version = "1.0" encoding="GB2312" ?> <!DOCTYPE 聯繫人列表[ <!ELEMENT 聯繫人列表 ANY> <!ELEMENT 聯繫人(姓名,EMAIL)> <!ELEMENT 姓名(#PCDATA)> <!ELEMENT EMAIL(#PCDATA)> <!ATTLIST 聯繫人 編號 ID #REQUIRED> ]> <聯繫人列表> <聯繫人 編號=「p1"> <姓名>張三</姓名> <EMAIL>zhang@it315.org</EMAIL> </聯繫人> <聯繫人 編號=「p2"> <姓名>李四</姓名> <EMAIL>li@it315.org</EMAIL> </聯繫人> </聯繫人列表>
實體用於爲一段內容建立一個別名,之後在XML文檔中就可使用別名引用這段內容了。
在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
<!ENTITY 別名 「值」>
在元素中引用 &別名;
概念:在DTD中定義,在XML中使用
語法:<!ENTITY 實體名稱 「實體內容」>
引用方式(注意是在XML中使用):&實體名稱;
DTD中定義: <!ENTITY copyright 「博客園版權全部」>
XML中引用: ©right;
XML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是爲了克服 DTD 的侷限性
XML Schema符合XML語法結構。
DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。
XML Schema對名稱空間支持得很是好。
XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
XML Schema定義約束的能力很是強大,能夠對XML實例文檔做出細緻的語義限制。
XML Schema不能像DTD同樣定義實體,比DTD更復雜,但Xml Schema如今已經是w3c組織的標準,它正逐步取代DTD。
XML Schema是用一套預先規定的XML元素和屬性建立的,這些元素和屬性定義了XML文檔的結構和內容模式。 XML Schema規定XML文檔實例的結構和每一個元素/屬性的數據類型
Schema相對於DTD的明顯好處是,XML Schema文檔自己也是XML文檔,而不是像DTD同樣使用自成一體的語法
XML從SGML中繼承了DTD,並用它來定義內容的模型,驗證和組織元素。同時,它也有不少侷限:
DTD不遵照XML語法; DTD不可擴展; DTD不支持命名空間的應用; DTD沒有提供強大的數據類型支持,只能表示很簡單的數據類型。
Schema徹底克服了這些弱點,使得基於Web的應用系統交換XML數據更爲容易。下面是它所展示的一些新特性:
Schema徹底基於XML語法,不須要再學習特殊的語法; Schema能用處理XML文檔的工具處理,而不須要特殊的工具; Schema大大擴充了數據類型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等; Schema支持原型,也就是元素的繼承。如:咱們定義了一個「聯繫人」數據類型,而後能夠根據它產生「朋友聯繫人」和「客戶聯繫」兩種數據類型; Schema支持屬性組。咱們通常聲明一些公共屬性,而後能夠應用於全部的元素,屬性組容許把元素、屬性關係放於外部定義、組合; 開放性。原來的DTD只能有一個DTD應用於一個XML文檔,如今能夠有多個Schema運用於一個XML文檔。
XML Schema 文件自身就是一個XML文件,但它的擴展名一般爲.xsd
和XML文件同樣,一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱爲Schema
應用schema約束 開發xml 過程:
編寫了一個XML Schema約束文檔後,一般須要把這個文件中聲明的元素綁定到一個URI地址上,這個URI地址叫namespace名稱空間,之後XML文件就能夠經過這個URI(即名稱空間)引用綁定指定名稱空間的元素
在W3C XML schema規範中規定:全部的Schema文檔都使用<schema>做爲其根元素
<schema>元素能夠包含一些屬性。一個XML schema聲明看起來常常以以下的形式出現
book.xsd文件
<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www. itcast.cn" elementFormDefault="qualified"> <xs:element name='書架' > <xs:complexType> <xs:sequence maxOccurs='unbounded' > <xs:element name='書' > <xs:complexType> <xs:sequence> <xs:element name='書名' type='xs:string' /> <xs:element name='做者' type='xs:string' /> <xs:element name='售價' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
<?xml version="1.0" encoding="UTF-8"?> <itcast:書架 xmlns:itcast="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=「http://www.itcast.cn book.xsd"> <itcast:書> <itcast:書名>九陰真經</itcast:書名> <itcast:做者>郭靖</itcast:做者> <itcast:售價>28.00元</itcast:售價> </itcast:書> </itcast:書架>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www. itcast.cn" elementFormDefault="qualified" attributeFormDefault="qualified" > <xs:schema>
targetNamespace元素用於指定schema文檔中聲明的元素屬於哪一個名稱空間。
elementFormDefault元素用於指定局部元素是否受到該schema指定targetNamespace所指定的名稱空間限定
attributeFormDefault元素用於指定局部屬性是否受到該schema指定targetNamespace所指定的名稱空間限定
在XML Schema中,每一個約束模式文檔均可以被賦以一個惟一的名稱空間,名稱空間用一個惟一的URI(Uniform Resource Identifier,統一資源標識符)表示。 在Xml文件中書寫標籤時,能夠經過名稱空間聲明(xmlns),來聲明當前編寫的標籤來自哪一個Schema約束文檔。如:
<itcast:書架 xmlns:itcast=「http://www.itcast.cn」> <itcast:書>……</itcast:書> </itcast:書架>
此處使用itcast來指向聲明的名稱,以便於後面對名稱空間的引用。
注意:名稱空間的名字語法容易讓人混淆,儘管以 http:// 開始,那個 URL 並不指向一個包含模式定義的文件。事實上,這個 URL:http://www.itcast.cn根本沒有指向任何文件,只是一個分配的名字。
爲了在一個XML文檔中聲明它所遵循的Schema文件的具體位置,一般須要在Xml文檔中的根結點中使用schemaLocation屬性來指定,例如:
<itcast:書架 xmlns:itcast="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=「http://www.itcast.cn book.xsd">
schemaLocation此屬性有兩個值。第一個值是須要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置,二者之間用空格分隔。
注意:在使用schemaLocation屬性時,也須要指定該屬性來自哪裏。
基本格式:
xmlns="URI"
舉例:
<書架 xmlns=" http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=「http://www.itcast.cn book.xsd"> <書> <書名>JavaScript網頁開發</書名> <做者>張孝祥</做者> <售價>28.00元</售價> </書> </書架>
文件清單:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?> <書架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:demo="http://www.it315.org/demo/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xml/book.xsd http://www.it315.org/demo/schema http://www.it315.org/demo.xsd"> <書> <書名>JavaScript網頁開發</書名> <做者>張孝祥</做者> <售價 demo:幣種=」人民幣」>28.00元</售價> </書> </書架>
Schema元素:簡單類型和複雜類型
XML Schema規範中將元素分爲兩種類型
簡單類型元素:簡單類型元素只能包含字符內容。這些字符能夠被約束爲特殊的預約義類型或派生類型。例如,能夠指定一個簡單元素的內容必須是日期、整數、字符串或者僅僅是一個字符或者一系列字符。type屬性
複雜類型元素:複雜類型元素是包含子元素內容或者屬性的元素 <complexType> <sequence> 子元素
參看w3c文檔
DOM方式和SAX方式
DOM:Document Object Model,文檔對象模型。這種方式是W3C推薦的處理XML的一種方式。
SAX:Simple API for XML。這種方式不是官方標準,屬於開源社區XML-DEV,幾乎全部的XML解析器都支持它。
JAXP:是SUN公司推出的解析標準實現。
Dom4J:是開源組織推出的解析開發包。(牛,你們都在用,包括SUN公司的一些技術的實現都在用) J
Dom:是開源組織推出的解析開發包。
JAXP:(Java API for XML Processing)開發包是JavaSE的一部分,它由如下幾個包及其子包組成:
org.w3c.dom:提供DOM方式解析XML的標準接口
org.xml.sax:提供SAX方式解析XML的標準接口
javax.xml:提供瞭解析XML文檔的類
javax.xml.parsers包中,定義了幾個工廠類。咱們能夠經過調用這些工廠類,獲得對XML文檔進行解析的DOM和SAX解析器對象。 DocumentBuilderFactory
SAXParserFactory
javax.xml.parsers 包中的DocumentBuilderFactory用於建立DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺默認安裝的解析器,自動建立一個工廠的對象並返回。
調用 DocumentBuilderFactory.newInstance() 方法獲得建立 DOM 解析器的工廠。
調用工廠對象的 newDocumentBuilder方法獲得 DOM 解析器對象。
調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,獲得表明整個文檔的 Document 對象,進行能夠利用DOM特性對整個XML文檔進行操做了。
DOM解析器在解析XML文檔時,會把文檔中的全部元素,按照其出現的層次關係,解析成一個個Node對象(節點)。
在dom中,節點之間關係以下:
位於一個節點之上的節點是該節點的父節點(parent)
一個節點之下的節點是該節點的子節點(children)
同一層次,具備相同父節點的節點是兄弟節點(sibling)
一個節點的下一個層次的節點集合是節點後代(descendant)
父、祖父節點及全部位於節點上面的,都是節點的祖先(ancestor)
Node對象提供了一系列常量來表明結點的類型,當開發人員得到某個Node類型後,就能夠把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)
Node對象提供了相應的方法去得到它的父結點或子結點。編程人員經過這些方法就能夠讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。
DOM解析編程:
1獲取指定節點的集合
2查找某一個節點
3刪除結點
4更新結點內容
5添加節點
6獲取全部的節點的名稱(遞歸遍歷)
具體步驟爲:
1經過document.getElementsByTagName(「」) 能夠獲取節點集合 返回NodeList
2經過Document.createElement(「」)能夠建立元素對象。
3Node對象中能夠設置文本內容 setTextContent()
4經過Node的appendChild()方法加入子節點。
5須要把內存中的DOM樹形結構回寫到xml文件中。
6TransformerFactory工廠類建立Transformer回寫類,經過transform(Souuce,Result)方法回寫xml。
7New DOMSource(document) 和 new StreamResult(xml) 回寫完成。
8遞歸方法就是本身調用本身
public static void getNodeName(Node node){ if(node.getNodeType() == Node.ELEMENT_NODE){ System.out.println(node.getNodeName()); } NodeList nodeList = node.getChildNodes(); for(int i=0;i<nodeList.getLength();i++){ Node child = nodeList.item(i); getNodeName(child); } }
javax.xml.transform包中的Transformer類用於把表明XML文件的Document對象轉換爲某種格式後進行輸出,例如把xml文件應用樣式表後轉成一個html文檔。利用這個對象,固然也能夠把Document對象又從新寫入到一個XML文件中。
Transformer類經過transform方法完成轉換操做,該方法接收一個源和一個目的地。咱們能夠經過:
javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象
用javax.xml.transform.stream.StreamResult 對象來表示數據的目的地。
Transformer對象經過TransformerFactory得到。
在使用 DOM 解析 XML 文檔時,須要讀取整個 XML 文檔,在內存中構架表明整個 DOM 樹的Doucment對象,從而再對XML文檔進行操做。此種狀況下,若是 XML 文檔特別大,就會消耗計算機的大量內存,而且容易致使內存溢出。
SAX解析容許在讀取文檔的時候,即對文檔進行處理,而沒必要等到整個文檔裝載完纔會文檔進行操做
SAX採用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器 和事件處理器:
解析器可使用JAXP的API建立,建立出SAX解析器後,就能夠指定解析器去解析某個XML文檔。
解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容做爲方法的參數傳遞給事件處理器。
事件處理器由程序員編寫,程序員經過事件處理器中方法的參數,就能夠很輕鬆地獲得sax解析器解析到的數據,從而能夠決定如何對數據進行處理。
SAX 是事件驅動的 XML 處理方法
它是基於事件驅動的
startElement() 回調在每次 SAX 解析器遇到元素的起始標記時被調用
characters() 回調爲字符數據所調用
endElement() 爲元素的結束標記所調用
DefaultHandler類(在 org.xml.sax.helpers 軟件包中)來實現全部這些回調,並提供全部回調方法默認的空實現
SAX 解析器採用了基於事件的模型,它在解析XML文檔的時候能夠觸發一系列的事件
發生相應事件時,將調用一個回調方法
<?xml version=「1.0」 encoding=「utf-8」?> <config> <server>UNIX</server> </config>
Start document
Start element (config)
Characters (whitespace)
Start element (server)
Characters (UNIX)
End element (server)
Characters (whitespace)
End element (config)
End document
使用SAXParserFactory建立SAX解析工廠
SAXParserFactory spf = SAXParserFactory.newInstance();
經過SAX解析工廠獲得解析器對象
SAXParser sp = spf.newSAXParser();
經過解析器對象解析xml文件 xmlReader.parse("book.xml「,new XMLContentHandler());
這裏的XMLContentHandler 繼承 DefaultHandler
public class XMLContentHandler extends DefaultHandler{ //當前元素中的數據 private String currentData; //取得元素數據 public void characters(char[] ch, int start, int length) throws SAXException { currentData=new String(ch,start,length); } //在解析整個文檔結束時調用 public void endDocument() throws SAXException { System.out.println("結束文檔"); } //在解析元素結束時調用 public void endElement(String uri, String localName, String name) throws SAXException { System.out.println("節點數據 *************************"+this.currentData); System.out.println("結束元素 ************"+name); } //在解析整個文檔開始時調用 public void startDocument() throws SAXException { System.out.println("開始文檔"); } //在解析元素開始時調用 public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { System.out.println("開始元素 ************"+name); } }
經過dom.xml的文件畫圖解析DOM和SAX的關係
首先DOM解析XML也是在內存中造成一個樹狀結構。
DOM解析:把整個XML文檔先加載到內存中,造成樹狀結構。
缺點:若是文檔很是大,加載到內存中容易產生內存溢出的問題。
優勢:由於節點與節點之間有關係,進行增刪改很是方便。
SAX解析:基於事件驅動的,邊讀邊解析。
缺點:不能進行增刪改的操做。
優勢:文檔大也不會有內存溢出的問題,查找很是方便。
Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來然後獨立開發的。與JDOM不一樣的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。
Dom4j是一個很是優秀的Java XML API,具備性能優異、功能強大和極易使用的特色。如今不少軟件採用的Dom4j,例如Hibernate,包括sun公司本身的JAXM也用了Dom4j。
使用Dom4j開發,需下載dom4j相應的jar文件。
DOM4j中,得到Document對象的方式有三種:
1.讀取XML文件,得到document對象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,獲得document對象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主動建立document對象.
Document document = DocumentHelper.createDocument();
//建立根節點
Element root = document.addElement("members");
1.獲取文檔的根節點.
Element root = document.getRootElement();
2.取得某個節點的子節點.
Element element=node.element(「書名");
3.取得節點的文字
String text=node.getText();
4.取得某節點下全部名爲「member」的子節點,並進行遍歷.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something }
5.對某節點下的全部子節點進行遍歷.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something }
6.在某節點下添加子節點.
Element ageElm = newMemberElm.addElement("age");
7.設置節點文字.
element.setText("29");
8.刪除某節點.
//childElm是待刪除的節點,parentElm是其父節點
parentElm.remove(childElm);
9.添加一個CDATA節點.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
1.取得某節點下的某屬性
Element root=document.getRootElement();
//屬性名name Attribute attribute=root.attribute("size");
2.取得屬性的文字
String text=attribute.getText();
3.刪除某屬性
Attribute attribute=root.attribute("size");
root.remove(attribute);
4.遍歷某節點的全部屬性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text); }
5.設置某節點的屬性和文字.
newMemberElm.addAttribute("name", "sitinspring");
6.設置屬性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
1.文檔中全爲英文,不設置編碼,直接寫入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文檔中含有中文,設置編碼格式寫入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML編碼
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();
1.獲得插入位置的節點列表(list)
2.調用list.add(index,elemnent),由index決定element的插入位置。
Element元素能夠經過DocumentHelper對象獲得。示例代碼:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List list = root.element("書").elements();
list.add(1, aaa);
//更新document
1.將字符串轉化爲XML
String text = "<members> <member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);
2.將文檔或節點的XML轉化爲字符串.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();