解析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;

//缺省實現所有處理器接口的幫助類DefaultHandler
public 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\voal
public 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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM