1. 程式人生 > >深入淺出如何解析xml檔案---上篇

深入淺出如何解析xml檔案---上篇

    xml小夥伴們並不陌生,xml是可擴充套件標記語言,標準通用標記語言語言的子集,是一種用來標記電子檔案使其具有結構性的標記語言。我們知道xml可以用dom與sax等方法進行解析,但是xml為什麼要解析呢?為什麼html就不用解析?小夥伴們可以思考一下,我們知道xml和html都是標籤化的程式碼,其實也都是網頁的一種寫法,但是瀏覽器決定了顯示什麼,也就是瀏覽器直接解析html的基本標籤,目前來說xml從一種網頁應用,走向了一種格式化資訊的應用,因為,我們需要使用xml裡的這些資訊,所以我們需要解析她,因為她的那些格式標籤不是我們所需要的,我們需要的標籤裡的那些內容,從標籤來判斷這些內容是什麼型別的內容,就放在什麼地方,這個過程就是解析。java中解析xml的方式有四種,分別是dom、sax、jdom、dom4j,這篇博文,小編主要介紹一下dom4j解析xml檔案,其他解析方式,小編也會一一進行簡單介紹。

    dom4j解析xml檔案

    dom4j是一個Java的XML API,是jdom的升級品,用來讀寫XML檔案的。dom4j是一個十分優秀的JavaXML API,具有效能優異、功能強大和極其易使用的特點,它的效能超過sun公司官方的dom技術,同時它也是一個開放原始碼的軟體,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對主流的Java XML API進行的效能、功能和易用性的評測,所以可以知道dom4j無論在哪個方面都是非常出色的。如今可以看到越來越多的Java軟體都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這已經是必須使用的jar包, Hibernate也用它來讀寫配置檔案。

 我們採用的配置檔案是xml,以前也使用propert檔案,propert的功能不是很強大,現在使用的不是很多,大部分的配置都指向了xml檔案,xml檔案比較強大,所以,我們把資料庫裡面的配置配到xml檔案裡面,讓小夥伴瞭解xml檔案怎麼編寫,怎麼配置,怎麼讀取,xml檔案如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<db-info>
		<driver-name>com.mysql.jdbc.Driver</driver-name>
		<url>jdbc:mysql:///shop</url>
		<user-name>root</user-name>
		<password>123456</password>
	</db-info>
</config>
    名字和標籤小夥伴們可以根據自己的喜好進行命名,xml的解析方式有dom、sax、jdom、dom4j,她們都是解析xml的工具,其中sax解析是針對事件進行解析,效率較高,而最常用的是dom解析,也就是從根元素開始對xml進行解析,因為是從頭開始,所以當文件很大時,有時效率不高,另外修改刪除也不是很方面,jdom和dom4j用起來差不多,就是方法有一點不同,接著我們以dom4j解析為例,程式碼如下所示:
package com.bjpowernode.drp.util;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 解析單例模式sys-config.xml檔案
 * @author 丁國華
 *
 */
public class XmlConfigReader {
	
	//惡漢式,預先載入
/*	private static XmlConfigReader instance = new XmlConfigReader();
	private XmlConfigReader(){
		
	}
	public static XmlConfigReader getInstance(){
		return instance;
	}
	*/
	
	//懶漢式(延遲載入)真正用到的時候才new
	private static XmlConfigReader instance=null;
	//儲存jdbc相關配置資訊
	private JdbcConfig jdbcConfig = new JdbcConfig();
	private XmlConfigReader(){
		SAXReader reader = new SAXReader();
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
		try {
			Document doc = reader.read(in);
			//取得jdbc相關配置資訊
			Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
			Element urlElt = (Element)doc.selectObject("/config/db-info/url");		
			Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
			Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
			
			
			//設定jdbc的相關配置
		
			jdbcConfig.setDriverName(driverNameElt.getStringValue());
			jdbcConfig.setUrl(urlElt.getStringValue());
			jdbcConfig.setUserName(userNameElt.getStringValue());
			jdbcConfig.setPassword(passwordElt.getStringValue());
			
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public  static synchronized XmlConfigReader getInstance(){
		if(instance ==null){
			instance = new XmlConfigReader();
		}
		return instance;
		
	}
	
	/**
	 * 返回jdbc相關配置
	 * @return
	 */
	
	public JdbcConfig getJdbcConfig(){
		return jdbcConfig;
		
	}
	
	public static void main(String[] args)  {
		
		JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
		System.out.println(jdbcConfig);		
	}
}
    雖然 DOM4J 代表了完全獨立的開發結果,但最初,它是 JDOM 的一種智慧分支。它合併了許多超出基本 XML 文件表示的功能,包括整合的 XPath 支援、XML Schema 支援以及用於大文件或流化文件的基於事件的處理。它還提供了構建文件表示的選項,它通過 DOM4J API 和標準 DOM 介面具有並行訪問功能。從 2000 下半年開始,它就一直處於開發之中。
    為支援所有這些功能,DOM4J 使用介面和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的效能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復雜的 API 的代價,但是它提供了比 JDOM 大得多的靈活性。
    在新增靈活性、XPath 整合和對大文件處理的目標時,DOM4J 的目標與 JDOM 是一樣的:針對 Java 開發者的易用性和直觀操作。它還致力於成為比 JDOM 更完整的解決方案,實現在本質上處理所有 Java/XML 問題的目標。在完成該目標時,它比 JDOM 更少強調防止不正確的應用程式行為。
    DOM4J 是一個非常非常優秀的Java XML API,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體。如今你可以看到越來越多的 Java 軟體都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。那麼使用dom4j進行解析,有哪些優缺點呢?如下所示:

    優點:

    a、大量使用java集合類,方便java開發人員,同時提供一些提高效能的替代方法;

    b、支援xpath;

    c、效能好。

    缺點:

    a、大量使用了介面,API比較複雜。

    介紹了DOM4j解析xml檔案的方式,接著,我們來看一下其她的三種方式,dom、sax以及jdom。

    DOM解析xml檔案

    DOM模式解析xml,是把整個xml文件當成一個物件來處理,先把整個文件當成一個物件來處理,會先把整個文件讀入到記憶體裡,是基於樹的結構,通常需要載入整個文件以及構造DOM樹,然後才開始工作。

    DOM 是用與平臺和語言無關的方式表示 XML 文件的官方 W3C 標準。DOM 是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文件和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而 DOM 被認為是基於樹或基於物件的。DOM 以及廣義的基於樹的處理具有幾個優點。
    首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。另一方面,對於特別大的文件,解析和載入整個文件可能很慢且很耗資源,因此使用其他手段來處理這樣的資料會更好。這些基於事件的模型,比如 SAX。 舉例說明,一下是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>
     解析如下所示:
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);
        }
    }

}
    使用dom解析xml有什麼優缺點呢,如下所示:

    優點:

    a、允許應用程式對資料和結構做出更改;

    b、訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的資料。

    缺點:

    a、通常需要載入整個xml文件來構造層次結構,消耗資源大。 

    小編寄語:由於博文篇幅的原因,xml解析方式,小編就暫時介紹dom4j和dom的兩種方式,在下篇博文中,小編將繼續介紹xml解析方式sax和jdom,精彩未完待續......

相關推薦

深入淺出如何解析xml檔案---

    xml小夥伴們並不陌生,xml是可擴充套件標記語言,標準通用標記語言語言的子集,是一種用來標記電子檔案使其具有結構性的標記語言。我們知道xml可以用dom與sax等方法進行解析,但是xml為什麼要解析呢?為什麼html就不用解析?小夥伴們可以思考一下,我們知道xml和

Java傳且後臺解析XML檔案

後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.

【電信計費系統專案實戰】基礎---解析XML檔案

寫在前面 這一篇介紹如何解析xml檔案,因專案中的角色管理有個許可權列表 為了方便管理,我們用privileges.xml儲存許可權操作資訊。 解析xml檔案 用privileges.xml儲存許可權操作資訊的程式碼如下: <?xml

深入淺出如何解析xml檔案---下篇

    在上篇博文中,小編主要介紹xml的兩種解析方式,分別是dom4j和dom,今天這篇博文,小編主要來簡單介紹一下xml的其她兩種解析方式sax和jdom。    sax解析xml檔案    sax,全稱是Simple API for XML ,即是一種介面,也是一種軟體

安卓下如何使用XmlPullParser解析xml檔案並顯示在TextView控制元件

解析xml檔案有好多種方式,今天介紹下XmlPullParser怎麼解析xml檔案,既然是要解析xml檔案首先得需要一個xml檔案 如下weather.xml檔案 <?xml version="1.0" encoding="utf-8"?> <weathe

深入淺出如何解析xml檔案 下篇

    import java.util.ArrayList;      import java.util.List;                  import org.xml.sax.Attributes;      import org.xml.sax.SAXException;      impo

深入淺出如何解析xml檔案---下篇(轉)

http://blog.csdn.net/u010850027/article/details/51499832 在上篇博文中,小編主要介紹xml的兩種解析方式,分別是dom4j和dom,今天這篇博文,小編主要來簡單介紹一下xml的其她兩種解析方式sax和jd

曹工說Spring Boot原始碼(7)-- Spring解析xml檔案,到底從中得到了什麼(

寫在前面的話 相關背景及資源: 曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享 曹工說Spring Boot原始碼(2)-- Bean Definition到底是什麼,咱們對著介面,逐個方法講解 曹工說Spring Boot原始碼(3)--

曹工說Spring Boot原始碼(9)-- Spring解析xml檔案,到底從中得到了什麼(context名稱空間

寫在前面的話 相關背景及資源: 曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享 曹工說Spring Boot原始碼(2)-- Bean Definition到底是什麼,咱們對著介面,逐個方法講解 曹工說Spring Boot原始碼(3)--

利用dom4j-1.6.1解析xml檔案

1.先看xml的文件裡面的格式 2.main裡面,就是一個按鈕新增點選事件,然後通過工具類來解析 3.工具類裡面的程式碼,這裡我在xml中去掉了部分屬性,你可以自己設定一下,然後重新設定就好了 4.最後在activity中就可以自己查看了,我這裡是直接返回了一

java後臺解析XML檔案

解析XML檔案分為兩種: 1、DOM(Document Object Model) 2、SAX(Simple API for XML) DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。 我用到的是SAX解析>> 一、XML檔案 <?xml

用JDOM解析XML檔案時如何解決中文問題?如何解析

1 import javax.xml.parsers.DocumentBuilder; 2 import javax.xml.parsers.DocumentBuilderFactory; 3 import javax.xml.transform.OutputKeys; 4 import jav

Java:簡單的解析XML檔案之使用DOM解析

XML簡介 要理解XML,HTML等格式,先來理解文件物件模型DOM    根據 DOM,HTML 文件中的每個成分都是一個節點,這些節點組成了一棵樹。DOM 是這樣規定的:整個文件是一個文件節點每個 HTML 標籤是一個元素節點包含在 HTML 元素中的文字是文字節點每一個 HTML 屬性是一個屬性節

java w3c解析xml檔案,獲取指定節點內容,讀取外部配置檔案

原始碼: package com.ys.adage.utils; import com.ys.adage.message.CodeObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.

使用QDomDocument的setContent解析XML檔案報錯的解決方案

可能的錯誤: 1、使用QDomDocument建立根節點時,使用了諸如:rootNode.setAttribute(“ProjName”,fileName);或者rootNode.setAttribute(“Version”,“2.0”);等等,根節點不能帶屬性 2、create

解析.xml檔案

有個第三方的包,用來解析.xml檔案比較方便,它是DOM4J。由於是第三方的,所以要使用它就要先下載,幷包含進來。步驟: 1.開啟dom4j官網,這裡下載最新版dom4j-2.1.1.jar.   2.新建資料夾lib. 3.把下載好的dom4j.jar放到lib資料夾裡面。

使用XmlPullParser解析xml檔案

步驟: 解析類: 1、獲取XmlPullParser解析的例項 2、設定XmlPullParser的引數 3、獲取事件型別,判斷是開始標籤還是結束標籤 4、具體判斷一下解析到哪個開始標籤 5、建立集合物件 6、建立解析物件 7、獲取解析物件內的各標籤的資料並儲存到解析物件中 8、將解析物件的

解析xml檔案動態拼接sql語句

現在有很多開源的持久層框架,比如Mybatis、BeetlSQL、Hibernate、DbUtils。當我們需要自己手寫sql的時候。使用Mybatis、BeetlSQL(這個個人更喜歡,因為結合了hibernate和mybatis各自的優點)框架相對來說更好,因為它將sql 放到配置檔案裡面。

python 使用ElementTree解析xml檔案

以country.xml為例,內容如下: <?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</ran

IOS資料處理及版本特性-解析XML檔案

準備一個需要解析的xml檔案 <?xml version="1.0" encoding="UTF-8" ?> <workers>     <worker id='1'>         <n