sax方式解析xml 文档跟dom最大的区别是,sax是基于读取到xml文档不同节点的产生不同的事件,然后回调Saxparse处理器里面的不同方法对节点进行不同处理。所以sax是基于事件触发机制的解析方式。
dom解析呢是根据xml文档建立dom节点树,然后对树里面的节点遍历从而对xml文档解析的
package sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//定义一个自定义sax处理器,用于读取到element节点时回调其中的方法。
ublic class Saxparse extends DefaultHandler {
// 定义一个存放元素的list
private List<Book> data;
// 用于缓存当前标签名称
private String elementName;
public List<Book> getData() {
return data;
}
/**
* 当遇到节点前半部分时候,如<price>触发这个方法
*
* /** * xml如果没有约束 uri # null localname #null qName # 元素名称 * xml 约束 uri #
* 命名空间值 targatNamespace="xxxxx" localname # 元素名称
* <table>
* qName # 前缀:名称 <my:table>
*
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if ("book".equals(qName)) {
// 说明解析到了一本新书
Book book = new Book();
data.add(book);// 添加到list中
book.setId(attributes.getValue("id")); // 获取book的属性
// 缓存当前标签名称
}
this.elementName = qName;
}
/**
* 遇到如下字符串触发这个函数 <?xml version="1.0" encoding="UTF-8"?>
*
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("解析文档开始");
data = new ArrayList<>();
}
/**
* 遇到一个节点的后半部,如</price>
*
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("元素结束" + "\tqName=" + qName + "\t localName=" + null);
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文档结束");
}
/**
* 取每个节点下的文本串,如下面的100 <price> 100 </price>
*
* @param ch
* @param start
* @param length
* @throws org.xml.sax.SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws org.xml.sax.SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String value = new String(ch, start, length);
if ("title".equals(elementName)) {
// value 表示title的数据
data.get(data.size() - 1).setTitle(value);
}
if ("price".equals(elementName)) {
// value 表示price的数据
data.get(data.size() - 1).setPrice(value);
}
if ("author".equals(elementName)) {
data.get(data.size() - 1).setAuthor(value);
}
this.elementName = null;
}
public Saxparse() {
// TODO Auto-generated constructor stub
}
}
定义一个javabean,和xml一个book节点是一致的
package sax;
public class Book {
public Book() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Book [id=" + id + ", title=" + title + ", price=" + price + ", author=" + author + "]";
}
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
private String title;
private String price;
private String author;
}
用于解析的xml文档
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="b001">
<title>android</title>
<price>28</price>
<author>vincent</author>
</book>
<book id="b002">
<title>Vincent</title>
<price>Vincent</price>
<author>Vincent</author>
</book>
<book id="b0003">
<title>Flex开发</title>
<price>98</price>
<author>胡玉勉</author>
</book>
<book id="b0003">
<title>Flex开发</title>
<price>98</price>
<author>胡玉勉</author>
</book>
<book id="b0003">
<title>Flex开发</title>
<price>98</price>
<author>胡玉勉</author>
</book>
<book id="b0003">
<title>Flex开发</title>
<price>98</price>
<author>胡玉勉</author>
</book>
</books>
测试例程
package sax.testrun;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import sax.Book;
import sax.Saxparse;
public class RunSax {
public static void main(String[] args) throws ParserConfigurationException, SAXException {
demo1();
}
private static void demo1() throws ParserConfigurationException, SAXException {
// 1、工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 2、解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
Saxparse handler = new Saxparse();
try {
saxParser.parse(new File("src/data.xml"), handler);
List<Book> books = handler.getData();
for (Book book : books) {
System.out.println(book);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
;
}
}
输出结果
解析文档开始
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=title localName=null
元素结束 qName=price localName=null
元素结束 qName=author localName=null
元素结束 qName=book localName=null
元素结束 qName=books localName=null
文档结束
Book [id=b001, title=android, price=28, author=vincent]
Book [id=b002, title=Vincent, price=Vincent, author=Vincent]
Book [id=b0003, title=Flex开发, price=98, author=胡玉勉]
Book [id=b0003, title=Flex开发, price=98, author=胡玉勉]
Book [id=b0003, title=Flex开发, price=98, author=胡玉勉]
Book [id=b0003, title=Flex开发, price=98, author=胡玉勉]