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();                     

猜你喜欢

转载自www.cnblogs.com/JYDesigner/p/9467989.html