java的SAX方式解析xml时,解析类需要继承DefaultHandler类,并覆写startDocument、startElement、characters、endElement和endDocument方法。
示例如下:
package com.benny.demo.xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
/**
* TODO 这里添加描述
*
* @author xiaobing
* @version V 1.0
* @since 2014-5-21
*/
public class MyHandler extends DefaultHandler
{
private List<Book> books;
private String currentTag;
private Book book;
/**
* 构造方法
*/
public MyHandler()
{
// TODO Auto-generated constructor stub
}
public void startDocument()
{
books = new ArrayList<Book>();//初始化数据容器集合
}
public void startElement(String uri, String localName, String qName, Attributes attributes)
{
if ("book".equals(qName))//根据qName判断读到的标,并根据标签确定当前要作的操作
{
book = new Book();//初始化存储数据对象
for (int i = 0; i < attributes.getLength(); i++) //读取标签属性值
{
if ("id".equals(attributes.getQName(i)))
{
book.setId(attributes.getValue(i));
}
}
}
currentTag = qName; //记录读取到下一个标签前的标签作为当前标签
}
public void characters(char ch[], int start, int length)
{
String text = new String(ch, start, length); //此处读取到的值就是currentTag记录的标签的值
if ("name".equals(currentTag))
{
book.setName(text);
}
else if ("price".equals(currentTag))
{
book.setPrice(text);
}
}
public void endElement(String uri, String localName, String qName)
{
if ("book".equals(qName))
{
books.add(book);//添加到集合中
}
currentTag = null;
}
public void endDocument()
{
//根据情况,此方法可不覆写
}
public List<Book> getBooks()
{
return books;
}
}
解析类调用方法如下:
public static void main(String[] args)
{
File file = new File("d:\\books.xml");
MyHandler handler = new MyHandler();
try
{
InputStream is = new FileInputStream(file);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(is, handler); //此方法无返回值,调用解析后,解析结果在handler中
List<Book> books = handler.getBooks(); //从handler中取出解析后的数据
for (Book book : books)
{
System.out.println(book);
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SAXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
从解析过程可以看出,我们采用sax解析时很多时候要根据读到的标签是什么来判断该做什么,所以sax解析的前提是我们要知道xml的内容格式,每个sax方式实现的解析都是针对特定格式的xml文件的,也就是拿着一个具体的xml了,然后才能去读它。
附:
解析的xm文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book id="1001">
<name>Thinking In Java</name>
<price>80.00</price>
</book>
<book id="1002">
<name>Core Java</name>
<price>90.00</price>
</book>
<book id="1003">
<name>Hello, Andriod</name>
<price>100.00</price>
</book>
</books>