• Day 28:SAX解析原理


    SAX解析

    回顾DOM解析

           DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。

           缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

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

    SAX解析工具   

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

         核心的API:

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

                                          parse(File f, DefaultHandler dh)方法: 解析xml文件

                                          参数一: File:表示 读取的xml文件。

                                          参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

    例如:

    import java.io.File;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.helpers.DefaultHandler;
    
    public class Demo1 extends DefaultHandler {
        public static void main(String[] args) {
            //创建SAXParser对象  
            SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
            //调用parse方法
            parser.parse(new File("./src/contact.xml"), new Demo2());
        }
    }

           [一个类继承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)  : 读到文本内容时调用

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class Demo2 extends DefaultHandler {
    
        @Override
        public void startDocument() throws SAXException {
            System.out.println("MyDefaultHandler.startDocument()");
        }
    
        @Override
        public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
            System.out.println("MyDefaultHandler.startElement()-->"+qName);
        }
        
        @Override
        public void endElement(String uri, String localName, String qName)throws SAXException {
            System.out.println("MyDefaultHandler.endElement()-->"+qName);
        }
        
        @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()");
        }
    }

    DOM解析

    SAX解析

    原理:一次性加载xml文档,不适合大容量的文件读取

    原理:加载一点,读取一点,处理一点。适合大容量文件的读取

    DOM解析可以任意进行增删改成

    SAX解析只能读取

    DOM解析任意读取任何位置的数据,甚至往回读

    SAX解析只能从上往下,按顺序读取,不能往回读

    DOM解析面向对象的编程方法(NodeElementAttribute,Java开发者编码比较简单。

    SAX解析基于事件的编程方法。java开发编码相对复杂。

    把xml封装为对象

    import java.io.File;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    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;
    
    public class MyDefaultHandler3 extends DefaultHandler {
        
        private List<Contact> list = new ArrayList<Contact>();
        public List<Contact> getList(){
            return list;
        }
        private Contact contact;
        
        private String curTag;
    
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            curTag = qName;
            if("contact".equals(qName)){
                contact = new Contact();
                
                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;
            if("contact".equals(qName)){
                list.add(contact);
            }
        }
    }

    总结:

            1)Dom4j修改xml文档:new XMLWrier();

            2)xPath技术: 快速查询xml节点selectNodes()、selectSinglNode();、xpath表达式语言          

            3)  SAX解析: SAXParser parse、parser()、

             DefaultHandler类:startElement();、characters();、endElement();                     

  • 相关阅读:
    C# 空合并运算符 ??
    基于ASP.NET Core 创建 Web API
    使用 csc.exe 编译C#代码
    NPOI创建Excel批注
    http协议 put、delete请求asp.net mvc应用,报404错误
    visual studio清理nuget包缓存
    String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace
    C# linq to xml 简单示例
    SQL Server修改表结构,不允许保存更改。
    SQL Server 分离与附加数据库
  • 原文地址:https://www.cnblogs.com/JYDesigner/p/9467989.html
Copyright © 2020-2023  润新知