xml学习笔记(5)sax解析

xml学习笔记(5)sax解析

1.sax解析方式.
    SAX(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。
    允许在读取文档的时候,即对文档进行处理,而不必等到整个文档加载完才对文档进行操作。
    优点: 占用内存少,解析速度快,
    缺点: 只适合文档的读取,不适合文档的增删改。

2.sax解析过程分析.
    sax采用事件处理的方式解析xml文件,利用sax解析xml文档,涉及两个部分:解析器和事件处理器.
    ·解析器可以使用jaxp的API创建,创建出sax解析器后,就可以指定解析器去解析某个xml文档.
    ·解析器采用sax方式在解析某个xml文档时,它只要解析到xml文档的一个组成部分,都会去调用事件处理器的一个方法.
    ·解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器.
    ·事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理.
    Jaxp开发包是JAVASE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。
    在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到xml文档的DOM或SAX的解析器,从而实现对xml文档的解析。
    sax解析图:
    SAXParser Factory                   Content Handler
    SAXParser                           Error Handler
    XML               --> SAX Reader    DTD Handler
                                        Entity Resolver
    常用事件:ContentHandler.
    常用方法:startElement、endElement、characters.

3.sax解析案例:得到xml文档所有内容.
public class demo1{
   public static void main(String[] args){
      //1.创建解析工厂
      SAXParserFactory factory = SAXParserFactory.newInstance();
      //2.得到解析器
      SAXParser sp = factory.newSAXParser();
      //3.得到读取器
      XMLReader reader = sp.getXMLReader();
      //4.设置内容处理器
      reader.setContentHandler(new ListHandler());
      //5.读取xml文档内容
      reader.parse("src/book.xml");
   }
}
//得到xml文档所有内容.
class ListHandler implements ContentHandler{
   public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException{
      System.out.println("<" + name + ">");
      for(int i=0; atts!=null && i<atts.getLength(); i++){
         String attName = atts.getQName(i);
         String attValue = atts.getValue(i);
         System.out.println(attName + "=" + attValue);
      }
   }
   public void characters(char[] ch, int start, int length) throws SAXException{
      System.out.println(new String(ch,start,length));
   }
   public void endElement(String uri, String localName, String name) throws SAXException{

      System.out.println("<" + name + ">");
   }
   public void endDocument() throws SAXException{
      //
   }
}

4.sax解析案例:得到指定标签的值.
public class demo2{
   public static void main(String[] args){
      //1.创建解析工厂
      SAXParserFactory factory = SAXParserFactory.newInstance();
      //2.得到解析器
      SAXParser sp = factory.newSAXParser();
      //3.得到读取器
      XMLReader reader = sp.getXMLReader();
      //4.设置内容处理器
      reader.setContentHandler(new TagValueHandler());
      //5.读取xml文档内容
      reader.parse("src/book.xml");
   }
}
//得到指定标签的值
class TagValueHandler extends DefaultHandler{
   private String currentTag;  //当前标签
   private int needNumber = 1; //想获取第几个作者标签的值
   private int currentNumber;  //当前解析到的是第几个

   @Override
   public void startElement(String uri, String localName, String name, Attributer attributers) throws SAXException{
      currentTag = name;
      if(currentTag.equals("作者")){
         currentNumber++;
      }
   }

   @Override
   public void characters(char[] ch, int start, int length) throws SAXException{
      if("作者".equals(currentTag) && currentNumber == needNumber){
         System.out.println(new String(ch,start,length));
      }
   }

   @Override
   public void endElement(String uri, String localName, String name) throws SAXException{
      currentTag = null;
   }
}

5.sax解析案例:
public class demo3{
   public static void main(String[] args){
      //1.创建解析工厂
      SAXParserFactory factory = SAXParserFactory.newInstance();
      //2.得到解析器
      SAXParser sp = factory.newSAXParser();
      //3.得到读取器
      XMLReader reader = sp.getXMLReader();
      //4.设置内容处理器
      BeanListHandler handle = new BeanListHandler();
      reader.setContentHandler(handle);
      //5.读取xml文档内容
      reader.parse("src/book.xml");

      List<Book> list = handle.getBooks();
      System.out.println(list);
   }
}
//把xml文档中的每一本书的信息封装到一个book对象,并把多个book对象放在一个list集合中返回
class BeanListHandler extends DefaultHandler{
   private List list = new ArrayList();
   private String currentTag;
   private Book book;

   @Override
   public void startElement(String uri, String localName, String name, Attributer attributers) throws SAXException{
      currentTag = name;
      if("书".equals(currentTag)){
         book = new Book();
      }
   }

   @Override
   public void characters(char[] ch, int start, int length) throws SAXException{
      if("书名".equals(currentTag)){
         String name = new String(ch,start,length);
         book.setName(name);
      }
      if("作者".equals(currentTag)){
         String author = new String(ch,start,length);
         book.setAuthor(author);
      }
      if("售价".equals(currentTag)){
         String price = new String(ch,start,length);
         book.setPrice(price);
      }
   }

   @Override
   public void endElement(String uri, String localName, String name) throws SAXException{
      if(name.equals("书")){
         list.add(book);
         book = null;
      }
      currentTag = null;
   }

   public List getBooks(){
      return list;
   }
}

public class book{
   private String name;
   private String author;
   private String price;
   public String getName(){
      return name;
   }
   public String setName(String name){
      this.name = name;
   }
   public String getAuthor(){
      return author;
   }
   public String setAuthor(String author){
      this.author = author;
   }

   public String getPrice(){
      return price;
   }
   public String setPrice(String price){
      this.price = price;
   }
}

 

你可能感兴趣的:(xml学习笔记(5)sax解析)