dom解析方式把整个xml文档都加载入内存,当xml文件很大时就耗费了很多资源,sax解析就很好的解决了这一问题
sax一行行的解析,不会占用过多资源,但这也造成了编程上的一些困难,由于他一行行的解析使他失去了整体性,不
能体现出xml的层级关系,对xml文件的操作就造成了一定的困难,这里提供了一中解决方案:
首先我们需要一个xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>JavaOOP</书名>
<作者>三</作者>
<售价>40.00元</售价>
<批发价>10</批发价>
</书>
<书>
<书名>JavaScript</书名>
<作者>王四</作者>
<售价>90</售价>
</书>
</书架>
接着建一个JavaBean:
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;
}
@Override
public String toString() {
return "Book [author=" + author + ", name=" + name + ", price=" + price
+ "]";
}
}
下面实现sax编程解析
public class SaxDemo3 {
public static void main(String[] args) throws Exception {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = parser.getXMLReader();
MyContentHanlder3 mch = new MyContentHanlder3();
reader.setContentHandler(mch);
reader.parse("src/book.xml");
List<Book> books = mch.getBooks();
for(Book b:books){
System.out.println(b);
}
}
}
class MyContentHanlder3 extends DefaultHandler{
private List<Book> books = new ArrayList<Book>();
String currentTagName = "";//记录当前读到的元素名称
Book book = null;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTagName = qName;//书架 书 书名 “” 作者 “”
if("书".equals(qName)){
book = new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(currentTagName)){
book.setName(new String(ch,start,length));
}
if("作者".equals(currentTagName)){
book.setAuthor(new String(ch,start,length));
}
if("售价".equals(currentTagName)){
book.setPrice(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("书".equals(qName)){
books.add(book);
}
currentTagName="";
}
public List<Book> getBooks() {
return books;
}
}