我想了解的是关于SAX是怎么解析XML文件的,在网上查了好多资料,就是说SAX是事件驱动的,只要访问了对应的元素就会调用相应的startElement等方法, 而且我也写了几个prototype,也得可以解析。 但是我想知道的是SAX解析XML最本质的原理,就是它是怎么访问XML文件的,是怎么样找到相应的节点元素的,为什么一访问节点元素就会调相应的方法??    我也看了JAVA源码,但是看的不是很懂,希望哪位能告诉我下,谢谢!!

解决方案 »

  1.   

    为什么一访问节点元素就会调相应的方法??因为这就是SAX的原理。其实不是一访问节点元素就会调用相应的方法,
    SAX遍历XML文档,对碰到的每一个元素,尝试调用一套对应的方法(如果有指定的话)。是我们通过编写处理特定事件的方法来在这个框架下处理XML中的数据。
      

  2.   

    谢谢,其实我想知道的是SAX怎么遍历XML文档的,它怎么会认识XML里面的元素,它遍历XML,是逐行读?还是每个字符读?还是其他的读法?
    我是想弄清解析XML最本质的原理,假如SAX没有用那个框架的话,它应该是怎么解析XML的呢??
    今天我公司leader让我搞清这个问题,我找了一天,找了一些东西,但leader都说不是他要的最本质的东西,唉。。  
      

  3.   

    1.SAX (Simple API for XML):一行一行的读,触发事件。(这个XML文档没有加载到内存中)
    2.DOM (Document Object Model):将XML文档全部读到内存中,形成一个DOM树,
         如果我要去获得该XML文档的某个属性数据的话,直接找到节点,从而获得值。
      

  4.   

    请问SAX是怎么实现一行一行读的呢???   我只知道它是一行一行读的,但是不知道是怎么实现的??JDK源码看没太懂,谢谢
      

  5.   

    SAX解析XML的过程:---------------------------一行一行的读,触发事件。(这个XML文档没有加载到内存中)
    第一步:当遇到元素的开始标记的时候执行startElement方法
    第二步:接着执行characters方法
    第三步:当遇到元素的结束标记的时候执行endElement方法(在这要特别注意......因为下面方法又会把value设为空)
    第四步:接着执行characters方法
    第五步:......循环......直接扫描到文件结束import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;public class SAXCounterHandler extends DefaultHandler {
    private int elements; public SAXCounterHandler() {
    super();
    } // handle a start-of-document event解析XML文档开始
    public void startDocument() throws SAXException {
    System.out.println("Starting to parse...");
    } // handle an end-of-document event解析XML文档结束
    public void endDocument() throws SAXException {
    System.out.println("All done!");
    System.out.println("There were " + elements + "elements");
    } // handle a start-of-element event遇到开始标记执行
    public void startElement(String uri, String localName, String name,
    Attributes attributes) throws SAXException {
    System.out.println("starting element (" + name + ")");
    if ("".equals(uri)) { } else {
    System.out.println("名称空间namespace:" + uri);
    }
    System.out.println("number of attribates:" + attributes.getLength());
    } // handle an end-of-element event遇到结束标记执行
    public void endElement(String uri, String localName, String name)
    throws SAXException {
    elements++;
    System.out.println("ending elment (" + name + ")");
    } // handle a characters event文本信息?
    public void characters(char[] ch, int start, int length)
    throws SAXException {
    System.out.println("CDATA:" + length + "characters"); // 取内容的意思......好好体会!!!!!!相当重要!!!!!!
    System.err.println(new String(ch).toString().substring(start,
    start + length).trim());
    }
    }这些代码只供参考...
      

  6.   

    你好,这些代码我都看过了,  上面的代码就是说明了 SAX遇到相应的节点元素就会触发相应的方法,但是并没有体现是一行一行读的啊? 我想知道SAX是具体怎么实现一行一行读的?为什么遇到相应的节点元素就会触发相应的事件?SAX是怎么认识XML中这些节点元素的,例如<element></element>,是通过"<",">"来识别的么??    期待你的答案,谢谢!!!  
      

  7.   

    因为SAX解析是基于事件回调机制
    因为我也没看过SAX解析的源程序,就我个人的观点,我觉得这个应该是正则表达式的作用
    简单的说就是当SAX读取一个字符串,然后一个字符一个字符的解析,如果是读进来的字符是"<"那它就会继续读下去,然后一直读到">"结束,然后再通知SAX解析器做相应的处理
      

  8.   

    sax只是一种判断字节符,只认字节与属性
      

  9.   

    感觉sax解析xml很好!但是还是不太会用!学习!
      

  10.   

      应该是用正则匹配到< 和> 
      

  11.   

    但是在SAX的源代码里看不到怎么解析的,应该在哪里可以看到呢?