首頁 後端開發 XML/RSS教程 java讀取XML檔案的四種方式及比較的程式碼實例詳細介紹

java讀取XML檔案的四種方式及比較的程式碼實例詳細介紹

Mar 08, 2017 pm 04:42 PM

1)DOM(JAXP Crimson解析器) 
DOM是用與平台和語言無關的方式表示XML文件的官方W3C標準。 DOM是以層次結構組織的節點或資訊片段的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文件和建構層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而DOM被認為是基於樹或基於物件的。 DOM以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。 DOM使用起來也要簡單得多。
2)SAX
SAX處理的優點非常類似串流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取數據時檢查數據,因此不需要將數據儲存在記憶體中。這對於大型文件來說是個巨大的優點。事實上,應用程式甚至不必解析整個文件;它可以在某個條件滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。 
  選擇DOM還是選擇SAX? 對於需要自己編寫程式碼來處理XML文件的開發人員來說, 選擇DOM還是SAX解析模型是一個非常重要的設計決策。 DOM採用建立樹狀結構的方式存取XML文檔,而SAX採用的事件模型。 
  DOM解析器把XML文件轉換成一個包含其內容的樹,並且可以對樹進行遍歷。用DOM解析模型的優點是程式設計容易,開發人員只需要呼叫建樹的指令,然後利用navigation APIs存取所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用DOM解析器的時候需要處理整個XML文檔,所以對效能和記憶體的要求比較高,尤其是遇到很大的XML文件的時候。由於它的遍歷能力,DOM解析器常用於XML文件需要頻繁的改變的服務。
  SAX解析器採用了基於事件的模型,它在解析XML文件的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標籤已經找到。 SAX對記憶體的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文件中所包含的部分資料時,SAX這種擴充能力就得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,很難同時存取同一個文件中的多處不同資料。
3)JDOM http://www.jdom.org/
JDOM的目的是成為Java特定文件模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一個Java特定模型,JDOM一直被大力推廣和促進。正在考慮透過“Java規範請求JSR-102”將它最終用作“Java標準擴展”。從2000年初就已經開始了JDOM開發。
  JDOM與DOM主要有兩方面不同。首先,JDOM僅使用特定類別而不使用介面。這在某些方面簡化了API,但也限制了靈活性。第二,API大量使用了Collections類,簡化了那些已經熟悉這些類別的Java開發者的使用。
  JDOM文件聲明其目的是「使用20%(或更少)的精力解決80%(或更多)Java/XML問題」(根據學習曲線假定為20%)。 JDOM對於大多數Java/XML應用程式來說當然是有用的,而且大多數開發者發現API比DOM容易理解得多。 JDOM還包括對程式行為的相當廣泛檢查以防止使用者做任何在XML中無意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或甚至理解某些情況下的錯誤)。這也許是比學習DOM或JDOM介面都更有意義的工作。
  JDOM本身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔(儘管它還可以將先前構造的DOM表示作為輸入)。它包含一些轉換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文字文件。 JDOM是在Apache許可證變體下發布的開放原始碼。
4)DOM4Jhttp://dom4j.sourceforge.net/ 
雖然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。 
2.. 比較
1)DOM4J表現最好,連Sun的JAXM也在用DOM4J。目前許多開源專案中大量採用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來讀取XML設定檔。如果不考慮可移植性,那就採用DOM4J.
2)JDOM和DOM在效能測試時表現不佳,在測試10M文件時記憶體溢出。在小文檔情況下也值得考慮使用DOM和JDOM。雖然JDOM的開發者已經說明他們期望在正式發行版前專注於性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM仍是一個非常好的選擇。 DOM實作廣泛應用於多種程式語言。它也是許多其它與XML相關的標準的基礎,因為它正式獲得W3C推薦(與基於非標準的Java模型相對),所以在某些類型的專案中可能也需要它(如在JavaScript中使用DOM)。
3)SAX表現較好,這要依賴它特定的解析方式-事件驅動。一個SAX偵測即將到來的XML流,但並沒有載入到記憶體(當然當XML流被讀入時,會有部分文件暫時隱藏在記憶體中)。
data_10k.xml

<?xml version="1.0" encoding="GB2312"?>
<RESULT>
	<VALUE>
		<NO>A1234</NO>
		<ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
	</VALUE>
	<VALUE>
		<NO>B1234</NO>
		<ADDR>四川省XX市XX乡XX村XX组</ADDR>
	</VALUE>
</RESULT>
登入後複製

Dom4j_xml.java

package com.ibm.xml;
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class Dom4j_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			File f = new File("src/com/ibm/xml//data_10k.xml");
			SAXReader reader = new SAXReader();
			Document doc = reader.read(f);
			Element root = doc.getRootElement();
			Element foo;
			for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
				foo = (Element) i.next();
				System.out.print("车牌号码:" + foo.elementText("NO"));
				System.out.println("车主地址:" + foo.elementText("ADDR"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
登入後複製
JDom_xml.java
package com.ibm.xml;

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class JDom_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(new File(
					"src/com/ibm/xml//data_10k.xml"));
			Element foo = doc.getRootElement();
			List allChildren = foo.getChildren();
			for (int i = 0; i < allChildren.size(); i++) {
				System.out.print("车牌号码:"
						+ ((Element) allChildren.get(i)).getChild("NO")
								.getText());
				System.out.println("车主地址:"
						+ ((Element) allChildren.get(i)).getChild("ADDR")
								.getText());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
登入後複製
Dom_xml.java
package com.ibm.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Dom_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			File f = new File("src/com/ibm/xml//data_10k.xml");
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(f);
			NodeList nl = doc.getElementsByTagName("VALUE");
			for (int i = 0; i < nl.getLength(); i++) {
				System.out.print("车牌号码:"
						+ doc.getElementsByTagName("NO").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("车主地址:"
						+ doc.getElementsByTagName("ADDR").item(i)
								.getFirstChild().getNodeValue());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
登入後複製
#SAX_xml.java
package com.ibm.xml;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAX_xml extends DefaultHandler {
	java.util.Stack<String> tags = new java.util.Stack<String>();

	public SAX_xml() {
		super();
	}

	public static void main(String args[]) {
		long lasting = System.currentTimeMillis();
		try {
			SAXParserFactory sf = SAXParserFactory.newInstance();
			SAXParser sp = sf.newSAXParser();
			SAX_xml reader = new SAX_xml();
			sp.parse(new InputSource("src/com/ibm/xml//data_10k.xml"), reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("运行时间:" + (System.currentTimeMillis() - lasting)
				+ "毫秒");
	}

	public void characters(char ch[], int start, int length)
			throws SAXException {
		String tag = tags.peek();
		if (tag.equals("NO")) {
			System.out.print("车牌号码:" + new String(ch, start, length));
		}
		if (tag.equals("ADDR")) {
			System.out.println("地址:" + new String(ch, start, length));
		}
	}

	public void startElement(String uri, String localName, String qName,
			Attributes attrs) {
		tags.push(qName);
	}
}
登入後複製
.

以上是java讀取XML檔案的四種方式及比較的程式碼實例詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

Java 變得簡單:程式設計能力的初學者指南 Java 變得簡單:程式設計能力的初學者指南 Oct 11, 2024 pm 06:30 PM

JavaMadeSimple:ABeginner'sGuidetoProgrammingPower簡介Java是一種強大的程式語言,廣泛應用於從行動應用程式到企業級系統的各種領域。對於初學者來說,Java的文法簡潔易懂,是學習程式設計的理想選擇。基本語法Java使用基於類別的物件導向程式設計範式。類別是將相關資料和行為組織在一起的範本。以下是一個簡單的Java類別範例:publicclassPerson{privateStringname;privateintage;

Java程序將元素插入堆棧的底部 Java程序將元素插入堆棧的底部 Feb 07, 2025 am 11:59 AM

堆棧是遵循LIFO(最後,首先)原理的數據結構。換句話說,我們添加到堆棧中的最後一個元素是第一個要刪除的元素。當我們將(或推)元素添加到堆棧中時,它們就會放在頂部;即最重要的

See all articles