zoukankan      html  css  js  c++  java
  • 解析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 

  • 相关阅读:
    测试打印功能
    绘图
    图片验证码
    图片防盗
    图片水印
    surface 译
    ViewManager 译
    WindowId 译
    Display
    LayoutParams
  • 原文地址:https://www.cnblogs.com/jycboy/p/saxparxml.html
Copyright © 2011-2022 走看看