Java高級進階-xml解析

xml解析

xml簡介

XML(eXtended Markup Language蜒秤,可擴展標記性語言),xml可以對文檔和數(shù)據(jù)進行結(jié)構(gòu)化處理熙涤,從而能夠在部門屑宠、客戶和供應(yīng)商之間進行交換,實現(xiàn)動態(tài)內(nèi)容生成绳锅,企業(yè)集成和應(yīng)用開發(fā)西饵。xml可以使我們能夠更準確的搜索,更方便的傳送軟件組件鳞芙,更好的描述一些事物眷柔。例如電子商務(wù)交易等。它的主要特點:它被設(shè)計用來傳輸和存儲數(shù)據(jù)原朝;被設(shè)計用來顯示數(shù)據(jù)闯割。它們都是[標準通用標記語言]的子集。

xml解析

在XML文件中由于更多的是描述信息的內(nèi)容竿拆,所以在得到一個XML文檔后用該利用程序按照其中元素的定義名稱取出對應(yīng)的內(nèi)容,這樣的操作就稱為XML解析宾尚。在XML解析中W3C定義了SAX和DOM兩種解析方式丙笋,這兩種解析方式的程序操作如下:


XML解析操作

可以看出谢澈,應(yīng)用程序不是直接對XML文檔進行操作的,而是首先由XML分析器對XML文檔進行分析御板,然后應(yīng)用程序通過XML分析器所提供的DOM接口或SAX接口對分析結(jié)構(gòu)進行操作锥忿,從而間接地實現(xiàn)了對XML文檔的訪問。

Dom解析

在應(yīng)用程序中怠肋,基于DOM (Document Object Model敬鬓,文檔對象模型)的XML分析器將一個XML文檔轉(zhuǎn)換成一個對象模型的集合(通常稱為DOM樹),應(yīng)用程勛正是通過對這個對象模型的操作笙各,來實現(xiàn)對XML文檔數(shù)據(jù)的操作钉答。通過DOM接口,應(yīng)用程序可以在任何時候訪問XML文檔中的任何一部分數(shù)據(jù)杈抢,因此数尿,這種這種利用DOM接口的機制也被稱作隨機訪問機制。由于DOM分析器把整個XML文檔轉(zhuǎn)化成DOM樹放在了內(nèi)存中惶楼,因此右蹦,當文檔比較大或者結(jié)構(gòu)比較復(fù)雜時,對內(nèi)存的需求就比較高歼捐,而且對于結(jié)構(gòu)復(fù)雜的樹的遍歷也是一項耗時的操作何陆。DOM操作會在內(nèi)存中將所有的XML文件變?yōu)镈OM樹。
在DOM解析中有以下4個核心的操作接口:
Document:此接口代表了整個XML文檔豹储,表示整個DOM樹的根贷盲,提供了對文檔中的數(shù)據(jù)進行訪問和操作的入口,通過Document節(jié)點可以訪問XML文件中所有的元素內(nèi)容颂翼。

Document接口的常用方法

Node:DOM操作的核心接口中有很大一部分是從Node接口繼承過來的晃洒。例如Document、Element朦乏、Attri等接口球及。在DOM樹中,每一個Node接口代表了DOM樹中的一個節(jié)點呻疹。

Node接口的常用方法

NodeList:此接口表示一個節(jié)點的集合吃引,一般用于表示有順序關(guān)系的一組節(jié)點。例如刽锤,一個節(jié)點的子節(jié)點镊尺,當文檔改變時會直接 影響到NodeList集合。

NodeList接口的常用方法

NameNodeMap:此接口表示一組節(jié)點和其唯一名稱對應(yīng)的一一對應(yīng)關(guān)系并思,主要用于屬性節(jié)點的表示庐氮。

出以上4個核心接口外,如果一個程序需要進行DOM解析讀操作宋彼,則需要按如下步驟進行:
(1)建立DocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)建立DocumentBuilder:DocumentBuilder builder = factory.newDocumentBuilder();
(3)建立Document:Document doc= builder.parse("要讀取的文件路徑");
(4)建立NodeList:NodeList nl = doc.getElementsByTagName("讀取節(jié)點");
(5)進行XML信息讀取弄砍。

DOM完成XML的文件輸出仙畦。此時就需要使用DOM操作中提供的各個接口(如Element接口)并手工設(shè)置各個節(jié)點的關(guān)系,同時在創(chuàng)建Document對象時就必須使用newDocument()方法建立一個新的DOM樹音婶。如果現(xiàn)在需要將XML文件保存在硬盤上慨畸,則需要使用TransformerFactory、Transformer衣式、DOMSource寸士、StreamResult 4個類完成。TransformerFactory類:取得一個Transformer類的實例對象碴卧。DOMSource類:接收Document對象弱卡。StreamResult 類:指定要使用的輸出流對象(可以向文件輸出,也可以向指定的輸出流輸出)螟深。Transformer類:通過該類完成內(nèi)容的輸出谐宙。


StreamResult類的構(gòu)造方法

SAX解析操作

SAX(Simple APIs for XML,操作XML的簡單接口)與DOM操作不同的是界弧,SAX采用的是一種順序的模式進行訪問凡蜻,是一種快速讀取XML數(shù)據(jù)的方式。當使用SAX 解析器進行操作時會觸發(fā)一系列的事件垢箕。


SAX主要事件

當掃描到文檔(Document)開始與結(jié)束划栓、元素(Element)開始與結(jié)束時都會調(diào)用相關(guān)的處理方法,并由這些操作方法做出相應(yīng)的操作条获,直到整個文檔掃描結(jié)束忠荞。如果在開發(fā)中想要使用SAX解析,則首先應(yīng)該編寫一個SAX解析器帅掘,再直接定義一個類委煤,并使該類繼承自DefaultHandler類,同時覆寫上述的表中的方法即可修档。
建立完SAX解析器后碧绞,還需要建立SAXParserFactory和SAXParser對象,之后通過SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器吱窝。
使用SAX解析器
package com.sax.demo;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest { public static void main(String[] args) throws Exception {
//(1)建立SAX解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//(2)構(gòu)造解析器
SAXParser parser = factory.newSAXParser();
//(3)解析XML使用
handler parser.parse("sax_demo.xml", new XmlSax());
}}

通過上面的程序可以發(fā)現(xiàn)讥邻,使用SAX解析比使用DOM解析更加容易。


DOM解析與SAX解析的區(qū)別

有兩者的特點可以發(fā)現(xiàn)兩者的區(qū)別:DOM解析適合于對文件進行修改和隨機存取的操作院峡,但是不適合于大型文件的操作兴使。SAX采用部分讀取的方式,所以可以處理大型文件照激,而且只需要從文件中讀取特定內(nèi)容发魄。SAX解析可以由用戶自己建立自己的對象模型。
2.3俩垃、XML解析的好幫手:jdom
jdom是使用Java編寫的欠母,用于讀欢策、寫、操作XML的一套組件赏淌。
jdom = dom 修改文件的有點 + SAX讀取快速的優(yōu)點

jdom的主要操作類

使用jdom生成XML文件
使用jdom讀取XML文件
jdom是一種常見的操作組件在實際的開發(fā)中使用非常廣泛。

2.4啄清、解析工具:dom4j
dom4j也是一組XML操作組件包六水,主要用來讀寫XML文件,由于dom4j性能優(yōu)異辣卒、功能強大掷贾,且具有易用性,所以現(xiàn)在已經(jīng)被廣泛地應(yīng)用開來荣茫。如想帅,Hibernate、Spring框架中都使用了dom4j進行XML的解析操作啡莉。開發(fā)時需要引入的jar包:dom4j-1.6.1.jar港准、lib/jaxen-1.1-beta-6.jar
dom4j中的所用操作接口都在org.dom4j包中定義。其他包根據(jù)需要把選擇使用咧欣。


dom4j的主要接口

用dom4j生成XML文件:
用dom4j讀取XML文件:

小結(jié)

XML主要用于數(shù)據(jù)交換浅缸,而HTML則用于顯示。
Java直接提供的XML解析方式分為兩種魄咕,即DOM和SAX衩椒。這兩種解析的區(qū)別如下:
DOM解析是將所有內(nèi)容讀取到內(nèi)存中,并形成內(nèi)存樹哮兰,如果文件量較大則無法使用毛萌,但是DOM解析可以進行文件的修改
SAX解析是采用順序的方式讀取XML文件中,不受文件大小限制喝滞,但是不允許修改阁将。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市囤躁,隨后出現(xiàn)的幾起案子冀痕,更是在濱河造成了極大的恐慌,老刑警劉巖狸演,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件言蛇,死亡現(xiàn)場離奇詭異,居然都是意外死亡宵距,警方通過查閱死者的電腦和手機腊尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來满哪,“玉大人婿斥,你說我怎么就攤上這事劝篷。” “怎么了民宿?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵娇妓,是天一觀的道長。 經(jīng)常有香客問我活鹰,道長哈恰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任志群,我火速辦了婚禮着绷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌云。我一直安慰自己荠医,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布桑涎。 她就那樣靜靜地躺著彬向,像睡著了一般。 火紅的嫁衣襯著肌膚如雪石洗。 梳的紋絲不亂的頭發(fā)上幢泼,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音讲衫,去河邊找鬼缕棵。 笑死,一個胖子當著我的面吹牛涉兽,可吹牛的內(nèi)容都是我干的招驴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枷畏,長吁一口氣:“原來是場噩夢啊……” “哼别厘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拥诡,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤触趴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渴肉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗懦,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年仇祭,在試婚紗的時候發(fā)現(xiàn)自己被綠了披蕉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖没讲,靈堂內(nèi)的尸體忽然破棺而出眯娱,到底是詐尸還是另有隱情,我是刑警寧澤爬凑,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布徙缴,位于F島的核電站,受9級特大地震影響贰谣,放射性物質(zhì)發(fā)生泄漏娜搂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一吱抚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧考廉,春花似錦秘豹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涮坐,卻和暖如春凄贩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱讹。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工疲扎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捷雕。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓椒丧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親救巷。 傳聞我的和親對象是個殘疾皇子壶熏,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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