DOM解析XMl说白了其实就是用DOM把XML存储的数据转换成一棵树,通过节点以及节点之间的关系,把数据从XML文件中拿出来,为我所用,这样的一个过程,我们称之为“解析”。

一:XML与DOM

   1:XML(eXtensible Markup Language)即可扩展标记语言,十一种简单的数据存储语言,使用一系列简单的标签描述数据,这些标签可以方便的建立。

   ◆特点:

独立于计算机平台,操作平台,编程语言来表示数据,以其简单性,可扩展性,交互性和灵活性在行业中获得广大的支持与采纳。

   ◆作用:

(1)数据存储:和数据库一样可以实现数据的持久化,但相比而言,数据的能力更强大一些,XML仅仅是极其简单的存储数据

(2)数据交换:在实际中,由于各种数据库的不同,那么他们之间的数据传递是一件让人头疼的事儿,可以使用XML的交换数据功能来解决这个问题。把数据库A的数据转换成标准的XMl文件,然后数据库B从XMl文件中解析数据,给自己使用。

(3)数据配置:使用XML文件作为配置文件,灵活性高,可读性强

   2:DOM

   DOM(Document Object Model)即文档对象模型。XML将数据组织成一棵树,所以DOM就是对这颗树的整体描述,那么对数据的各种操作,都可以通过这个DOM来完成。

二:解析过程

先来看一个基本的XML文件吧。


    
        Harry Potter
        J K Rowling
        2005
        29.99
    
    
        Harry Potter
        J K Rowling
        2006
        39.99
    
    
        明朝那些事儿
        当年明月
        2009
        19.99
    

XML文件的主要组成部分为元素,如图中的book元素,title元素等。元素可以具有属性(如book的id),可以具有子元素(如book的title子元素),我们就是通过元素与元素之间的关系来达到获数据的目的。

再来看看XML在内存中的DOM结构吧。

XML的DOM解析_第1张图片

可见bookstore标签在XML文件中是根标签,很显然在这颗树中他也是根元素,这个根元素还有book子元素,book子元素有属性值id,在book元素下面还有title,author,year,price四个子元素,在这些元素下面还有文本元素,即值。那么怎么取得文本元素中的值呢?下面就开始我们的解析之旅吧。。。

◆解析的过程分析:

简单的拿上面的XMl文件来说,文件中有三个book节点元素,所以应想办法获得这三个节点,然后循环遍历每一个book节点里面的内容。比如第一个book节点有一个属性值,所以应取得他的id属性值,然后下面还有四个子元素,分别先获得各个子元素,然后取得各个子元素的属性值(如果有的话),然后在取得各个子元素的文本子元素,在取得各个文本子元素的值。

总之,它的的遍历过程简单来说顺序如下:

根元素-->根元素属性-->根元素下的一级子元素-->根元素下的一级子元素的属性-->根元素下的一级子元素的文本子元素-->根元素下的一级子元素的文本子元素的值-->。。。。。。

◆解析之中用到的两个方法:

getElementsByTagName(元素节点名字):获得的是元素节点,如果它的下面还有子元素(或文本元素),那么由getFirstChild()取得

getAttributeNode(属性名字):用于取得属性,属性直接有值,所以用getNodeValue()取值

◆具体的解析过程:

1得到DOM解析器的工厂实例

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2:从DOM工厂中得到DOM解析器

DocumentBuilder db = dbf.newDocumentBuilder();

3:解析XML文档,得到一个Document,即DOM树

Document doc = db.parse("e:/book.xml");

4: 得到所有节点的列表信息(因为有好多book)

NodeList petList = doc.getElementsByTagName("book");

     5:轮循书本信息

for (int i = 0; i < petList.getLength(); i++) {
                // 得到book元素
                Element book = (Element) petList.item(i);
                // 得到book元素下的id属性的值
                String strId = book.getAttributeNode("id").getNodeValue();        
                // 得到book下的title子元素节点下的子文本节点的值
                String strTitle = book.getElementsByTagName("title").item(0)
                        .getFirstChild().getNodeValue();
                // 得到book下的title子元素节点
                Element title = (Element) book.getElementsByTagName("title")
                        .item(0);
                // 得到title元素节点的tid属性节点的值
                String strTid = title.getAttributeNode("tid").getNodeValue();
                // 得到book元素节点的author属性节点的值
                String strAuthor = book.getElementsByTagName("author").item(0)
                        .getFirstChild().getNodeValue();
                // 得到book元素节点的year属性节点的值
                String strYear = book.getElementsByTagName("year").item(0)
                        .getFirstChild().getNodeValue();
                // 得到book元素节点的price属性节点的值
                String strPrice = book.getElementsByTagName("price").item(0)
                        .getFirstChild().getNodeValue();
                System.out.println("ID:" + strId);
                System.out.println("标题:" + strTitle);
                System.out.println("标题ID:" + strTid);
                System.out.println("作者:" + strAuthor);
                System.out.println("出版日期:" + strYear);
                System.out.println("价格:" + strPrice);
            }

   (友情提示:要抛出的异常)

   结果:测试之前,在d盘上存一个book.xml文件

XML文件中book的初始化信息:
ID:1
标题:Harry Potter
标题ID:1
作者:J K Rowling
出版日期:2005
价格:29.99
ID:2
标题:Harry Potter
标题ID:2
作者:J K Rowling
出版日期:2006
价格:39.99
ID:3
标题:明朝那些事儿
标题ID:1
作者:当年明月
出版日期:2009
价格:19.99

DOM的文档解析先说到这里,我得去做编个代码。。。白咯