zoukankan      html  css  js  c++  java
  • SAX解析示例代码和原理

    import java.io.File;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    /**
     * 第一个SAX读取xml文件程序
     * @author APPle
     *
     */
    public class Demo1 {
    
    
        public static void main(String[] args) throws Exception{
            //1.创建SAXParser对象
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    
            //2.调用parse方法
            /**
             * 参数一: xml文档
             * 参数二: DefaultHandler的子类
             */
            parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
        }
    
    }
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理程序(如何解析xml文档)
     * @author APPle
     *
     */
    public class MyDefaultHandler extends DefaultHandler {
    
        /**
         * 开始文档时调用
         */
        @Override
        public void startDocument() throws SAXException {
            System.out.println("MyDefaultHandler.startDocument()");
        }
    
        /**
         * 开始标签时调用
         * @param qName: 表示开始标签的标签名
         * @param attributes: 表示开始标签内包含的属性列表
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                                 Attributes attributes) throws SAXException {
            System.out.println("MyDefaultHandler.startElement()-->"+qName);
        }
    
        /**
         * 结束标签时调用
         * @param qName: 结束标签的标签名称
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            System.out.println("MyDefaultHandler.endElement()-->"+qName);
        }
    
        /**
         * 读到文本内容的时调用
         * @param ch: 表示当前读完的所有文本内容
         * @param start: 表示当前文本内容的开始位置
         * @param length: 表示当前文本内容的长度
         * char[](                                       张三              20)   100
         *                              98 2
         */
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            //得到当前文本内容
            String content = new String(ch,start,length);
            System.out.println("MyDefaultHandler.characters()-->"+content);
        }
    
        /**
         * 结束文档时调用
         */
        @Override
        public void endDocument() throws SAXException {
            System.out.println("MyDefaultHandler.endDocument()");
        }
    
    }

    日志输出:

    MyDefaultHandler.startDocument()
    MyDefaultHandler.startElement()-->contactList
    MyDefaultHandler.characters()-->
        
    MyDefaultHandler.startElement()-->contact
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->name
    MyDefaultHandler.characters()-->张三
    MyDefaultHandler.endElement()-->name
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->age
    MyDefaultHandler.characters()-->20
    MyDefaultHandler.endElement()-->age
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->phone
    MyDefaultHandler.characters()-->134222223333
    MyDefaultHandler.endElement()-->phone
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->email
    MyDefaultHandler.characters()-->zhangsan@qq.com
    MyDefaultHandler.endElement()-->email
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->qq
    MyDefaultHandler.characters()-->432221111
    MyDefaultHandler.endElement()-->qq
    MyDefaultHandler.characters()-->
        
    MyDefaultHandler.endElement()-->contact
    MyDefaultHandler.characters()-->
        
    MyDefaultHandler.startElement()-->contact
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->name
    MyDefaultHandler.characters()-->李四
    MyDefaultHandler.endElement()-->name
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->age
    MyDefaultHandler.characters()-->20
    MyDefaultHandler.endElement()-->age
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->phone
    MyDefaultHandler.characters()-->134222225555
    MyDefaultHandler.endElement()-->phone
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->email
    MyDefaultHandler.characters()-->lisi@qq.com
    MyDefaultHandler.endElement()-->email
    MyDefaultHandler.characters()-->
            
    MyDefaultHandler.startElement()-->qq
    MyDefaultHandler.characters()-->432222222
    MyDefaultHandler.endElement()-->qq
    MyDefaultHandler.characters()-->
        
    MyDefaultHandler.endElement()-->contact
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.endElement()-->contactList
    MyDefaultHandler.endDocument()

    import java.io.File;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    /**
     * 读取contact.xml文件,完整输出文档内容
     * @author APPle
     *
     */
    public class Demo2 {
    
        public static void main(String[] args)throws Exception {
            //1.创建SAXParser
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            //2.读取xml文件
            MyDefaultHandler2 handler = new MyDefaultHandler2();
            parser.parse(new File("./src/contact.xml"), handler);
            String content = handler.getContent();
            System.out.println(content);
        }
    
    }
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理器程序
     * @author APPle
     */
    public class MyDefaultHandler2 extends DefaultHandler {
        //存储xml文档信息
        private StringBuffer sb = new StringBuffer();
    
        //获取xml信息
        public String getContent(){
            return sb.toString();
        }
    
    
        /**
         * 开始标签
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                                 Attributes attributes) throws SAXException {
            sb.append("<"+qName);
            //判断是否有属性
            if(attributes!=null){
                for(int i=0;i<attributes.getLength();i++){
                    //得到属性名称
                    String attrName = attributes.getQName(i);
                    //得到属性值
                    String attrValue = attributes.getValue(i);
                    sb.append(" "+attrName+"=""+attrValue+""");
                }
            }
            sb.append(">");
        }
    
        /**
         * 文本内容
         */
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            //得到当前读取的文本
            String content = new String(ch,start,length);
            sb.append(content);
        }
    
        /**
         * 结束标签
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            sb.append("</"+qName+">");
        }
    }

    日志输出:

    <contactList>
        <contact id="001">
            <name>张三</name>
            <age>20</age>
            <phone>134222223333</phone>
            <email>zhangsan@qq.com</email>
            <qq>432221111</qq>
        </contact>
        <contact id="002">
            <name>李四</name>
            <age>20</age>
            <phone>134222225555</phone>
            <email>lisi@qq.com</email>
            <qq>432222222</qq>
        </contact>
    </contactList>

    import java.io.File;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    /**
     * 使用sax解析把 xml文档封装成对象
     * @author APPle
     *
     */
    public class Demo3 {
    
        public static void main(String[] args)throws Exception {
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            MyDefaultHandler3 handler = new MyDefaultHandler3();
            parser.parse(new File("./src/contact.xml"), handler);
            List<Contact> list = handler.getList();
            for (Contact contact : list) {
                System.out.println(contact);
            }
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理程序
     * @author APPle
     *
     */
    public class MyDefaultHandler3 extends DefaultHandler {
        //存储所有联系人对象
        private List<Contact> list = new ArrayList<Contact>();
    
        public List<Contact> getList(){
            return list;
        }
        //保存一个联系人信息
        private Contact contact;
        /**
         * 思路:
         *     1)创建Contact对象
         *  2)把每个contact标签内容存入到Contact对象
         *  3)把Contact对象放入List中
         */
        //用于临时存储当前读到的标签名
        private String curTag;
    
        @Override
        public void startElement(String uri, String localName, String qName,
                                 Attributes attributes) throws SAXException {
            curTag = qName;
            //读取到contact的开始标签创建Contact对象
            if("contact".equals(qName)){
                contact = new Contact();
    
                //设置id值
                contact.setId(attributes.getValue("id"));
            }
        }
    
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            //当前文本内容
            String content = new String(ch,start,length);
    
            if("name".equals(curTag)){
                contact.setName(content);
            }
    
            if("age".equals(curTag)){
                contact.setAge(content);
            }
    
            if("phone".equals(curTag)){
                contact.setPhone(content);
            }
    
            if("email".equals(curTag)){
                contact.setEmail(content);
            }
    
            if("qq".equals(curTag)){
                contact.setQq(content);
            }
        }
    
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            //设置空时为了避免空格换行设置到对象的属性中
            curTag = null;
            //读到contact的结束标签放入List中
            if("contact".equals(qName)){
                list.add(contact);
            }
        }
    }

    日志输出:

    Contact [age=20, email=zhangsan@qq.com, id=001, name=张三, phone=134222223333, qq=432221111]
    Contact [age=20, email=lisi@qq.com, id=002, name=李四, phone=134222225555, qq=432222222]

    Contact,xml

    <?xml version="1.0" encoding="utf-8"?>
    <contactList>
        <contact id="001">
            <name>张三</name>
            <age>20</age>
            <phone>134222223333</phone>
            <email>zhangsan@qq.com</email>
            <qq>432221111</qq>
        </contact>
        <contact id="002">
            <name>李四</name>
            <age>20</age>
            <phone>134222225555</phone>
            <email>lisi@qq.com</email>
            <qq>432222222</qq>
        </contact>
    </contactList>

    SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低

    DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。 对内存要求比较要。     缺点: 不适合读取大容量的xml文件,容易导致内存溢出。


    SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

     核心的API:

             SAXParser类: 用于读取和解析xml文件对象

              parse(File f, DefaultHandler dh)方法: 解析xml文件  参数一: File:表示 读取的xml文件。  参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

    1.创建SAXParser对象  
         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
    2.调用parse方法
                parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());}                    [一个类继承class 类名(extends DefaultHandler)  在调用是创建传进去
                DefaultHandler类的API:
                            void startDocument()  :  在读到文档开始时调用
                            void endDocument()  :在读到文档结束时调用
                            void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用                
                            void endElement(String uri, String localName, String qName)   :读到结束标签时调用
                            void characters(char[] ch, int start, int length)  : 读到文本内容时调用

  • 相关阅读:
    java并发ThreadLocal
    PermGen space 与 Java heap space
    java vm内存设置
    linux下ssh使用和配置
    ubuntu进入命令登录界面
    7-21 求前缀表达式的值
    7-20 表达式转换
    7-19 求链式线性表的倒数第K项
    7-18 银行业务队列简单模拟
    7-17 汉诺塔的非递归实现
  • 原文地址:https://www.cnblogs.com/loaderman/p/9996343.html
Copyright © 2011-2022 走看看