解析XML的幾種方法之SAX解析,xml幾種方法sax

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.