1:SAX方法解析:(SAX是边扫描边解析,自顶而下依次解析。)
1):通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
2):通过SAXParserFactory实例的newInstace()方法返回SAXParser实例parser
3):创建一个类继承DefaultHandler,重写其中的一些方法进行业务处理并创建这个类的实例handler
public class SAXParserHandler extends DefaultHandler{
/**
* 用来标志解析开始
*/
@Override
public void startDocument ()throws SAXException{
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来遍历xml文件的开始标签
* uri:xml文档的命名空间
* localName:标签的名字
* qName:带命名空间的标签的名字
* attributes:标签的属性集
*/
@Override
public void startElement (String uri, String localName,String qName, Attributes attributes)throws SAXException
{
super.startElement(uri, localName, qName, attributes);
}
/**
* 用来遍历xml文件的结束标签
* @throws SAXException
*/
/**
* 解析标签内容的时候调用
*/
@Override
public void characters(char[] ch,int start,int length) throws SAXException{
super.characters(ch, start, length);
}
@Override
public void endElement (String uri, String localName, String qName)throws SAXException
{
super.endElement(uri, localName, qName);
}
/**
* 用来标志解析结束
*/
@Override
public void endDocument() throws SAXException{
super.endDocument();
System.out.println("SAX解析结束");
}
}
完成代码加注释:
1):xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>c</name>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>数据结构</name>
<year>2004</year>
<price>89</price>
<language>English</language>
</book>
</bookstore>
2):实体类
package com.xml.enty;
public class Book {
private String id;
private String name;
private String year;
private String author;
private String language;
private String price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
3):Handler类:
public class SAXParserHandler extends DefaultHandler{
//定义全局变量bookIndex用来标记是第几本书
int bookIndex=0;
String value=null;
Book book=null;
private ArrayList<Book> booklist=new ArrayList<Book>();
public ArrayList<Book> getBooklist() {
return booklist;
}
public void setBooklist(ArrayList<Book> booklist) {
this.booklist = booklist;
}
/**
* 用来标志解析开始
*/
@Override
public void startDocument ()throws SAXException{
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来遍历xml文件的开始标签
* uri:xml文档的命名空间
* localName:标签的名字
* qName:带命名空间的标签的名字
* attributes:标签的属性集
*/
@Override
public void startElement (String uri, String localName,String qName, Attributes attributes)throws SAXException
{
super.startElement(uri, localName, qName, attributes);
/* 已知book元素下的属性,根据属性名称来获取值
if(qName.equals("book")){
String value=attributes.getValue("id");
System.out.println("book的属性值是"+value);
}*/
//开始遍历book节点
//如果不知道book元素下属性的名称以及个数
if(qName.equals("book")){
//创建一个book对象
book=new Book();
bookIndex++;
System.out.println("----开始遍历第"+bookIndex+"本书");
int num=attributes.getLength();
for(int i=0;i<num;i++){
System.out.print("book元素的第"+(i+1)+"个属性名为:"+attributes.getQName(i));
System.out.println("--->属性值为:"+attributes.getValue(i));
if(attributes.getQName(i).equals("id")){
book.setId(attributes.getValue(i));
}
}
}
//遍历子结点
else if(!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print("节点名为:"+qName);
}
}
/**
* 用来遍历xml文件的结束标签
* @throws SAXException
*/
/**
* 解析标签内容的时候调用
* ch:节点中的所有内容
*
*/
@Override
public void characters(char[] ch,int start,int length) throws SAXException{
super.characters(ch, start, length);
value=new String(ch,start,length);
//用trime方法来判断内容是否是空
if(!value.trim().equals("")){
System.out.println("-->节点值为:"+value);
}
}
@Override
public void endElement (String uri, String localName, String qName)throws SAXException
{
//调用DefaultHandler类的endElement方法
super.endElement(uri, localName, qName);
//判断是否针对一本书已经遍历结束
if(qName.equals("book")){
//加入到BookList中去
booklist.add(book);
//清空book,准备存储下一本书的信息
book=null;
System.out.println("------结束遍历第"+bookIndex+"本书");
}else if(qName.equals("name")){
book.setName(value);
}else if(qName.equals("year")){
book.setYear(value);
}else if(qName.equals("author")){
book.setAuthor(value);
}else if(qName.equals("price")){
book.setPrice(value);
}else if(qName.equals("language")){
book.setLanguage(value);
}
}
/**
* 用来标志解析结束
*/
@Override
public void endDocument() throws SAXException{
super.endDocument();
System.out.println("SAX解析结束");
}
}
4): 测试类:
public class SAXTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
//通过factory获取SAXParser实例
SAXParser parser=factory.newSAXParser();
//创建SAXParserHandler对象
SAXParserHandler handle=new SAXParserHandler();
parser.parse("books.xml",handle);
for(Book book:handle.getBooklist()){
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getYear());
System.out.println(book.getPrice());
System.out.println(book.getLanguage());
System.out.println("---finish");
}
} 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解析的优缺点:
-优点:
1):采取事件驱动,对内存耗费比较小
扫描二维码关注公众号,回复:
2249389 查看本文章
2):适用于只需要处理xml中数据时
-缺点:
1):不易解析
2):很难同时访问同一个xml中的多处不同数据