您的位置:首页 > 其它

SAX解析XML文件

2016-04-07 11:14 288 查看
SAX(Simple API for XML),是指一种接口,或者一个软件包。
SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。
由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。

SAX解析xml文件,将解析出来的结果放到一个bean中,再将所有的baen放到list列表中

例子程序的xml文件为:

[css] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>

<书架>

<书>

<书名>海的女儿</书名>

<作者>安徒生</作者>

<售价>50.0元</售价>

</书>

<书>

<书名>卖火柴的小女孩</书名>

<作者>安徒生</作者>

<售价>28.0元</售价>

</书>

</书架>

需要一个book类,存放书的具体信息(书名,作者,售价)为:

[java] view
plain copy

package com.flower.parsexml;

public class Book {

private String name;

private String author;

private String price;

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 getPrice() {

return price;

}

public void setPrice(String price) {

this.price = price;

}

}

下面开始解析,代码如下:

[java] view
plain copy

package com.flower.parsexml;

import java.io.IOException;

import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

public class SAXparse {

@SuppressWarnings("unchecked")

public static void main(String[] args) throws ParserConfigurationException,

SAXException, IOException {

// 创建解析工厂

SAXParserFactory factory = SAXParserFactory.newInstance();

// 创建解析器

SAXParser parser = factory.newSAXParser();

// 得到读取器

XMLReader reader = parser.getXMLReader();

// 设置内容处理器

BeanListHandler handler = new BeanListHandler();

reader.setContentHandler(handler);

// 读取xml文档

reader.parse("src/books.xml");

ArrayList list = handler.getBooks();

Book book;

for(int i = 0; i < list.size(); i++) {

book = new Book();

book = (Book) list.get(i);

System.out.println(book.getName() + book.getAuthor() + book.getPrice());

}

}

}

class BeanListHandler extends DefaultHandler {

//将读取的内容存放到一个book对象中,存放到list集合中

ArrayList<Book> list = new ArrayList<Book>();

private String currentTag;

private Book book;

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

currentTag = qName;

if("书".equals(currentTag)) {

book = new Book();

}

}

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

if("书名".equals(currentTag)) {

String name = new String(ch,start,length);

book.setName(name);

}

if("作者".equals(currentTag)) {

String author = new String(ch,start,length);

book.setAuthor(author);

}

if("售价".equals(currentTag)) {

String price = new String(ch,start,length);

book.setPrice(price);

}

}

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

if("书".equals(qName)) {

list.add(book);

book = null;

}

currentTag = null;

}

public ArrayList<Book> getBooks() {

return list;

}

}

运行结果为:

[java] view
plain copy

海的女儿安徒生50.0元

卖火柴的小女孩安徒生28.0元
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: