DOM
解析器完整的读入XML文档,然后将其转换成一个树型的数据结构,对于大多数应用,DOM 都运行很好,但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那么我们应该使用流机制解析器(streaming parser),Java 类库提供的流解析机制有 SAX 解析器和 StAX 解析器,SAX 解析器是基于事件回调机制,而 StAX解析器提供了解析事件的迭代器。

  1. 使用SAX解析器

    SAX
    解析器在解析XML 输入的组成部分时会报告事件,在使用 SAX 解析器时,需要一个处理器来为不同的解析器事件定义事件动作,ContentHandler 接口定义了若干个在解析文档时解析器会调用的回调方法,我们可以使用
    DefaultHandler
    类,该类继承与
    ContentHandler
    并提供了默认实现,重要的方法如下:

  • startDocument:在文档开始时调用一次
  • endDocument:在文档结束时调用一次
  • startElement:在遇到起始标签时调用,有3个描述元素名的参数,其中qName参数标识标签限定名,如果命名空间处理特性打开,则
    uri
    表示的是命名空间,localName 表示的是本地名。
  • endElement:在遇到结束标签时调用,其参数和
    startElement
    一致
  • characters:在每当遇到字符数据时调用,如果标签没有内容,但有子标签时,其中的空格会作为字符数据返回

示例代码如下:

  • 事件处理类

    public class CustomDefaultHandler extends DefaultHandler {

            @Override

            public
    void
    startDocument() throws SAXException {

                    super.startDocument();

     
     

                    System.out.println("call startDocument");

            }

     
     

            @Override

            public
    void
    endDocument() throws SAXException {

                    super.endDocument();

                    System.out.println("call endDocument");

            }

     
     

            @Override

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

                    super.characters(ch, start, length);

     
     

                    String chs = new
    String(ch, start, length);

                    System.out.println("characters ch=" + chs + " start=" + start + " length=" + length);

            }

     
     

            @Override

            public
    void
    startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

                    super.startElement(uri, localName, qName, attributes);

     
     

                    StringBuilder sb = new
    StringBuilder();

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

                            sb.append(attributes.getLocalName(i) + "=\"" + attributes.getValue(i) + "\"
    ");

                    }

     
     

                    System.out.println("startElement qName=" + qName + " Uri=" + uri + " localName=" + localName + " "

    + sb.toString());

            }

     
     

            @Override

            public
    void
    endElement(String uri, String localName, String qName) throws SAXException {

                    super.endElement(uri, localName, qName);

     
     

                    System.out.println("endElement " + qName);

            }

    }

  • 调用类

    try {

            Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");

            InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);

            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

            SAXParser saxParser = saxParserFactory.newSAXParser();

            saxParser.parse(xmlStream, new
    CustomDefaultHandler());

    } catch (SAXException e) {

              e.printStackTrace();

    } catch (ParserConfigurationException e) {

              e.printStackTrace();

    } catch (IOException e) {

              e.printStackTrace();

    }

  1. 使用StAX解析器

    StAX
    解析器时一种拉解析器(pull
    parser),与安装事件处理器不同,只需要使用基本的循环来迭代所有事件,示例代码如下:

    try {

          Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");

          InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);

     
     

          XMLInputFactory factory = XMLInputFactory.newFactory();

          XMLStreamReader parser = factory.createXMLStreamReader(xmlStream);

     
     

          while (parser.hasNext()) {

                      int event = parser.next();

                      switch (event) {

                              case XMLStreamConstants.START_DOCUMENT:

                                        System.out.println("START_DOCUMENT Call");

                                        break;

     
     

                              case XMLStreamConstants.END_DOCUMENT:

                                        System.out.println("END_DOCUMENT Call");

                                        break;

     
     

                              case XMLStreamConstants.START_ELEMENT:

                                        StringBuilder sb = new
    StringBuilder();

                                        for (int i = 0; i < parser.getAttributeCount(); i++) {

                                                sb.append(parser.getAttributeName(i) + "=\"" + parser.getAttributeValue(i) + "\"
    ");

                                        }

                                        System.out.println("START_ELEMENT qName=" + parser.getName() + " Uri="

    + parser.getNamespaceURI() + " localName=" + parser.getLocalName() + " attribute="

    + sb.toString());

                                        break;

     
     

                              case XMLStreamConstants.END_ELEMENT:

                                        System.out.println("END_ELEMENT qName=" + parser.getName() + " Uri=" + parser.getNamespaceURI()

                                                         + " localName=" + parser.getLocalName());

                                        break;

     
     

                              case XMLStreamConstants.CHARACTERS:

                                        int start = parser.getTextStart();

                                        int length = parser.getTextLength();

                                        System.out.println("CHARACTERS text=" + new
    String(parser.getTextCharacters(), start, length));

                                        break;

                    }

          }

    } catch (IOException e) {

            e.printStackTrace();

    } catch (XMLStreamException e) {

          e.printStackTrace();

    }

     
     

     
     

笔记:XML-解析文档-流机制解析器(SAX、StAX)的更多相关文章

  1. 前端学习笔记之CSS文档流

    先引用一段W3C的文档: 9.3 Positioning schemes In CSS 2.1, a box may be laid out according to three positionin ...

  2. 源生API解析XML文档与dom4j解析XML文档

    一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...

  3. [Swift通天遁地]七、数据与安全-(2)对XML和HTML文档的快速解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. 2.1 使用JAXP 对 xml文档进行DOM解析

    //使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...

  5. XML之DOM解析文档 Day24

    TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...

  6. 文档ID:某某 模板文件不存在,无法解析文档!

    如果是生成栏目列表时出现这样的问题]:   1.可以修改include/arc.listview.class.php这个文件. 2.复制代码     echo "模板文件不存在,无法解析文档 ...

  7. DedeCMS模板文件不存在,无法解析文档! 问题定位方法

    生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...

  8. dedecms 模板文件不存在,无法解析文档"的终极各种解决办法

    方法一:[此对应喜欢把模板文件使用".html"的格式,]  /include/arc.archives.class.php 556行    if (!preg_match(&qu ...

  9. dedecms 模板文件不存在 无法解析文档!问题定位方法!

    生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...

随机推荐

  1. Shell脚本——cat/EOF输出多行

    在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中.(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判 ...

  2. Java线程和守护进程

    ava的线程机制,有两类线程:User Thread(用户线程).Daemon Thread(守护线程) . 操作系统里面是没有守护线程的概念,只有守护进程,但是Java语言机制是构建在JVM的基础之 ...

  3. ubuntu 下命令行播放器mplayer 使用详解

    ubuntu 下命令行播放器mplayer 使用详解 2011-01-02 21:00:42|  分类: Linux/Unix |  标签: |字号大中小 订阅 使用 MPlayer 播放媒体文件最简 ...

  4. file和file文件流

    **io流是程序中比较常用的功能,基本上涉及到文件上传下载的都要用到这功能,比如上传头像,上传附件等等. 对于一个java程序员来说,io流也是必须掌握的,因此这里对比较常用的或者说曾经用过的方法进行 ...

  5. 挖一挖不常用到而又很实用的重载-Split

    Split这个基本上所有的程序开发人员都用到,一般使用单字符和长字符串拆分字符串的较多,其实还有一个重载非常好用,那就是多种组合字符来进行拆分. 例如: "aaaaaaaaaa{@}bbbb ...

  6. AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植

    移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  7. freemarker自定义标签(二)

    freemarker自定义标签 1.自定义标签 通过自定义标签,写一个重复指定字符串 2.实现源码 <html> <head> <meta http-equiv=&quo ...

  8. MP4文件格式的解析

    MP4文件格式的解析,以及MP4文件的分割算法 mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime.以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心 ...

  9. java实现组合问题

    刚才刚更新了排列问题,顺带把组合问题也发表一下 1.问题描述: 已知有m个球,从m个球中取n个球有多少种不同的取法. 2.输入示例: 请输入总球的个数和要取的球的个数 6 5 3.输出示例: 共有6种 ...

  10. LightOJ1341 Aladdin and the Flying Carpet

    题意 给一对数字 a,b ,a是一个长方形的面积,问有多少种整数的边的组合可以组成面积为a的长方形,要求最短的边不得小于b 数据组数T<=4000, a,b<=10^12 Solution ...