1.创建事件处理程序(编写ContentHandler的实现类,一般集成自DefaultHandler类, 采用 adapter 模式)
2.创建SAX解析器
3.将事件处理程序分配到解析器
4.对文档进行解析,将每个事件发送给事件处理程序
XMl文档
1 <?xml version = "1.0" encoding = "UTF-8"?> 2 <books> 3 <book bookno="001"> 4 <title> java 编程</title> 5 <author> me </author> 6 <price> 80 </price> 7 </book> 8 <book bookno="002"> 9 <title> android 编程</title> 10 <author> me </author> 11 <price> 70 </price> 12 </book> 13 </books>
Book基类
1 public class Book { 2 private String no; 3 private String title; 4 private String author; 5 private Double price; 6 7 public String getNo() { 8 return no; 9 } 10 11 public void setNo(String no) { 12 this.no = no; 13 } 14 15 public String getTitle() { 16 return title; 17 } 18 19 public void setTitle(String title) { 20 this.title = title; 21 } 22 23 public String getAuthor() { 24 return author; 25 } 26 27 public void setAuthor(String author) { 28 this.author = author; 29 } 30 31 public Double getPrice() { 32 return price; 33 } 34 35 public void setPrice(double d) { 36 this.price = d; 37 } 38 39 @Override 40 public String toString() { 41 return "book [no=" + no + ", title=" + title + ", author=" + author + ", price=" + price + "]"; 42 } 43 44 public Book() { 45 super(); 46 // TODO Auto-generated constructor stub 47 } 48 49 public Book(String no, String title, String author, Double price) { 50 super(); 51 this.no = no; 52 this.title = title; 53 this.author = author; 54 this.price = price; 55 } 56 57 }
XMLParser接口
1 import java.util.List; 2 3 public interface XMLParser { 4 public List<Book> parseXML(String filename); 5 6 }
SaxHandler处理程序
1 /* 2 * 3 * 提供事件回调方法 4 * */ 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.xml.sax.Attributes; 9 import org.xml.sax.SAXException; 10 import org.xml.sax.helpers.DefaultHandler; 11 12 public class MySaxHandler extends DefaultHandler { 13 private String tag; 14 private Book book; 15 private List<Book> list; 16 17 public List<Book> getList() { 18 return list; 19 } 20 21 @Override 22 public void characters(char[] ch, int start, int length) throws SAXException { 23 super.characters(ch, start, length); 24 if (tag != null) { 25 String str = new String(ch, start, length).trim(); 26 if (tag.equals("title")) { 27 book.setTitle(str); 28 } 29 if (tag.equals("author")) { 30 book.setAuthor(str); 31 } 32 if (tag.equals("price")) { 33 book.setPrice(Double.parseDouble(str)); 34 } 35 36 } 37 } 38 39 @Override 40 public void endDocument() throws SAXException { 41 super.endDocument(); 42 } 43 44 @Override 45 public void endElement(String uri, String localName, String qName) throws SAXException { 46 super.endElement(uri, localName, qName); 47 if (qName.equals("book")) { 48 list.add(book); 49 book = null; 50 } 51 tag = null; 52 } 53 54 @Override 55 public void startDocument() throws SAXException { 56 super.startDocument(); 57 list = new ArrayList<Book>(); 58 } 59 60 @Override 61 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 62 63 super.startElement(uri, localName, qName, attributes); 64 if (qName.equals("book")) { 65 book = new Book(); 66 String no = attributes.getValue("bookno"); 67 book.setNo(no); 68 69 } 70 tag = qName; 71 } 72 73 }
SaxParser 解析器
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SaxParser implements XMLParser {
@Override
public List<Book> parseXML(String filename) {
List<Book> list = new ArrayList<Book>();
MySaxHandler handler = null;
//XML解析器
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
// xml解析器
SAXParser parser = factory.newSAXParser();
//文件输入流
InputStream is = new FileInputStream(filename);
//处理程序
handler = new MySaxHandler();
//分配处理程序到解析器
parser.parse(is, handler);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//提取在处理程序中得到的容器
list = handler.getList();
return list;
}
public static void main(String[] args) {
XMLParser parser = new SaxParser();
List<Book> list = parser.parseXML("src\book.xml");
System.out.println("SAX解析结果:");
for (Book book : list) {
System.out.println(book.toString());
}
}
}