SAX解析XML

2012/03/10 2343点热度 0人点赞 0条评论

SAX解析允许在读取文档的时候,即时对文档进行处理。(边读边写)

DOM解析是将整个xml装载到内存得到Document对象以后,再对xml进行操作SAX解析xml文档,涉及两个部分:解析器和事件处理器SAX解析器可以使用JAXP的api创建

SAX解析器只能读取文档

解析器是一个一个标签去读取,每读取一个组成部分都会去调用事件处理器中的方法去操作读取到得内容

解析器会把解析到得当前内容当成方法参数传给事件处理器

 使用SAX方式解析的步骤:     

a、使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf=SAXParserFactory.newInstance();

 b、通过SAX解析工厂得到解析对象

SAXParser sp=spf.newSAXParser();

c、通过解析对象得到一个XML的读取器      

XMLReader xmlReader=sp.getXMLReader();

d、设置读取器的事件处理器  

xmlReader.setContentHandler(new MyContentHandler());

e、解析xml文件

xmlReader.parse("xml文档");

 事件处理器写法: 

//事件处理器要实现ContentHandler接口
    public class MyContentHandler implements ContentHandler{
        /**读到开始元素时执行该方
          * uri--名称空间uri,如果元素没有名称空间uri,或者未执行名称空间处理,则为空字符串
          * localName--本地名称
          * qName限定的XML名称
          */
          @Override
        public void startElement(String uri, String localName, String qName,
                Attributes atts) throws SAXException {
            System.out.println("当前读到了开始元素:"+qName);
        }
        //读到元素中的字符数据时执行该方法
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            System.out.println("当前读到的文本内容:"+new String(ch,start,length));

        }
        //读到元素结束时执行该方法
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            System.out.println("当前读到的结束元素:"+qName);
        }
        .............................等等其他接口中的方法
    }

由于要实现ContentHandler接口中的所有方法,所以一般都是继承DefaultHandler类, 这个类已经实现了ContentHandler接口,所以只要重写其中的常用的三个方法就行

 

public class myHandler extends DefaultHandler{
         //读到开始元素时执行该方法
            @Override
            public void startElement(String uri, String localName, String qName,
                    Attributes atts) throws SAXException {
                System.out.println("当前读到了开始元素:"+qName);
            }
            //读到元素中的字符数据时执行该方法
            @Override
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                System.out.println("当前读到的文本内容:"+new String(ch,start,length));

            }
            //读到元素结束时执行该方法
            @Override
            public void endElement(String uri, String localName, String qName)
                    throws SAXException {
                System.out.println("当前读到的结束元素:"+qName);
            }

   }

 案例:使用SAX读取xml数据,将第二本书的批发价读取出来

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <书架>
        <书 出版社="yxkong">
            <书名>java技术博客</书名>
            <作者>鱼翔空</作者>
            <售价>40.00元</售价>
            <批发价>28.00元</批发价>
        </书>
        <书 出版社="java">
            <书名>专注于java技术</书名>
            <作者>yxkong</作者>
            <售价>28.00元</售价>
            <批发价>18.00元</批发价>
        </书>
     </书架>

java代码实现

  SAXReader sr=SAXReaderFactory.newInstance().newSAXReader();
  XMLReader xr=sr.getXMLReader();
  xr.getContentReader(new DefaulHandler());
  xr.parse("xml文件路径");

 class myHandler extends DefaultHandler{
     int index=0;
     String strElment;
        //读到开始元素时执行该方法
     @Override
     public void startElement(String uri, String localName, String qName,
             Attributes atts) throws SAXException {
         //System.out.println("当前读到了开始元素:"+qName);
         strElment=qName;
     }
     //读到元素中的字符数据时执行该方法
     @Override
     public void characters(char[] ch, int start, int length)
             throws SAXException {
         if(index==1&&"批发价".equals(strElment))
             System.out.println("当前读到的文本内容:"+new String(ch,start,length));

     }
     //读到元素结束时执行该方法
     @Override
     public void endElement(String uri, String localName, String qName)
             throws SAXException {
         //System.out.println("当前读到的结束元素:"+qName);
         if(qName.equals("批发价")){
            index++;
            strElment="";
         }
     }

}

 

yxkong

这个人很懒,什么都没留下

文章评论