Sax解析XMl

蓝咒 提交于 2019-12-23 15:54:05

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();
    }
    
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!