关于XML的解析的问题

只会使用xml远远是不够的,xml的精髓就是解析xml,现在我们对xml解析进行初步了解

(一)XML解析技术的分类:

(1)XML解析方式分为两种:DOM方式和SAX方式

DOM:Document ObjectModel,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。

SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

(2)XML解析开发包

JAXP:是SUN公司推出的解析标准实现。

Dom4J:是开源组织推出的解析开发包。(基本大部分公司都在只用Dom4j包括SUN公司的一些技术的实现都在用)

JDom:是开源组织推出的解析开发包。

(二)两种解析方式的优缺点

通过dom.xml的文件画图解析DOM和SAX的关系

首先DOM解析XML也是在内存中形成一个树状结构。

(1)DOM解析:把整个XML文档先加载到内存中,形成树状结构。

缺点:如果文档非常大,加载到内存中容易产生内存溢出的问题。

优点:因为节点与节点之间有关系,进行增删改非常方便。

(2)SAX解析:基于事件驱动的,边读边解析。

缺点:不能进行增删改的操作。

优点:文档大也不会有内存溢出的问题,查找非常方便。

(三)两种解析方式分析

(1)DOM模型(document objectmodel)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

a.在dom中,节点之间关系如下:

位于一个节点之上的节点是该节点的父节点(parent)

一个节点之下的节点是该节点的子节点(children)

同一层次,具有相同父节点的节点是兄弟节点(sibling)

一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

b.关于node对象的解释如下

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

c.DOM解析xml文件

2)SAX解析

在使用 DOM 解析 XML 文档时,需要读取整个XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

a.解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

b.事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

(四)XML解析开发包Dom4j

(1) Dom4j简单介绍

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

注意:使用Dom4j开发,需下载dom4j相应的jar文件。

(2)Dom4j使用

a.DOM4j中,获得Document对象的方式有三种:

     1.读取XML文件,获得document对象            

      SAXReader reader = new SAXReader();

             Document   document = reader.read(new File(“input.xml”));

     2.解析XML形式的文本,得到document对象.

      String text =”<members></members>”;

             Document document = DocumentHelper.parseText(text);

     3.主动创建document对象.

     Document document =DocumentHelper.createDocument();

            //创建根节点

    Element root =document.addElement(“members”);

b.节点对象

1.获取文档的根节点.

      Element root =document.getRootElement();

2.取得某个节点的子节点.

     Element element=node.element(“书名”);

3.取得节点的文字

String text=node.getText();

4.取得某节点下所有名为“member”的子节点,并进行遍历.

 List nodes =rootElm.elements(“member”);

 for (Iterator it = nodes.iterator();it.hasNext();) {

     Element elm =(Element) it.next();

    // do something

 }

5.对某节点下的所有子节点进行遍历.

    for(Iteratorit=root.elementIterator();it.hasNext();){

       Elementelement = (Element) it.next();

       //do something

    }

6.在某节点下添加子节点.

Element ageElm = newMemberElm.addElement(“age”);

7.设置节点文字.

 element.setText(“29”);

8.删除某节点.

//childElm是待删除的节点,parentElm是其父节点

   parentElm.remove(childElm);

9.添加一个CDATA节点.

Element contentElm = infoElm.addElement(“content”)

c.节点对象属性

1.取得某节点下的某属性

    Elementroot=document.getRootElement();    

    //属性名name

         Attributeattribute=root.attribute(“size”);

2.取得属性的文字

    Stringtext=attribute.getText();

 3.删除某属性

 Attributeattribute=root.attribute(“size”);

 root.remove(attribute);

3.遍历某节点的所有属性

   Elementroot=document.getRootElement();    

   for(Iteratorit=root.attributeIterator();it.hasNext();){

         Attributeattribute = (Attribute) it.next();

         Stringtext=attribute.getText();

         System.out.println(text);

    }

4.设置某节点的属性和文字.

  newMemberElm.addAttribute(“name”, “sitinspring”);

5.设置属性的文字

   Attributeattribute=root.attribute(“name”);

   attribute.setText(“sitinspring”);

欢迎分享本文,转载请保留出处:前端ABC » 关于XML的解析的问题

分享到:更多 ()

发表评论 0