`

xml解析之1--SAX解析(转)

xml 
阅读更多

    

一、        前言

 

 

 

 

Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单APISimple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOMSun公司提供了Java API for XML ParsingJAXP)接口来使用SAXDOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。

JAXP接口包含了三个包:

(1)       org.w3c.dom  W3C推荐的用于XML标准规划文档对象模型的接口。

(2)       org.xml.sax   用于对XML进行语法分析的事件驱动的XML简单APISAX

(3)       javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。

二、        前提

 

 

 

 

DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.domorg.xml.sax javax.xml.parsers包就可以满意条件了。

三、        使用SAX解析XML文档

 

 

 

 

SAX是基于事件的简单API,同样的我们也是用一个最简单的例子来看看SAX是如何解析XML

先来看看我们要解析的XML代码吧

<?xml version="1.0" encoding="gb2312"?>

<books>
  <book email="zhoujunhui">
        <name addr="address">rjzjh</name>
       <price>jjjjjj</price>
 </book>
</books>

 

 

 

 

 

 

简单的不能再简单了。但是该有的都有了,根元素、属性、子节点。好了,能反应问题就行了,下面来看看解析这个XML文件的Java代码吧!

 public class SaxParse {

     public SaxParse(){       

     SAXParserFactory saxfac=SAXParserFactory.newInstance();

          try {

                  SAXParser saxparser=saxfac.newSAXParser();

                 InputStream is=new FileInputStream("bin/library.xml");

                  saxparser.parse(is,new MySAXHandler());

           } catch (ParserConfigurationException e) {

                 e.printStackTrace();

           } catch (SAXException e) {

                  e.printStackTrace();

           } catch (FileNotFoundException e) {

                  e.printStackTrace();

           } catch (IOException e) {

                  e.printStackTrace();

           }

    }

    public static void main(String[] args) {

           new SaxParse();

   }

  }

 这段代码比较短,因为

SAX是事件驱动的,它的大部分实现在在另一个Java文件中,先别管另一个文件,我们来一个个地分析吧!

SAX是事件驱动的,它的大部分实现在在另一个Java文件中,先别管另一个文件,我们来一个个地分析吧!

 

 

1)得到SAX解析器的工厂实例

3         SAXParserFactory saxfac=SAXParserFactory.newInstance();

这是一个javax.xml.parsers.SAXParserFactory类的实例

2)从SAX工厂实例中获得SAX解析器

5          SAXParser saxparser=saxfac.newSAXParser();

使用javax.xml.parsers.SAXParserFactory工厂的newSAXParser()方法

3)把要解析的XML文档转化为输入流,以便DOM解析器解析它

6                InputStream is=new FileInputStream("bin/library.xml");

InputStream是一个接口。

4)解析XML文档

7                 saxparser.parse(is,new MySAXHandler());

后面就不用看了,都是些没用的代码(相对而言),够简单的吧!

注意了,我们新建了一个实例new MySAXHandler()这个实例里面又有什么东西呢?

这个实例就是SAX的精华所在。我们使用SAX解析器时,必须实现内容处理器ContentHandler接口中的一些回调方法,然而我们不须要全部地实现这些方法,还好,我们有org.xml.sax.helpers.DefaultHandler类,看它的类申明:

public class DefaultHandler

implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler

实现了这么多接口啊,其它的先不管了,至少它实现了ContentHandler这一接口。

好了,看看这个类有些什么吧?下面是它的Java代码!

public class MySAXHandler extends DefaultHandler {

       boolean hasAttribute=false;

       Attributes attributes=null;

       /* (非 Javadoc)

        * @see org.xml.sax.helpers.DefaultHandler#startDocument()

        */

       public void startDocument() throws SAXException {

               System.out.println("文档开始打印了");

       }

       /* (非 Javadoc)

        * @see org.xml.sax.helpers.DefaultHandler#endDocument()

        */

       public void endDocument() throws SAXException {

              System.out.println("文档打印结束了");

       }

       /* (非 Javadoc)

        * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

        */

       public void startElement(String uri, String localName, String qName,

                     Attributes attributes) throws SAXException {

              if(qName.equals("books")){

                     return;

              }

              if(qName.equals("book")){

                     System.out.println(attributes.getQName(0)+attributes.getValue(0));

              }

              if(attributes.getLength()>0){

                     this.attributes=attributes;

                     this.hasAttribute=true;

              }

       }

       /* (非 Javadoc)

        * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)

        */

       public void endElement(String uri, String localName, String qName)

                     throws SAXException {

              if(hasAttribute&&(attributes!=null)){

                     for(int i=0;i<attributes.getLength();i++){

                            System.out.println(attributes.getQName(0)+attributes.getValue(0));

                     }

              }

       }

       /* (非 Javadoc)

        * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)

        */

       public void characters(char[] ch, int start, int length)

                     throws SAXException {

              System.out.println(new String(ch,start,length));

       }

}

 

 

不要看它一大堆,我一一分解给大家看。我们说SAX是基于事件的API,我们这个类实到了ContentHandler接口中的如下方法:

1startDocument()  用于处理文档解析开始事件

     public void startDocument() throws SAXException {

               System.out.println("文档开始打印了");

        }

2endDocument()  用于处理文档解析结束事件

      public void endDocument() throws SAXException {

              System.out.println("文档打印结束了");

        }

3startElement  用于处理元素开始事件

     public void startElement(String uri, String localName, String qName,

                     Attributes attributes) throws SAXException {

              if(qName.equals("books")){

                     return;

              }

              if(qName.equals("book")){

                     System.out.println(attributes.getQName(0)+attributes.getValue(0));

              }

              if(attributes.getLength()>0){

                     this.attributes=attributes;

                     this.hasAttribute=true;

              }

       }

第二个参数String qName表示这个元素的名字,如:

根节点  <books></books>  它的qName为“books

最底层节点 <price>jjjjjj</price> 它的qName为“price

知道这一点上面程序就好解释了,当遇到根元素“books”时就什么也不做跳过,当遇到“book”元素时就打出它的属性(它只有一个属性<book email="zhoujunhui"></book>)。

当是其它节点时(这下只剩下最底层的两个节点“name”和“price”了),就把它的属性取出来存到this.attributes域中,以后中元素结束事件好处理。

4endElement  用于处理元素结束事件

    

 

代码的作用是如果这个元素的属性不为空(hasAttribute&&(attributes!=null)),就把它们打印出来。

 

5characters(char[] ch, int start, int length) 处理元素字符的内容

       

   

 

我们只用了这么几个事件,其它还有其的的一些事件,我们只要看一下ContentHandler这个接口就行了,如:

 

6startPrefixMapping(String prefix,String URI)  处理前缀映射开始事件,参数表示前缀名称和所指向的URI

7endPrefixMapping(String prefix,String URI)  处理前缀映射结束事件,参数表示前缀名称和所指向的URI

8ignorableWhitespace(Char[] ch,int start,int length)  处理元素中可忽略的空格

9processingInstruction(String target,String data)  处理解析中产生的处理指令事件。

至此SAX解析XML文档的大概介绍完了!

分享到:
评论

相关推荐

    java解析xml数据---sax解析器

    SAX解析的基本工作原理是通过事件处理器(如ContentHandler、EntityResolver等)来接收XML文档的解析事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。当解析器遇到这些事件时,会调用相应的处理器方法...

    XML四种解析方式------DOM SAX JDOM DOM4J

    JDOM是Java特有的XML解析库,它提供了更符合Java习惯的API来操作XML。与DOM类似,JDOM也创建一个文档对象模型,但它的设计更简洁,易于使用。相比DOM,JDOM的性能稍好,因为它减少了对象创建和内存使用,但对大型XML...

    Android网络之数据解析----SAX方式解析XML数据

    1. 创建XML解析器:首先,我们需要创建一个XMLReader对象,它是SAX解析器的接口,可以通过XMLReaderFactory类来实例化。 2. 设置事件处理器:然后,我们为XMLReader对象设置一个ContentHandler,这是一个接口,包含...

    android----xml Sax解析示例

    总之,Android平台上的XML解析,特别是SAX解析,是一个重要的技能,可以帮助开发者高效地处理XML数据,节约宝贵的系统资源。通过理解和实践SAX解析,开发者能够更好地处理XML文档,为应用提供更加流畅的性能体验。

    VTD-XML 不同于SAX和DOM的XML高效解析器

    **VTD-XML解析器** VTD-XML是由XimpleWare公司开发的一种高效的XML解析技术。它与SAX和DOM相比,具有一些独特的优势: 1. **内存效率**:VTD-XML采用了一种称为VTD(Virtual Tokenized Document)的数据结构,可以...

    Sax解析XML文件解析

    1. **效率高**:SAX解析器只读取和处理当前需要的部分,不需要将整个XML文件加载到内存,尤其适合处理大型XML文档。 2. **内存消耗小**:与DOM解析器(将整个XML结构转化为内存中的树形结构)相比,SAX解析器对内存...

    XML解析之SAX解析DEMO

    本文将深入探讨XML解析中的SAX(Simple API for XML)解析方法,并结合一个具体的Android 4.0网络编程示例进行详细讲解。 SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取...

    xml解析库xerces-c-3.0.1

    2. SAX解析:SAX解析器以流式处理XML文档,当遇到元素、属性等事件时,会触发相应的回调函数。这种方式对内存使用友好,适合处理大型或无限长度的XML输入。开发者需要实现SAXParser和DefaultHandler接口来定义处理...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    sax解析xml文件

    SAX(Simple API for XML)是一种轻量级的XML解析技术,主要用于读取XML文档。相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析器的使用,并且提到了使用JDOM和JOM4J这两个Java库来处理XML。 1. **DOM解析**:DOM是一种树型结构,它将整个XML文档加载到内存中...

    xml文档解析器--c++源代码

    C++中实现XML解析通常有几种方法:DOM(Document Object Model)、SAX(Simple API for XML)和STL流式解析。DOM解析会将整个XML文档加载到内存中形成一棵树状结构,方便遍历和操作;SAX是事件驱动的解析方式,只在...

    android使用SAX解析xml

    1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器遵循事件驱动模型,当遇到XML文档中的元素开始、结束、字符内容等事件时,会触发相应...

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    Sax解析xml文件

    1. **创建解析器**: 首先,我们需要创建一个SAX解析器实例。在Java中,这通常通过`SAXParserFactory`类完成。设置解析器属性,然后调用`newSAXParser()`方法获取`SAXParser`对象。 ```java SAXParserFactory ...

    Android解析xml(3)---Pull解析

    在Android中,XML解析主要有三种方式:DOM解析、SAX解析和Pull解析。DOM解析会将整个XML文件加载到内存,形成一个树形结构,适合小规模的XML文件;SAX解析是基于事件的,逐行读取,不会占用太多内存,但编程相对复杂...

    Xml之DOM解析--学生成绩管理系统

    在“Xml之DOM解析--学生成绩管理系统”中,我们主要探讨如何使用DOM解析器来读取、处理和更新XML文件,以实现一个简单的学生成绩管理系统的功能。首先,我们需要理解DOM解析的基本流程: 1. **加载XML文档**:使用...

    解析XML--老师(解析,修改,删除,导出)

    ### XML解析 1. **基础概念**:XML文件由一系列元素组成,每个元素都有开始标签和结束标签,如`内容&lt;/element&gt;`。元素可以嵌套,属性可以附加在开始标签内提供额外信息。 2. **解析方式**: - **DOM解析**:将整个...

Global site tag (gtag.js) - Google Analytics