sax和传统的Dom操作XML相比较更加灵活,不会因为XML文件过大占用太多内存,他是随时去扫面XML内容,根据用户设置的节点获取属性值或者节点值
每个处理XML的Class都要继承DefaultHandler
重写五个个方法 文档、节点的开始和结束都是出发相应的方法,获取所需数据和操作 当访问到节点数据值时会执行characters
方法 获取值
- startDocument()方法只会在文档开始解析的时候被调用,每次解析只会调用一次。
- startElement()方法每次在开始解析一个元素,即遇到元素标签开始的时候都会调用。
- characters()方法也是在每次解析到元素标签携带的内容时都会调用,即使该元素标签的内容为空或换行。而且如果元素内嵌套元素,在父元素结束标签前, characters()方法会再次被调用,此处需要注意。
- endElement()方法每次在结束解析一个元素,即遇到元素标签结束的时候都会调用。
- endDocument() startDocument()方法只会在文档解析结束的时候被调用,每次解析只会调用一次
XMl文件如下
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="12">
<name>thinking in java</name>
<price>85.5</price>
</book>
<book id="15">
<name>Spring in Action</name>
<price>39.0</price>
</book>
</books>
MyHandler 代码如下
package com.steben;
import java.util.ArrayList;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
public class MyHandler extends DefaultHandler {
private ArrayList<Book> bookList;
private String tabNameString;
private Book books;
/*
public MyHandler(String tabNameString){
this.tabNameString=tabNameString;
}
*/
public ArrayList<Book> getBooks(){
return bookList;
}
@Override
public void startDocument(){
this.bookList=new ArrayList<Book>();
}
@Override
public void startElement(String url,String localName,String qName,Attributes attributes){
this.tabNameString=qName;
if(tabNameString.equals("book")){
books=new Book();
books.setId(Integer.parseInt(attributes.getValue(0)));
}
//System.out.println(qName);
}
@Override
public void characters(char[] ch, int start, int length) throws org.xml.sax.SAXException {
if(tabNameString!=null){
String dataString=new String(ch,start,length);
if(tabNameString.equals("name")){
books.setName(dataString);
}else if(tabNameString.equals("price")){
books.setPrice(Double.parseDouble(dataString));
}
}
}
@Override
public void endElement(String uri,String localName,String qName){
if(qName.equals("book")){
bookList.add(books);
}
tabNameString=null;
//System.out.println(qName);
}
}
Book实体类
package com.steben;
public class Book {
private int id;
private String name;
private double price;
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public double getPrice(){
return price;
}
public void setPrice(double price){
this.price=price;
}
}
程序入口
package com.steben;
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.SAXException;
public class SaxXml {
public static void main(String[] args) {
try {
ArrayList<Book> bookList=ReadXml("c://ee.xml");
for (Book book : bookList) {
System.out.print(book.getId()+"/"+book.getName()+"/"+book.getPrice());
}
} catch (Exception e) {
System.out.print(e.getMessage());
}
//System.out.print("Steben");
}
public static ArrayList<Book> ReadXml(String Url) {
MyHandler myHandler=new MyHandler();
try {
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
SAXParser saxParser=saxParserFactory.newSAXParser();
saxParser.parse(Url, myHandler);
} catch (Exception e) {
// TODO: handle exception
System.out.print(e);
}
return myHandler.getBooks();
}
}
来源:https://www.cnblogs.com/steben/p/3959501.html