• DOM4J解析XML


         Java中对XML进行解析的方式常见的为四种:SAX,DOM,JDOM,DOM4J
         SAX分析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。 SAX之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,检查是否符合XML语法并触发相应的事件。对于事件处理函数本身,要由应用程序自己来实现。同DOM分析器相比,SAX分析器对XML文档的处理缺乏一定的灵活性,然而,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器的效率则更高。由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高同时具有广泛的应用价值。
         DOM分析器通过对XML文档的分析,把整个XML文档以一棵DOM树的形式存放在内存中,应用程序可以随时对DOM树中的任何一个部分进行访问与操作,也就是说,通过DOM树,应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器的树结构的思想与XML文档的结构相吻合,而且,通过DOM树机制很容实现随机访问。因此DOM分析器也有较为广泛的使用价值。
         JDOM是处理XML的纯JAVA API。使用具体类而不用接口,既要生成大多数节点类型的实例,只要将一两个变元传入即可。是目前表现优秀的处理XML的JAVA API。


    SAX
    优点:①无需将整个文档加载到内存,因而内存消耗少
           ②推模型允许注册多个ContentHandler
    缺点:①没有内置的文档导航支持
           ②不能够随机访问XML文档
           ③不支持在原地修改XML
           ④不支持名字空间作用域
    最适合于:只从XML读取数据的应用程(不可用于操作或修改XML文档)

    DOM
    优点:①易于使用
           ②丰富的API集合,可用于轻松地导航
           ③整棵树加载到内存,允许对XML文档进行随机访问
    缺点:①整个XML文档必须一次解析完
           ②将整棵树加载到内存成本较高
           ③一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想
    最适合于:需要修改XML文档的应用程序或XSLT应用程序(不可用于只读XML的应用程序)

    JDOM
    优点:①是基于树的处理XML的Java API,把树加载在内存中
           ②没有向下兼容的限制,因此比DOM简单
           ③速度快,缺陷少
           ④具有SAX的JAVA规则
    缺点:①不能处理大于内存的文档
           ②JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
           ③针对实例文档不提供DTD与模式的任何实际模型。
           ④不支持与DOM中相应遍历包
    最适合于:JDOM具有树的便利,也有SAX的JAVA规则。在需要平衡时使用

    DOM4J
          ①JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
          ②DOM4J使用接口和抽象基本方法,是一个优秀的Java XML API
          ③具有性能优异,灵活性好,功能强大和极端易使用的特点。
          ④是一个开发源代码的软件

    --简单描述一下DOM4J解析流程
      1.创建对象 SAXReader saxReader = new SAXReader();
      2.加载xml文件 Document douDocument = saxReader.read(xmlFile);
      3.获取xml文件跟节点 Element rootElement = douDocument.getRootElement();
      4.获取根节点下的所有子节点 List<Element> elements = rootElement.elements();
      5.遍历。
      6.获取节点属性 List<Attribute> attrs = element.attributes();
        然后遍历可得每个属性名/属性值。
      7.同理获取子节点下的子节点集合 List<Element> childElements = element.elements();
         然后遍历可得最终节点中的值。

  • 相关阅读:
    iOS之上架打包时报错:ERROR ITMS-90086: "Missing 64-bit support.
    iOS之Xcode 8.0真机调试运行:This ** is running iOS 10.1.1 (14B100), which may not be supported
    The memory graph Shared by the method
    A memory map of an object
    Directly output the object name
    data encryption
    20181003-20181008
    Array inversion case
    No rabbit death problem
    Breakpoint debugging
  • 原文地址:https://www.cnblogs.com/zhangygl/p/4297280.html
Copyright © 2020-2023  润新知