XML文档解析之SAX解析

来源:互联网 发布:js正则查找字符串 编辑:程序博客网 时间:2024/06/03 16:44

解析步骤

Java SAX解析是按照xml文件的顺序一步一步的来解析。步骤如下:
1. 创建SAXParserFactory实例factory;
2. 通过factory获取SAXParser实例;
3. 创建一个继承DefaultHandler类的解析类,重写其中的方法进行业务处理并创建这个类的实例;
4. 将xml文件和解析类实例对象传给SAXParser的parse方法进行解析。

DefaultHandler覆写的方法说明

方法 说明 public void startDocument() 当读入时,此方法会被调用 public void endDocument() 当xml文件解析完成后,此方法会被调用 public void startElement(String uri, String localName, String qName, Attributes attributes) 当读入开始标签时,此方法会被调用 public void endElement(String uri, String localName, String qName) 当读入结束标签时,此方法会被调用 public void characters(char[] ch, int start, int length) 当读到textNode节点时,此方法会被调用,用于获取element节点下的文本信息

textNode节点:如下图蓝色的空白部分、冰与火之歌等属于textNode,所以在使charaters()textNode.
这里写图片描述

待解析xml文件,

<?xml version="1.0" encoding="UTF-8" ?><bookstore>    <book id = "1">        <name>冰与火之歌</name>        <author>乔治马丁</author>        <year>2014</year>        <price>89</price>    </book>    <book id = "2">        <name>安徒生童话</name>        <year>2004</year>        <price>77</price>        <language>English</language>    </book></bookstore>

book结构

package XML;/** * Created by lin_y on 2017/6/18. */public class Book {    private String id;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    private String name;    private String author;    private String year;    private double price;    private String language;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }    public String getYear() {        return year;    }    public void setYear(String year) {        this.year = year;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public String getLanguage() {        return language;    }    public void setLanguage(String language) {        this.language = language;    }    @Override    public String toString() {        return "Book{" +                "id='" + id + '\'' +                ", name='" + name + '\'' +                ", author='" + author + '\'' +                ", year='" + year + '\'' +                ", price=" + price +                ", language='" + language + '\'' +                '}';    }}

解析代码

SAXParserHandler类

package XML;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import java.util.ArrayList;import java.util.List;/** * Created by lin_y on 2017/6/18. */public class SAXParserHandler extends DefaultHandler {    public String value;    public Book book = null;    public List<Book> list = new ArrayList<Book>();    @Override    // 标识解析开始    public void startDocument() throws SAXException {        super.startDocument();        System.out.println("解析开始");    }    @Override    // 标识解析结束    public void endDocument() throws SAXException {        super.endDocument();        System.out.println("解析结束");    }    @Override    // 遍历XML文件开始标签    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        super.startElement(uri, localName, qName, attributes);        if(qName.equals("book")){            book = new Book();            // book标签下属性的个数            int len = attributes.getLength();            for(int i = 0; i < len; i ++){                // 获取属性名                String attrName = attributes.getQName(i);                // 获取属性值                String attrValue = attributes.getValue(i);                if(attrName.equals("id")){                    book.setId(attrValue);                }            }        }    }    @Override    // 遍历XML文件结束标签    public void endElement(String uri, String localName, String qName) throws SAXException {        super.endElement(uri, localName, qName);        if(!qName.equals("book")){            switch(qName){                case "name":                    book.setName(value);                    break;                case "author":                    book.setAuthor(value);                    break;                case "year":                    book.setYear(value);                    break;                case "price":                    book.setPrice(Double.parseDouble(value));                    break;                case "language":                    book.setLanguage(value);                    break;            }        }else{            list.add(book);        }    }    @Override    // 获取对应属性名的属性值    public void characters(char[] ch, int start, int length) throws SAXException {        super.characters(ch, start, length);        String temp = new String(ch, start, length);        if(!temp.trim().equals("")){            value = temp;        }    }}

主类

package XML;import org.xml.sax.SAXException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;/** * Created by lin_y on 2017/6/18. */public class XMLSAX {    public static void main(String [] args) throws Exception {        // 1. 创建SAXParserFactory实例        SAXParserFactory factory  = SAXParserFactory.newInstance();        // 2. 通过factory获取AXParser实例        SAXParser parser = factory.newSAXParser();        // 3. 创建一个类继承DefaultHandler类,重写其中的方法进行业务        // 处理并创建这个类的实例        SAXParserHandler handler = new SAXParserHandler();        parser.parse("xml/book.xml", handler);        for(Book book : handler.list){            System.out.println(book);        }    }}

程序运行结果

这里写图片描述