解析XML的幾種方法之SAX解析,xml幾種方法sax
假期總結不能停,堅持堅持。。。。接下來總結一下XMl和json的解析和產生。。
解析XML的四種方法,即:DOM、SAX、JDOM和DOM4J
下面首先給出這四種方法的jar包:
DOM:在現在的Java JDK裡都內建了,在xml-apis.jar包裡
SAX:http://sourceforge.net/projects/sax/
JDOM:http://jdom.org/downloads/index.html
DOM4J:http://sourceforge.net/projects/dom4j/
現編開始一一介紹:
SAX:也是我第一個學的方法。。。
SAX是一種解析速度快並且佔用記憶體少的XML解析器,非常適用於Android的行動裝置。
SAX採用事件驅動`,也就是說,它並不是需要解析完整的文檔,在按內容順序解析文檔的過程中,Sax會判斷當前讀到的字元是否符合XMl文法的某部分,如果符合就會觸發事件。
所謂事件,其實就是一些回掉方法,這些事件定義在GefaultHandler中。
解析過程:
(1)建立SAX解析器
SAXParserFactory factory=SAXParserFactory.newInstance();
//reader對象,從解析器得到reader
XMLReader reader = factory.newSAXParser().getXMLReader();
(2)實現解析DefaultHandler
主要實現其中的4個方法:
Void startDocument(), void endDocument(), void startElement(String uri,String localName,string qName,Attributes attr).
Void endElement(String uri,String localName,string qName)
android範例程式碼:
package com.example.xmltest;import java.text.AttributedCharacterIterator.Attribute;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;//預設實現所有處理器介面的協助類DefaultHandlerpublic class MyContentHandler extends DefaultHandler{ String hisname,address,money,sex,status; String tagName; /** * @param args */ public void startDocument() throws SAXException{ System.out.println("、、、、begin、、、、"); } public void endDocument() throws SAXException{ System.out.println("、、、、end、、、、"); } //QName(Qualified Name 限定?指定?名稱) //sina:blog就是QName,相當於首碼+":"+LocalName,LocalName是blog。 //Attributes得到標籤的屬性,一個標籤可以有多個屬性<worker id="AD002">中id就是屬性 public void startElement(String namespaceURI, String localName ,String qName, Attributes attr) throws SAXException{ tagName = localName; System.out.println("tagName:"+tagName); //localName 屬性返回被選元素的本地名稱(元素名稱)。 //如果選定的節點不是元素或屬性,則該屬性返回 NULL if(localName.equals("worker")){ //擷取標籤的全部屬性 for(int i = 0;i < attr.getLength();i++){ System.out.println(attr.getLocalName(i)+"="+attr.getValue(i)); } //getLocalName(i)得到是id getValue(i)得到的是後邊的值 } } //namespaceURI命名空間,得到當前正在解析的標籤的命名空間,用於區分標籤;localname不帶首碼,qname帶首碼 public void endElement(String namespaceURI, String localName,String qName) throws SAXException{ //擷取標籤的全部屬性 if(localName.equals("worker")){ this.printout(); //全部輸出 } tagName=""; } //得到值,tagName在startElement中已經是標籤名啦。。。 public void characters(char[] ch,int start,int length)throws SAXException{ if(tagName.equals("name")) hisname = new String(ch,start,length).trim(); else if(tagName.equals("sex")) sex = new String(ch,start,length).trim(); else if(tagName.equals("status")) status = new String(ch,start,length).trim(); else if(tagName.equals("address")) address = new String(ch,start,length).trim(); else if(tagName.equals("money")){ money = new String(ch,start,length).trim(); } } private void printout(){ System.out.print("name: "); System.out.println(hisname); System.out.print("sex: "); System.out.println(sex); System.out.println("cdv"); System.out.print("status: "); System.out.println(status); System.out.print("address: "); System.out.println(address); System.out.print("money: "); System.out.println(money); System.out.println(); }}
下邊是Activity的代碼:
package com.example.xmltest;import java.io.StringReader;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.ContentHandler;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import com.example.utils.HttpDownloader;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;//對應的檔案在D:\tomcat-6.0.43\webapps\voalpublic class XMLActivity extends Activity { private Button parsebutton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xml); parsebutton = (Button)findViewById(R.id.parsebutton); parsebutton.setOnClickListener(new ParseButtonListener()); } /** * 住線程中不能申請網路服務!!!!另起線程 * @author 超超boy */ class ParseButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub System.out.println("啟動線程"); new Thread(new Down()).start(); } } class Down implements Runnable{ @Override public void run() { // TODO Auto-generated method stub HttpDownloader hd = new HttpDownloader(); //resultStr返回的是檔案內容 String resultStr = hd.download("http://192.168.253.1:8088/voal/test.xml"); //這個是自己搭建的伺服器中的檔案 System.out.println(resultStr); try{ //建立一個SAXParserFactory解析器工程 SAXParserFactory factory = SAXParserFactory.newInstance(); //reader對象,從解析器得到reader XMLReader reader = factory.newSAXParser().getXMLReader(); //為xmlreader設定內容處理器,漸進式掃描,調用函數,要調用的函數就在MyContentHandler實作類別中 reader.setContentHandler(new MyContentHandler()); //開始解析檔案 System.out.println("開始解析"); reader.parse(new InputSource(new StringReader(resultStr))); }catch(Exception e){ e.printStackTrace(); } } }}
解析的原檔案:
<?xml version="1.0" encoding="UTF-8"?><workers> <worker id="AQ01"> <name>Jery</name> <sex>女</sex> <status>經理</status> <address>北京</address> <money>4000</money> </worker> <worker id="AD02"> <name>Lili</name> <sex>女</sex> <status>總監</status> <address>青島</address> <money>40000</money> </worker> <worker id="AD03"> <name>ChaoCaho</name> <sex>男</sex> <status>董事長</status> <address>青島</address> <money>400000</money> </worker> </workers>
轉載請註明出處:http://www.cnblogs.com/jycboy/p/saxparxml.html