解析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:	omcat-6.0.43webappsvoal
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 

原文地址:https://www.cnblogs.com/jycboy/p/saxparxml.html