對於Java來說,載入和解析XML檔案有兩種方法:
一種:通過載入整個XML檔案產生Document文檔,然後解析Document文檔內容的樹和根。
另一種:利用SAX封裝類來逐步解析。
這兩種方法各有優點和缺點:第一種由於需要載入整個XML檔案產生Document,在解析,所以假如XML檔案內容過多、過大,就會造成載入延遲,緩慢(所以此方法只適用於XML檔案比較小點 的XML檔案);而第二種方法利用SAX封裝類來載入XML檔案,實現邊載入邊解析,不用等到全部的XML內容載入完成,所以無需擔心XML檔案過大、內容過多等問題,但由於消耗的系統資源比第一種要多。所以說各有利弊。總的一句話說,XML檔案小的話,就使用第一種方法,假如檔案過大,就是用第二種。
在開始前先來看看整個項目的結構
其中,Gamers.xml就是我們要解析的xml檔案,再來看一下xml內的內容
<?xml version="1.0" encoding="UTF-8"?><Gamers> <Gamer> <ID>TOR_Apple</ID> <Grade>13</Grade> </Gamer> <Gamer> <ID>TOR_zhuang</ID> <Grade>16</Grade> </Gamer> <Gamer> <ID>TOR_KongBai</ID> <Grade>13</Grade> </Gamer> <Gamer> <ID>TOR_OMG</ID> <Grade>16</Grade> </Gamer></Gamers>
xml檔案結構:樹<Gamer>,根<Gamer>和每個根內的元素<ID>、<Grade>(我是個魔獸迷~~)。
好了,先來看看第一種方法:產生Document方式解析XML檔案
package com.parsers;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class XmlParsers {//採用DOM解析形式/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//匯入xml檔案,要注意xml檔案的路徑要正確File file=new File("xmlfields/Gamers.xml");/*執行個體化一個DocumentBuildFactory,一個document構造器構建的工廠,顧名思義,我想大家都能猜到它的作用了吧。*/DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();DocumentBuilder db;try {//執行個體化一個DocumentBuilder,一個document構造器,用於產生Document文檔db=dbf.newDocumentBuilder();//通過構造器的parse()方法,將一個File對象產生相應的Document文檔Document document=db.parse(file);/*根據字串在document內尋找相應的根,其傳回值是一個節點鏈表,至於鏈表不懂的話,大家可以去看一下資料結構*/NodeList nodeList=document.getElementsByTagName("Gamer");for(int j=0;j<nodeList.getLength();j++){//返回相應根內的子節點,其傳回值也是個節點鏈表NodeList childList=nodeList.item(j).getChildNodes();for(int i=0;i<childList.getLength();i++){//擷取相應的根內的元素的名字String tagName=childList.item(i).getNodeName();if(tagName.equals("ID")){/* * 這裡要注意一下,假如我想擷取ID標籤下的值(假如是TOR_Apple),很多人都這樣寫 * childList.item(i).getNodeValue(),但這樣是錯了,不會等到相應的結果,由於childList.item(i) * 這句代碼的得到的只是<ID>,而TOR_Apple這個值不是<ID>的值,而是<ID>的子節點。切記*/System.out.print(childList.item(i).getChildNodes().item(0).getNodeValue()+"==");}else if(tagName.equals("Grade")){System.out.println(childList.item(i).getChildNodes().item(0).getNodeValue());}}}} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
好了,代碼中有注釋,相信大家一定會看的很明白的。第一種解析XML檔案的方法就介紹到這。接下來,就是第二種解析XML檔案的方法咯,廢話不多說,上代碼
package com.parsers;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class XmlParsersUserSAX extends DefaultHandler{/** * @param args */String tagName=null;public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {// TODO Auto-generated method stubXmlParsersUserSAX spus=new XmlParsersUserSAX();//執行個體化一個SAX解析工廠SAXParserFactory spf=SAXParserFactory.newInstance();//通過工廠產生一個SAX解析器SAXParserSAXParser saxParser=spf.newSAXParser();//解析xml檔案saxParser.parse(new InputSource("xmlfields/Gamers.xml"), spus);}@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stub//系統自動調用,當開始解析xml檔案時(遇到樹節點),就會被自動調用System.out.println("準備開始解析對象....");}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stub//系統自動調用,當結束解析xml檔案時(遇到樹結束節點),就會被自動調用System.out.println("對象解析結束....");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO Auto-generated method stub//系統自動調用if(qName.equals("ID") || qName.equals("Grade")){System.out.println("開始解析元素...");tagName=qName.trim();System.out.println(tagName);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stub//系統自動調用System.out.println("元素解析完畢...");tagName=null;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub//系統自動調用if(tagName!=null){if(tagName.equals("ID")){System.out.print(tagName+":"+new String(ch,start,length)+"==");}else if(tagName.equals("Grade")){System.out.println(tagName+":"+new String(ch,start,length));}}}}
好了,兩種方法都講完了~~呵呵呵呵,不知道對大家有木有用處,望哪位學友、大神飄過了留下寶貴的意見,thanks!!!