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 

  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/jycboy/p/saxparxml.html
Copyright © 2011-2022 走看看