首页 > 代码库 > SAX解析

SAX解析

1DOM解析与SAX解析比较:

DOM解析

SAX解析

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

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

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

SAX解析只能读取

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

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

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

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

2 SAX解析工具

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

 

核心的API

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

parseFile f, DefaultHandler dh)方法: 解析xml文件

 

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

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

例如:{

      1.创建SAXParser对象  

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

       2.调用parse方法

    parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

   }

 

  3.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)   读到文本内容时调用

3.SAM解析练习:

  1.基本练习,查看函数调用;

  SamExercise.java:

技术分享
package com.dom4j.SAM;

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SamExercise {

    public static void main(String[] args) throws Exception, SAXException {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        parser.parse(new File("./src/contact.xml"), new MyDefalutHandler());
    }

}
View Code

 

  MyDefalutHandler.java:

技术分享
package com.dom4j.SAM;

import javax.xml.stream.events.StartDocument;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyDefalutHandler extends DefaultHandler{
    @Override
    public void startDocument() throws SAXException {
        System.out.println("MyDefalutHandler.startDocument()");
    }
    
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("MyDefalutHandler.startElement()->>>" + qName);
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println("MyDefalutHandler.characters()->>>" + new String(ch, start, length));
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("MyDefalutHandler.endElement()->>>" + qName);
    }
    
    @Override
    public void endDocument() throws SAXException {
        System.out.println("MyDefalutHandler.endDocument()");
    }
}
View Code

  2.读取打印出来xml文件:

  contact.xml:

技术分享
<?xml version="1.0" encoding="gb2312"?>
<contactList>
    <contact id="001">
        <name>张三</name>
        <age>20</age>
        <phone>134222223333</phone>
        <email>zhangsan@qq.com</email>
        <qq>432221111</qq>
    </contact>
    <contact id="003" value="hello">
        <name>lisi</name>
        <age>20</age>
        <phone>134222225555</phone>
        <email>lisi@qq.com</email>
        <qq>432222222</qq>
    </contact>
    <contact></contact>
</contactList>
View Code

  DisplayAllContent.java:

技术分享
package com.dom4j.SAM;

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class DisplayAllContent {

    public static void main(String[] args) throws Exception, SAXException {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        MyDisplayAllContentHandle handle = new MyDisplayAllContentHandle();
        parser.parse(new File("./src/contact.xml"), handle);
        System.out.println(handle.getContent());
    }

}
View Code

  MyDisplayAllContentHandle:

技术分享
package com.dom4j.SAM;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyDisplayAllContentHandle extends DefaultHandler {
    private static StringBuffer sb;
    static{
        sb = new StringBuffer();
    }
    public String getContent(){
        return sb.toString();
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        sb.append("<");
        sb.append(qName);
        for(int i = 0; i < attributes.getLength(); i++){
            sb.append(" " + attributes.getQName(i));
            sb.append("=" + "\"" + attributes.getValue(i) + "\"");
        }
        sb.append(">");
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        sb.append(new String(ch, start, length));
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        sb.append("</");
        sb.append(qName + ">");
    }
}
View Code

 

  3.将xml文件内容放在一个类中,并输出:

  contact.java:

技术分享
package com.dom4j.SAM;

public class contact {
    private String id;
    private String name;
    private String age;
    private String qq;
    private String email;
    private String phone;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getqq() {
        return qq;
    }
    public void setqq(String qq) {
        this.qq = qq;
    }
    public String getemail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    @Override
    public String toString() {
        return "Person \n id=" + id + ", name=" + name + ", age=" + age + ", qq=" + qq
                + ", email=" + email + ", phone=" + phone + "\n";
    }
    
}
View Code

  ReadValue.java:

技术分享
package com.dom4j.SAM;

import java.io.File;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;


public class ReadValue{
    
    public static void main(String[] args) throws Exception, SAXException {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        MyReadValueHandle handle = new MyReadValueHandle();
        parser.parse(new File("./src/contact.xml"), handle);
        ArrayList<contact> list = handle.getList();
        for(contact acontact : list){
            System.out.println(acontact);
        }
    }
}
View Code

  MyReadValueHandle.java:

技术分享
package com.dom4j.SAM;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;



public class MyReadValueHandle extends DefaultHandler {
    
    private ArrayList<contact> list = new ArrayList<contact>();
    private contact acontact;
    private String curTag;
    
    public ArrayList<contact> getList(){
        return list;
    }
    
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        curTag = qName;
        if(qName.equals("contact")){
            acontact = new contact();
            acontact.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)){
            acontact.setName(content);
        }
        if("age".equals(curTag)){
            acontact.setAge(content);
        }
        if("phone".equals(curTag)){
            acontact.setPhone(content);
        }
        if("email".equals(curTag)){
            acontact.setEmail(content);
        }
        if("qq".equals(curTag)){
            acontact.setqq(content);
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        curTag = null;//注意!!避免换行空格的影响
        if(qName.equals("contact")){
            list.add(acontact);
        }
    }
}
View Code

  4.设计一个通讯录程序

  联系人: 编号  姓名  性别  年龄  电话  QQ 邮箱

  功能要求:

    添加联系人

    修改联系人

    删除联系人

    查询所有联系人

  

 

SAX解析