1. 程式人生 > >快速有效的解析大型XML檔案

快速有效的解析大型XML檔案

              和老師做研究也快一年了。使我認識比較深的是對XML的解析和圖論。由於我們做的試驗是通過XML來生成圖,於是擺在我們面前的首要問題是如何解析XML。

              在此之前曾經用過DOM4J來解析過XML,那是在給研究生的學姐作業Webservice的時候用的,用來解析wsdl檔案,來實現簡單的動態的服務呼叫。那個wsdl最多也就幾兆,大部分可以將內容放在記憶體中。而現在解析的最小的XML檔案都有100M,用那種比較簡單的解析方式是無法快速解析的。我們知道JAVA解析xml有以下幾種方法:jdom、dom4j、dom、sax。還有一種是自己寫一個解析器!這個我也寫過,能夠解析一般的XML檔案,可是通用性不是很好就沒做太多的研究。我們知道前面兩種都是比較好用的,如jdom,dom4j可以使用xpath規則的語言來讀取xml中指定的內容。但是它們都是和dom一樣,都是將整個xml檔案讀入內容中在對xml進行解析,這樣的解析方式對與大型的xml是不合適的。因為受到記憶體的限制。

               那麼怎麼解析大型的xml資料呢?我想大家看到現在也應該知道是那個,就是sax。sax解析xml它是以流的形式將xml內容讀入記憶體中,我們使用sax解析xml是可以繼承DefaultHandler類,也可以實現相應的介面,對其中的五個方法進行重寫,分別是:

1、public void startDocument() //該方法是解析xml的入口,即開始對XML解析 
2、public void startElement(String uri, String localName, String qName,Attributes attributes)//這是對xml一個element進行解析,如:<element attribute='value'>text</element>
 其中兩個引數是最常用的,一個就是attributes和qName,此處的attributes是一個集合,可以將多個屬性封裝在其中,
可以通過attributes.getValue(0)來獲得此處的attribute的value,而qName是此處的element,也就是元素名 
3、public void characters(char[] ch, int start, int length)//該方法是獲得元素間的text文字內容,可以通過new String(ch, start, length);來獲得,
 4、public void endElement(String uri, String localName, String qName)//此處是一個元素的結束方法,如此處的</element>時則呼叫該方法 
5、public void endDocument() //該方法是在解析完xml檔案後呼叫該方法


有上面可以看出sax解析xml是更具xml內容的組成結構來進行解析的,每個方法代表的是xml結構中的一個成分,所以可以靈活的運用,來對xml進行解析。通過試驗表明sax解析200m的XML檔案只需幾十秒的時間(是在我的個人電腦上)。

                希望這篇文章能給初次借出對大型XML檔案進行解析的人帶來一定的幫助,從而避免我的彎路。謝謝閱讀本文......