</pre><p><span style="font-size:14px;">xml文件为myClass.xml:</span></p><p><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="001">
<title>张三传记</title>
<author>张三</author>
</book>
<book id="002">
<title>李四传记</title>
<author>李四</author>
</book>
</books>
这个类主要就是重写了DefaultHandler类的方法。然后getList和getReader方法就是便于测试的。package cn.spy.reader;
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;
import cn.spy.po.Book;
public class SaxReader extends DefaultHandler{
ArrayList<Book> list=new ArrayList<Book>();
private String currentTag;
private Book book;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("title".equals(currentTag)){
String title=new String(ch,start,length);
book.setTitle(title);
}
if("author".equals(currentTag)){
String author=new String(ch,start,length);
book.setAuthor(author);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("book".equals(qName)){
list.add(book);
book=null;
}
currentTag=null;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag=qName;
if("book".equals(currentTag)){
book=new Book();
}
}
public ArrayList<Book> getList(){
return list;
}
public XMLReader getReader() throws ParserConfigurationException, SAXException {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader reader=parser.getXMLReader();
return reader;
}
}
测试类:
public class SaxTest {
public static void main(String[] args) throws Exception{
SaxReader saxReader=new SaxReader();
XMLReader reader=saxReader.getReader();
reader.setContentHandler(saxReader);
reader.parse("src/myClass.xml");
ArrayList<Book> arrayList=saxReader.getList();
for(Book book:arrayList){
System.out.println(book.getTitle()+":"+book.getAuthor());
}
}
}
测试结果:
张三传记:张三
李四传记:李四
API:
startElement:
- 接收元素开始的通知。
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件).
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件).
uri
- 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。localName
- 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。qName
- 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。attributes
- 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
endElement:
接收元素结束的通知。
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。
uri
- 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName
- 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName
- 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
characters:
- 接收元素中字符数据的通知。
默认情况下,不执行任何操作。应用程序编写者可以重写此方法,以便对每块字符数据采取特定的措施(如将该数据添加到节点或缓冲区,或者将该数据打印到文件)。
ch
- 字符。start
- 字符数组中的开始位置。length
- 从字符数组中使用的字符数。
默认情况下,不执行任何操作。应用程序编写者可以重写此方法,以便对每块字符数据采取特定的措施(如将该数据添加到节点或缓冲区,或者将该数据打印到文件)。
ch
- 字符。start
- 字符数组中的开始位置。length
- 从字符数组中使用的字符数。