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 郵箱

  功能要求:

    添加聯系人

    修改聯系人

    刪除聯系人

    查詢所有聯系人

  思路:添加聯系人的時候先把輸入的內容放在一個配置文件中config.txt,然后用BeanUtil框架從這個配置文件中讀取內容用dom解析,放到contact.xml中,修改的時候直接用xpath技術得到id,通過dom解析修改xml中的內容,刪除和修改類同,查詢的時候直接用的SAX解析;

  代碼:

main.java

package com.dom4j.contacts;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner cin = new Scanner(System.in);
        String operate;
        while(true){
            System.out.println("================");
            System.out.println("【1】添加聯系人");
            System.out.println("【2】修改聯系人");
            System.out.println("【3】刪除聯系人");
            System.out.println("【4】查詢所有聯系人");
            System.out.println("【Q】退出程序");
            System.out.println("==================");
            operate = cin.nextLine();
            if(operate.equals("Q")){
                break;
            }
            if(operate.equals("1")){
                new AlterContact().addContact();
            }
            if(operate.equals("2")){
                new AlterContact().alterContact();
            }
            if(operate.equals("3")){
                new AlterContact().deleteContact();
            }
            if(operate.equals("4")){
                new QueryContact().display();
            }
            
        }
    }
}
View Code

contact.java:

package com.dom4j.contacts;

public class Contact {
    private String id, name, sex, phone, qq, email;
    private String age;

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return id + "\t" + name + "\t" + age + "\t" + sex
                + "\t" + phone + "\t" + qq + "\t" + email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    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;
    }
    
}
View Code

AlterContact.java:

package com.dom4j.contacts;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import java.util.Scanner;
import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.xml.sax.DocumentHandler;


import sun.font.CreatedFontTracker;


public class AlterContact {
    private Scanner cin = new Scanner(System.in);
    private static Contact contact;
    private Properties properties;
    
    static{
        contact = new Contact();
    }
    
    public void addContact() throws Exception {
        WriteFile();
        //讀取配置文件
        properties = new Properties();
        Class clazz = AlterContact.class;
        InputStream inputStream = clazz.getResourceAsStream("/config.txt");
        //注意這個文件在bin目錄下的,並不在src下,錯了半天才發現!!!
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //向配置文件中讀取數據加入xml文件中
        Document doc = new SAXReader().read("./src/contact.xml");
        List nodes = doc.selectNodes("//contactList");
        Element list = (Element)nodes.get(0);
        Element newContact = list.addElement("contact");
        newContact.addAttribute("id", properties.getProperty("id"));
        newContact.addElement("age").setText(properties.getProperty("age"));
        newContact.addElement("name").setText(properties.getProperty("name"));
        newContact.addElement("sex").setText(properties.getProperty("sex"));
        newContact.addElement("phone").setText(properties.getProperty("phone"));
        newContact.addElement("qq").setText(properties.getProperty("qq"));
        newContact.addElement("email").setText(properties.getProperty("email"));
        //寫入xml文件
        OutputFormat format = OutputFormat.createPrettyPrint();
        FileOutputStream outputStream = new FileOutputStream(new File("./src/contact.xml"));
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(outputStream, format);
        writer.write(doc);
        writer.close();
        System.out.println("添加成功!");
    }

    public void alterContact() throws Exception {
        System.out.println("請輸入您要修改的聯系人的編號:");
        String id = cin.nextLine();
        Document doc = new SAXReader().read(new File("./src/contact.xml"));
        List list = doc.selectNodes("//contact[@id=" + id + "]");
        if(list.size() == 0){
            System.out.println("您要修改 的id不存在!");
            return;
        }
        Element acontact = (Element) list.get(0);
        System.out.println("您要修改的聯系人信息為:");
        System.out.println("name: " + acontact.element("name").getText());
        System.out.println("sex: " + acontact.element("sex").getText());
        System.out.println("age: " + acontact.element("age").getText());
        System.out.println("phone: " + acontact.element("phone").getText());
        System.out.println("qq: " + acontact.element("qq").getText());
        System.out.println("email: " + acontact.element("email").getText());
        
        while(true){
            System.out.println("歡迎來到修改系統\t如需退出請按Q鍵");
            System.out.println("請輸入您要修改的項目:");
            String op = cin.nextLine();
            if(op.equals("Q")){
                return;
            }
            System.out.println("請輸入修改的內容:");
            String va = cin.nextLine();
            acontact.element(op).setText(va);
            //寫入xml文件
            OutputFormat format = OutputFormat.createPrettyPrint();
            FileOutputStream outputStream = new FileOutputStream(new File("./src/contact.xml"));
            format.setEncoding("utf-8");
            XMLWriter writer = new XMLWriter(outputStream, format);
            writer.write(doc);
            writer.close();
            System.out.println("修改成功!");
        }
        
    }

    public void deleteContact() throws Exception {
        System.out.println("請輸入您要刪除的聯系人編號:");
        String id = cin.nextLine();
        Document doc = new SAXReader().read(new File("./src/contact.xml"));
        List<Element> list = (List<Element>)doc.selectNodes("//contact[@id=" + id + "]");
        if(list.size() == 0){
            System.out.println("您要刪除的聯系人不存在!");
            return;
        }
        for(Element contact : list){
            contact.detach();
        }
        //寫入xml文件
        
        OutputFormat format = new OutputFormat().createPrettyPrint();
        FileOutputStream out = new FileOutputStream(new File("./src/contact.xml"));
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(out, format);
        writer.write(doc);
        writer.close();
        System.out.println("刪除成功! ");
    }
    
    private void WriteFile() throws Exception{
        BufferedWriter writer = new BufferedWriter(new FileWriter("./bin/config.txt"));
        //向配置文件中寫數據放入對象中
        System.out.println("請輸入編號:");
        String str = cin.nextLine();
        writer.write("id=" + str);
        BeanUtils.setProperty(contact, "id", str);
        writer.newLine();
        
        System.out.println("請輸入姓名:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "name", str);
        writer.write("name=" + str);
        writer.newLine();
        
        System.out.println("請輸入性別:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "sex", str);
        writer.write("sex=" + str);
        writer.newLine();
        
        System.out.println("請輸入年齡:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "age", str);
        writer.write("age=" + str);
        writer.newLine();
        
        System.out.println("請輸入電話號碼:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "phone", str);
        writer.write("phone=" + str);
        writer.newLine();
        
        System.out.println("請輸入qq:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "qq", str);
        writer.write("qq=" + str);
        writer.newLine();
        
        System.out.println("請輸入email:");
        str = cin.nextLine();
        BeanUtils.setProperty(contact, "email", str);
        writer.write("email=" + str);
        writer.newLine();
        writer.close();
    }

}
View Code

queryContact.java:

package com.dom4j.contacts;

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

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

import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

import com.dom4j.SAM.MyDefalutHandler;

public class QueryContact {
    private ArrayList<Contact>list;
    
    public void display() throws Exception, SAXException{
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        MyQueryHandler dh = new MyQueryHandler();
        parser.parse(new File("./src/contact.xml"), dh);
        list = dh.getList();
        System.out.println("id\tname\tage\tsex\tphone\t\tqq\t\temail\t\t");
        for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
        }
    }
    
}
View Code

MyQueryContact.java:

package com.dom4j.contacts;

import java.util.ArrayList;

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

import com.sun.org.apache.xalan.internal.xsltc.compiler.Parser;

public class MyQueryHandler extends DefaultHandler {
    private ArrayList<Contact>list = new ArrayList<Contact>();
    private String tag;
    private Contact contact;
    public ArrayList<Contact> getList(){
        return list;
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        tag = 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("id".equals(tag)){
            contact.setId(content);
        }
        if("name".equals(tag)){
            contact.setName(content);
        }
        if("age".equals(tag)){
            contact.setAge(content);
        }
        if("sex".equals(tag)){
            contact.setSex(content);
        }
        if("qq".equals(tag)){
            contact.setQq(content);
        }
        if("phone".equals(tag)){
            contact.setPhone(content);
        }
        if("email".equals(tag)){
            contact.setEmail(content);
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        tag = null;
        if("contact".equals(qName)){
            list.add(contact);
        }
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM