XML DOM解析(Java)的一個簡單實例


 

  關於DOM解析的基礎內容見上一篇文章:http://www.cnblogs.com/mengdd/archive/2013/06/01/3112795.html

  

  JAXP(Java API for XML Parsing) :用於XML解析的Java API。

 

  本文通過一個實際的代碼例子來說明如何用Java提供的DOM相關的類和接口解析XML:

  首先,是XML文檔:books.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>
    <book category="children">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
    </book>

    <book category="cooking">
          <title lang="en">Everyday Italian</title> 
          <author>Giada De Laurentiis</author> 
          <year>2005</year> 
          <price>30.00</price> 
    </book>

    <book category="web">
          <title lang="en">Learning XML</title> 
          <author>Erik T. Ray</author> 
          <year>2003</year> 
          <price>39.95</price> 
    </book>

    <book category="web">
          <title lang="en">XQuery Kick Start</title> 
          <author>James McGovern</author> 
          <author>Per Bothner</author> 
          <author>Kurt Cagle</author> 
          <author>James Linn</author> 
         <author>Vaidyanathan Nagarajan</author> 
          <year>2003</year> 
          <price>49.99</price> 
    </book>

</bookstore>

  把這個文檔放在項目的根路徑下,與src目錄平行,就可以使用相對路徑來引用了。

 

  新建Java類,解析如下:

package com.example.xml.dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class DomTest1
{
    public static void main(String[] args) throws Exception
    {
        // step 1:獲得DOM解析器工廠
        // 工廠的作用是創建具體的解析器
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        // step 2:獲得具體的dom解析器
        DocumentBuilder db = dbf.newDocumentBuilder();

        // step 3:解析一個xml文檔,獲得Document對象(根節點)
        // 此文檔放在項目目錄下即可
        Document document = db.parse(new File("books.xml"));

        // 根據標簽名訪問節點
        NodeList list = document.getElementsByTagName("book");
        System.out.println("list length: " + list.getLength());

        // 遍歷每一個節點
        for (int i = 0; i < list.getLength(); ++i)
        {
            System.out.println("----------------------");
            // 獲得元素,將節點強制轉換為元素
            Element element = (Element) list.item(i);
            // 此時element就是一個具體的元素

            // 獲取子元素:子元素title只有一個節點,之后通過getNodeValue方法獲取節點的值
            String content0 = element.getElementsByTagName("title").item(0)
                    .getNodeValue();

            System.out.println(content0);// 此處打印出為null
            // 因為節點getNodeValue的值永遠為null

            // 解決方法:加上getFirstChild()
            String content = element.getElementsByTagName("title").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("title: " + content);// 此處打印出書名

            // 后面類似處理即可:
            content = element.getElementsByTagName("author").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("author: " + content);
            content = element.getElementsByTagName("year").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("year: " + content);
            content = element.getElementsByTagName("price").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("price: " + content);
        }
    }

}

  具體過程參見注釋。

 

  首先,我們需要建立一個解析器工廠,以利用這個工廠來獲得一個具體的解析器對象。 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

 

  我們在這里使用DocumentBuilderFactory的目的是為了創建與具體解析器無關的程序,當DocumentBuilderFactory類的靜態方法newInstance()被調用時,它根據一個系統變量來決定具體使用哪一個解析器。

  又因為所有的解析器都服從於JAXP所定義的接口,所以無論具體使用哪一個解析器,代碼都是一樣的。

  所以當在不同的解析器之間進行切換時,值需要更改系統變量的值,而不用更改任何代碼。這就是工廠所帶來的好處。

 

DocumentBuilder db = dbf.newDocumentBuilder();

  當獲得一個工廠對象之后,使用它的靜態方法newDocumentBuilder(),可以獲得一個DocumentBuilder對象

  這個對象代表了具體的DOM解析器

  解析器的具體實現對於程序來說並不重要。  

 

  然后,我們就可以利用這個解析器對文檔進行解析了。

  Sun公司提供了默認的工廠和默認的解析器,上面的例子中就使用了默認的解析器。

 

 

參考資料

  聖思園張龍老師XML視頻教程。

  w3school XML DOM 教程:

  http://www.w3school.com.cn/xmldom/index.asp

  Java API文檔:

  http://docs.oracle.com/javase/7/docs/api/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM