xml文件:
<?xml version="1.0" encoding="UTF-8"?> <books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点--> <book id="book1" w="wwwww"> <name><a>AAAAAA</a>bookName1</name> <price>10.0</price> </book> <book id="book2"> <name>bookName2</name> <author>bookAuthor2</author> </book> </books>
测试类:
package com.zhang.xml.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/*
* sax解析是逐行扫描文档,一边扫描一边解析。
* 需要创建一个org.xml.sax.helpers.DefaultHandler的继承类
*/
public class SaxParse {
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxParser handler = new SaxParser();
parser.parse("books.xml", handler);
System.out.println(handler.getBooks());
}
}org.xml.sax.helpers.DefaultHandler的子类
package com.zhang.xml.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;
import com.zhang.xml.bean.Book;
public class SaxParser extends DefaultHandler {
private int index = 0;
private List<Book> books = new ArrayList<Book>();
private Book book = null;
private String value = null;
public List<Book> getBooks() {
return books;
}
/**
* 用来标识解析开始
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("----------开始解析文档----------");
}
/**
* 用来标识解析结束
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("----------结束文档解析----------");
}
/**
* 解析一个xml元素
* 每遇到一个元素的开始标签就调用一次该方法
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if("book".equals(qName)){
index++;
System.out.println("---开始解析第" + index + "个book标签---");
book = new Book();
int size = attributes.getLength();
for(int i=0; i<size; i++) {
System.out.print("第" + (i + 1) + "个属性名: " + attributes.getQName(i));
System.out.println("-->属性值:" + attributes.getValue(i));
if("id".equals(attributes.getQName(i))) {
book.setId(attributes.getValue(i));
}
}
} else {
System.out.println("遇到" + qName + "开始标签");
}
}
/**
* 结束一个解析xml元素
* 每遇到一个元素的结束标签就调用一次该方法
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if("book".equals(qName)){
System.out.println("---结束解析第" + index + "个book标签---");
books.add(book);
book = null;
} else if("name".equals(qName)) {
book.setName(value);
} else if("price".equals(qName)) {
book.setPrice(value);
} else if("author".equals(qName)) {
book.setAuthor(value);
} else {
System.out.println("遇到" + qName + "结束标签");
}
}
/*
* ch中存放着xml文档中所有的元素的值,每遇到一个元素的值,就调用一次该方法
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
if (!value.trim().equals("")) { // 排除空白位置
System.out.println("-->value值:" + value);
}
}
}结果:
----------开始解析文档---------- 遇到books开始标签 ---开始解析第1个book标签--- 第1个属性名: id-->属性值:book1 第2个属性名: w-->属性值:wwwww 遇到name开始标签 遇到a开始标签 -->value值:AAAAAA 遇到a结束标签 -->value值:bookName1 遇到price开始标签 -->value值:10.0 ---结束解析第1个book标签--- ---开始解析第2个book标签--- 第1个属性名: id-->属性值:book2 遇到name开始标签 -->value值:bookName2 遇到author开始标签 -->value值:bookAuthor2 ---结束解析第2个book标签--- 遇到books结束标签 ----------结束文档解析---------- [Book [id=book1, name=bookName1, price=10.0, author=null], Book [id=book2, name=bookName2, price=null, author=bookAuthor2]]
本文出自 “theYllwRvrNo98” 博客,请务必保留此出处http://yellowriver.blog.51cto.com/8753974/1673948
原文:http://yellowriver.blog.51cto.com/8753974/1673948