旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

XML—XML剖析之SAX【XML教程】,XML,SAX

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:37评论:0


导读:1.SAX剖析在运用DOM剖析XML文档时,须要读取全部XML文档,在内存中构建全部DOM树的Document对象,从而再对XML文档举行操纵。此种情况下,假如XML...

1.SAX剖析

  • 在运用DOM剖析XML文档时,须要读取全部XML文档,在内存中构建全部DOM树的Document对象,从而再对XML文档举行操纵。此种情况下,假如XML文档迥殊大,就会斲丧计算机的大批内存,严峻的情况下可以还会致使内存溢出。

  • SAX剖析许可在读取文档的时刻,即对文档举行处置惩罚,而没必要比及全部文档装载完才对文档举行操纵。

  • 经由过程继续DefaultHandler,来开辟一个SAX剖析器

【注重】SAX重要用于对XML文档的剖析,不能去修正、删除和增加元素。

1.1.SAX剖析机制

sax是一种推式的机制,你建立一个sax剖析器,剖析器在发明xml文档中的内容时就通知你(把事宜推给你,有点类似于java swing中的事宜监听)。怎样处置惩罚这些发明的内容,由顺序员本身决议。

在基于sax的顺序中,有五个最经常使用的sax事宜:

1.startDocument()–>通知你剖析器发明了文档的最先,通知你剖析器最先扫描文档
2.endDocument()–>通知你剖析器发明了文档末端
3.startElement()–>通知你剖析器发明了一个肇端标签,该事宜通知你标签的称号、该元素一切的属性名和值
4.characters()–>通知你剖析器发明了一些文本,将获得一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以获得剖析器发明的文本
5.endElement()–>通知你剖析器发明了一个完毕标签,该事宜通知你元素的称号

1.2.SAX剖析实例

依旧运用DOM剖析中用到的XML例子,以下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <门生 地点="香港">
        <名字>周小星</名字>
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>
    <门生 地点="澳门">
        <名字>林晓</名字>
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生></班级>

【步骤】:

1.运用SAXParserFactory建立SAX剖析工场

SAXParserFactory spf = SAXParserFactory.newInstance();

2.经由过程SAX剖析工场获得剖析器对象

SAXParser sp = spf.newSAXParser();

3.将剖析对象和事宜处置惩罚器对象关联

sp.parse("src/myClass.xml",new MyHandler());

这里的MyHandler须要本身定义,而且它要继续DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事宜要领,固然也可以只重写本身须要的。
比方如今我写的MyHandler以下:

class MyHandler extends DefaultHandler{    /**
     * 发明文档最先,该函数只会被挪用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发明文档完毕,该函数只会被挪用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发明XML中的一个元素最先,会被重复挪用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素称号:"+qName);
    }    /**
     * 发明XML中的一个元素完毕,会被重复挪用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发明XML文件中的文本,会被重复挪用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显现文本内容
        String text = new String(ch,start,length);        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}

运转效果以下:

可以看到,这是对XML文档的一种遍历,而sax可以做的也只是遍历了。

那末,假如如今我们有如许一个需求:只显现一切门生的姓名和岁数,不显现门生的引见,怎样完成呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement要领中标识是不是是姓名元素或许岁数元素,假如是的话才在characters要领中猎取对应的文本,以下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;

2.在startElement要领中增加推断

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;
    }else if(qName.equals("岁数")){        this.isAge = true;
    }
}

3.在characters要领中依据标识符举行推断是不是猎取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显现文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}

末了要记得将两个布尔变量复位成false。
运转效果以下:

1.SAX剖析

  • 在运用DOM剖析XML文档时,须要读取全部XML文档,在内存中构建全部DOM树的Document对象,从而再对XML文档举行操纵。此种情况下,假如XML文档迥殊大,就会斲丧计算机的大批内存,严峻的情况下可以还会致使内存溢出。

  • SAX剖析许可在读取文档的时刻,即对文档举行处置惩罚,而没必要比及全部文档装载完才对文档举行操纵。

  • 经由过程继续DefaultHandler,来开辟一个SAX剖析器

【注重】SAX重要用于对XML文档的剖析,不能去修正、删除和增加元素。

1.1.SAX剖析机制

sax是一种推式的机制,你建立一个sax剖析器,剖析器在发明xml文档中的内容时就通知你(把事宜推给你,有点类似于java swing中的事宜监听)。怎样处置惩罚这些发明的内容,由顺序员本身决议。

在基于sax的顺序中,有五个最经常使用的sax事宜:

1.startDocument()–>通知你剖析器发明了文档的最先,通知你剖析器最先扫描文档
2.endDocument()–>通知你剖析器发明了文档末端
3.startElement()–>通知你剖析器发明了一个肇端标签,该事宜通知你标签的称号、该元素一切的属性名和值
4.characters()–>通知你剖析器发明了一些文本,将获得一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以获得剖析器发明的文本
5.endElement()–>通知你剖析器发明了一个完毕标签,该事宜通知你元素的称号

1.2.SAX剖析实例

依旧运用DOM剖析中用到的XML例子,以下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <门生 地点="香港">
        <名字>周小星</名字>
        <岁数>23</岁数>
        <引见>进修受苦</引见>
    </门生>
    <门生 地点="澳门">
        <名字>林晓</名字>
        <岁数>25</岁数>
        <引见>是一个好门生</引见>
    </门生></班级>

【步骤】:

1.运用SAXParserFactory建立SAX剖析工场

SAXParserFactory spf = SAXParserFactory.newInstance();

2.经由过程SAX剖析工场获得剖析器对象

SAXParser sp = spf.newSAXParser();

3.将剖析对象和事宜处置惩罚器对象关联

sp.parse("src/myClass.xml",new MyHandler());

这里的MyHandler须要本身定义,而且它要继续DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事宜要领,固然也可以只重写本身须要的。
比方如今我写的MyHandler以下:

class MyHandler extends DefaultHandler{    /**
     * 发明文档最先,该函数只会被挪用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发明文档完毕,该函数只会被挪用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发明XML中的一个元素最先,会被重复挪用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素称号:"+qName);
    }    /**
     * 发明XML中的一个元素完毕,会被重复挪用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发明XML文件中的文本,会被重复挪用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显现文本内容
        String text = new String(ch,start,length);        
        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}

运转效果以下:

可以看到,这是对XML文档的一种遍历,而sax可以做的也只是遍历了。

那末,假如如今我们有如许一个需求:只显现一切门生的姓名和岁数,不显现门生的引见,怎样完成呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement要领中标识是不是是姓名元素或许岁数元素,假如是的话才在characters要领中猎取对应的文本,以下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;

2.在startElement要领中增加推断

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        
        this.isName = true;
    }else if(qName.equals("岁数")){        this.isAge = true;
    }
}

3.在characters要领中依据标识符举行推断是不是猎取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显现文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}

末了要记得将两个布尔变量复位成false。
运转效果以下:

以上就是XML—XML剖析之SAX的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:XMLSAX


欢迎 发表评论: