解析步骤
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);
}
}
}