1. 程式人生 > >XML 解析---dom解析和sax解析

XML 解析---dom解析和sax解析

靜態 open 轉換器 tno 抽象 imp 高速 default 內容

眼下XML解析的方法主要用兩種:


1、dom解析:(Document Object Model。即文檔對象模型)是W3C組織推薦的解析XML的一種方式。


使用dom解析XML文檔,該解析器會先把XML文檔載入到內存中,生成該XML文檔相應的document對象,然後把XML文檔中的各個標簽元素變成相應的Element對象。文本會變成Text對象,屬性會變成Attribute對象,並按這些標簽、文本、屬性在XML文檔中的關系保存這些對象的關系。



缺點:消耗內存。所以使用dom解析XML文檔時不能解析太大的XML文檔,否則有可能會造成內存溢出。
長處:使用dom解析XML文檔能夠非常方便的運行增刪改查操作(能夠直接依據節點相應的對象進行操作)。



2、sax解析:Simple API for XML,不是官方標準,但它是XML社區其實的標準,差點兒全部的XML解析器都支持它。

使用sax解析XML文檔,該解析器會從上往下讀。讀一行。解析一行;

長處:由於它解析XML文檔是採取讀一行,解析一行的方式,所以它不會對內存造成壓力。
缺點:不適合運行增刪改查的操作(也是由於它解析XML文檔時採取的讀一行解析一行的方式,所以它不能往回操作)。僅僅適合對XML文檔進行讀取操作。

======================================================================================================

補充:

XML解析開發包:Jaxp(sun)、Jdom、dom4j;

======================================================================================================

調整JVM內存大小:


當我們要解析的XML文檔內存比較大、並且要對該XML中的節點數據進行相關的操作時,使用這兩種解析方式顯然都會不方便,這時就須要調整JVM內存的大小了。




JVM默認的同意最大內存容量是64M(依據jdk的版本號不同,默認的最大容量值不一樣,jdk5.0版本號的是64MB。jdk7版本號的是170MB)。



調整JVM內存大小的方法(對應的命令為:-Xmx內存大小值單位):

在Eclipse中的項目導航框中右擊對應的Java程序》》Run As》》Open Run Dialog...》》打開Run對話框》》選擇Arguments選項,在開窗體中有兩個輸入框,第一個是程序的參數輸入框。第二個是VM的參數輸入框,在第二個VM的參數輸入框中輸入Xmx200M》》點擊右下角的Runbutton,運行對應的Java程序。就不會報OutOfMemoryError的錯誤了。



======================================================================================================

XML解析開發包:
1、JAXP:JAXP開發包是J2SE的一部分。它由javax.xml、org.w3c.dom、org.xml.sax包及其子包組成。


在javax.xml.parsers包中。定義了幾個工廠類,程序猿調用這些工廠類,能夠得到XML文檔的dom或sax的解析器,從而實現對XML文檔的解析。

首先、創建工廠:
DocumentBuilderFactory factory = DocumentBuilderFactroy.newInstance();//由於DocumentBuilderFactory類是抽象類。不能new出它的對象僅僅能調用它的靜態方法獲取它的對象。
其次、得到dom解析器:
DocumentBuilder builder = factory.newDocumentBuilder();
然後、載入XML文檔。得到代表文檔的Document對象:
Document document = builder.parse("*.xml");
拿到代表XML文檔的document對象就能夠操作XML文檔中的各個節點了。



======================================================================================================

補充:
dom解析下,XML文檔的每個組成部分都會用一個對象表示。比如標簽用Element。屬性用Attribute,但無論什麽對象。都是Node的子類,所以在開發中能夠把獲取到的隨意節點都當作Node對待。



XML編程(CRUD)
create、read、update、delete
加入、查詢、更新、刪除;

除了這兩種解析方法外,還有另外的解析方法。。


======================================================================================================

在對XML文檔進行加入、改動和刪除操作時,不僅要更新document對象還要更新XML文檔(把更新後的document對象重寫到XML文檔中)。

javax.xml.transform包中的Transformer類用於把代表XML文檔的Document對象轉換為某種格式後輸出,比如把XML文檔應用樣式表後轉換成一個HTML文檔。利用這個對象,當然也能夠把Document對象又又一次寫入到一個XML文檔中。源和目的地。能夠通過:
javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象,
用javax.xml.transform.stream.StreamResult對象來表示數據的目的地。
Transformer對象通過TransformerFactory獲得。
Transformer類通過transform方法完畢轉換操作。該方法接收個
(工廠對象(TransformerFactory)》》》轉換器對象(Transformer)》》》轉換方法(transform(DOMSource 源。StreamResult 目的地);))
======================================================================================================

SAX解析:

SAX解析採用事件處理的方式解析XML文件。利用SAX解析XML文檔,涉及兩個部分:解析器和事件處理器:
解析器能夠使用JAXP的API創建。創建出SAX解析器後,就能夠指定解析器去去解析某個XML文檔。
解析器採用SAX方式在解析某個XML文檔時。它僅僅要解析到XML文檔的一個指定部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的XML文件內容作為方法的參數傳遞給事件處理器。


事件處理器由程序猿編寫,程序猿通過事件處理器中方法的參數,就能夠非常輕松的得到SAX解析器解析到的數據,從而能夠決定怎樣對數據進行處理。



1、創建解析工廠;
SAXParserFactory fac = SAXParserFactory.newInstance();

2、獲取解析器。
SAXParser sp = fac.newSAXParser();

3、得到讀取器;
XMLReader re = sp.getXMLReader();

4、設置內容處理器;
re.setContentHandler(new ContentHandler(){ /*實現接口的代碼塊*/});
(或者:re.setContentHandler(new DefaultHandler());/*參數為DefaultHandler類的子類*/)
第一種方法是解析整個XML文檔。另外一種方法能夠僅僅解析某個標簽;
事實上另一種內容處理器,也是先繼承DefaultHandler類,然後把解析的內容封裝到bean對象中。

5、讀取XML文檔內容。
re.parse("*.xml");

======================================================================================================

XML解析開發包:

2、dom4j:

SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File());

OutputFormat format = OutputFormat.createPrettyPrint();//該對象標明格式按美麗的格式進行輸出;另外另一個對象是按緊湊的格式進行輸出;
format.setEncoding("UTF-8");

XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(),format);
xmlWriter.write(doc);//假設xmlWriter對象採用的流是字節流,那麽該對象會先把doc對象按format對象給定的編碼格式轉換成字節,然後把數據交給字節流進行操作。


writer.close();//最後要關閉資源

======================================================================================================

XPath:
使用XPath能夠高速定位到某個節點。
List list = document.selectNodes("//foo/bar");//獲取foo節點下的全部bar節點;

Node node = document.selectSingleNode("//foo/bar");//獲取foo節點下的第一個bar節點;

單斜杠是絕對路徑即從根節點開始;
雙斜杠是相對路徑即從全部當前節點開始。

星號“*”表示選擇全部由星號之前的路徑所定位的元素;
比如:
/aa/bb/*表示選擇全部路徑依附於/aa/bb的元素;
/*/*/*/bbb表示選擇全部的有3個祖先元素的bbb元素;
//bb[@*]表示選擇有隨意屬性的bb元素。
//bb[not(@*)]表示選擇沒有屬性的bb元素;
//bb[@id=‘b1‘]表示選擇含有屬性id=‘b1‘的bb元素;

















XML 解析---dom解析和sax解析