導航:首頁 > 編程語言 > javaxml解析工具

javaxml解析工具

發布時間:2024-07-18 09:25:20

java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別

答:4種。(或者說是兩種,因為JDOM和DOM4J是DOM的兩個特殊情況)

1.SAX解析
解析方式是事件驅動機制!

SAX解析器,逐行讀取XML文件解析,每當解析到一個標簽的開始/結束/內容/屬性時,觸發事件。

可以在這些事件發生時,編寫程序進行相應的處理。

優點:

分析能夠立即開始,而不是等待所有的數據被處理。

逐行載入,節省內存,有助於解析大於系統內存的文檔。

有時不必解析整個文檔,它可以在某個條件得到滿足時停止解析。

缺點:

1.單向解析,無法定位文檔層次,無法同時訪問同一個文檔的不同部分數據(因為逐行解析,當解析第n行時,第n-1行)已經被釋放了,無法再對其進行操作)。

2. 無法得知事件發生時元素的層次, 只能自己維護節點的父/子關系。

3. 只讀解析方式, 無法修改XML文檔的內容。

2. DOM解析
是用與平台和語言無關的方式表示XML文檔的官方W3C標准,分析該結構通常需要載入整個 文檔和內存中建立文檔樹模型。程序員可以通過操作文檔樹, 來完成數據的獲取 修改 刪除等。

優點:

文檔在內存中載入, 允許對數據和結構做出更改。訪問是雙向的,可以在任何時候在樹中雙向解析數據。

缺點:

文檔全部載入在內存中 , 消耗資源大。

3. JDOM解析
目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一 個Java特定模型,JDOM一直得到大力推廣和促進。

JDOM文檔聲明其目的是「使用20%(或更少)的精力解決80%(或更多)Java/XML問題」 (根據學習曲線假定為20%)

優點:

使用具體類而不是介面,簡化了DOM的API。

大量使用了Java集合類,方便了Java開發人員。

缺點:

沒有較好的靈活性。

性能不是那麼優異。

4. DOM4J解析
它是JDOM的一種智能分支。它合並了許多超出基本XML文檔表示的功能,包括集成的XPath 支持、XML Schema支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項, DOM4J是一個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一 個開放源代碼的軟體。如今你可以看到越來越多的Java軟體都在使用DOM4J來讀寫XML。

目前許多開源項目中大量採用DOM4J , 例如:Hibernate。

⑵ 在java在如何解析XML文件

在java環境下讀取xml文件的方法主要有4種坦談:DOM、SAX、JDOM、JAXB
1. DOM(Document Object Model)
此方法主要由W3C提供,它將xml文件全部讀入內存中,然後將各個元素組成一棵數據樹,以便快速的訪問各個節點 。 因此非常消耗系統性能 ,對比較大的文檔不適宜採用DOM方法來解析。 DOM API 直接沿襲了 XML 規范。每個結點都可以擴展的基於 Node 的介面,就多態性的觀點來講,它是優秀的,但是在 Java 語言中的應用不方便,並且可讀性不強。
實例:
import javax.xml.parsers.*;
//XML解析器介面
import org.w3c.dom.*;
//XML的DOM實現
import org.apache.crimson.tree.XmlDocument;
//寫讓租碰XML文件要用到

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//允許名字空間
factory.setNamespaceAware(true);
//允許驗證
factory.setValidating(true);
/型如/獲得DocumentBuilder的一個實例
try {
DocumentBuilder builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
System.err.println(pce);
// 出異常時輸出異常信息,然後退出,下同
System.exit(1);
}
//解析文檔,並獲得一個Document實例。
try {
Document doc = builder.parse(fileURI);
} catch (DOMException dom) {
System.err.println(dom.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
System.exit(1);
}

//獲得根節點StuInfo
Element elmtStuInfo = doc.getDocumentElement();

//得到所有student節點
NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(
strNamespace, "student");
for (……){
//當前student節點元素
Element elmtStudent = (Element)nlStudent.item(i);

NodeList nlCurrent = elmtStudent.getElementsByTagNameNS(
strNamespace, "name");
}

⑶ java如何讀取xml節點元素值

java讀取xml節點元素,主要使用java提供的解析xml的工具類SAXParserFactory,如下代碼:

packagexml.xmlreader;
importjava.io.File;
importjava.net.URL;
importjava.util.Properties;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
publicclassCFGParser{//解析xml文件的工具類
privatePropertiesprops;

publicPropertiesgetProps(){
returnprops;
}
publicvoidsetProps(Propertiesprops){
this.props=props;
}

publicvoidparse(Stringfilename)throwsException
{
CFGHandlerhandler=newCFGHandler();

SAXParserFactoryfactory=SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);

SAXParserparser=factory.newSAXParser();

URLconfURL=super.getClass().getClassLoader().getResource(filename);
if(confURL==null){
System.out.println("Can'tfindconfigrationfile.");
return;
}
try
{
parser.parse(confURL.toString(),handler);
this.props=handler.getProps();
}
finally{
factory=null;
parser=null;
handler=null;
}
}

publicvoidparseFile(Stringfilename)
throwsException
{
CFGHandlerhandler=newCFGHandler();

SAXParserFactoryfactory=SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
SAXParserparser=factory.newSAXParser();


Filef=newFile(filename);
if((f==null)||(!f.exists()))
return;
try
{
parser.parse(f,handler);


this.props=handler.getProps();
}
finally{
factory=null;
parser=null;
handler=null;
}
}
}
packagexml.xmlreader;
importjava.util.Properties;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;


{
privatePropertiesprops;
privateStringcurrentSet;
privateStringcurrentName;
=newStringBuffer();

publicCFGHandler()
{
this.props=newProperties();
}

publicPropertiesgetProps(){
returnthis.props;
}

publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)
throwsSAXException
{
this.currentValue.delete(0,this.currentValue.length());
this.currentName=qName;
}

publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException
{
this.currentValue.append(ch,start,length);
}

publicvoidendElement(Stringuri,StringlocalName,StringqName)
throwsSAXException
{
this.props.put(qName.toLowerCase(),this.currentValue.toString().trim());
}
}
xml文件


<?xmlversion="1.0"encoding="UTF-8"?>
<xml-body>
<refresh_userlistdesc="用戶列表刷新間隔時間(秒)">6</refresh_userlist>
<refresh_messagedesc="短消息刷新間隔時間(秒)">10</refresh_message>
<morningbegindesc="上午上班時間">23:00</morningbegin>
<morningenddesc="上午下班時間">12:00</morningend>
<afternoonbegindesc="下午上班時間">18:00</afternoonbegin>
</xml-body>
jsp獲取各個節點的值:
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<html>
<jsp:useBeanid="cfgp"scope="page"class="xml.xmlreader.CFGParser"></jsp:useBean>
<body>
<%
cfgp.parse("kaoqin.xml");
Propertiespro=cfgp.getProps();
StringstTime=pro.getProperty("morningbegin");
StringedTime=pro.getProperty("morningend");
Stringafternoonbegin=pro.getProperty("afternoonbegin");

out.println(stTime+" "+edTime+" "+afternoonbegin);
System.out.println(stTime+" "+edTime+" "+afternoonbegin);
%>
</body>
</html>

⑷ 在java中解析xml有哪幾種方法

1、JDOM生成和解析XML
為減少DOM、SAX的編碼量,出現了JDOM
優點:20-80原則,極大減少了代鍵激碼量。
使用場合:要實現的功能簡單,如解析、創建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。
2、SAX生成和解析XML文檔
為解決DOM的問題,出現了SAX,SAX 事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時發送事件,程序員編寫響應這些事件的代碼,保存數據。
優點:不用事先調入整個文檔,佔用資源少。SAX解析器代碼比DOM解析器代碼小,適於Applet下載。
缺點:不是持久的,事件過後若沒保存數據,那麼數據就握亮鋒丟了。無狀態性,從事件中只能得到文本,但不知該文本屬於哪個元素。
使用場合:Applet。只段晌需XML文檔的少量內容,很少回頭訪問,機器內存少。
3、DOM生成和解析XML文檔
為XML文檔的已解析版本定義了一組介面。解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 介面來操作這個樹結構。
優點:整個文檔樹在內存中,便於操作,支持刪除、修改、重新排列等多種功能。
缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間。
使用場合:一旦解析了文檔還需多次訪問這些數據,硬體資源充足(內存、CPU)。
4、DOM4J生成和解析XML文檔
DOM4J
是一個非常非常優秀的Java XML
API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟體。如今你可以看到越來越多的 Java 軟體都在使用 DOM4J
來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。

⑸ 目前在Java中幾種常用的XML解析器的比較

目前常用的XML的解析器主要有:SAX,DOM,Xerces

1、SAX處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對於大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。另一方面,由於應用程序沒有以任何方式存儲數據,使用SAX來更改數據或在數據流中往後移是不可能的。

2、DOM以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。另一方面,在內存中構造這樣的樹涉及大量的開銷。大型文件完全佔用系統內存容量的情況並不鮮見。此外,創建一棵DOM樹可能是一個緩慢的過程。

3、選擇DOM還是選擇SAX,這取決於下面幾個因素:
應用程序的目的:如果打算對數據作出更改並將它輸出為XML,那麼在大多數情況下,DOM是適當的選擇。並不是說使用SAX就不能更改數據,但是該過程要復雜得多,因為您必須對數據的一份拷貝而不是對數據本身作出更改。
數據容量:對於大型文件,SAX是更好的選擇。數據將如何使用:如果只有數據中的少量部分會被使用,那麼使用SAX來將該部分數據提取到應用程序中可能更好。另一方面,如果您知道自己以後會回頭引用已處理過的大量信息,那麼SAX也許不是恰當的選擇。
對速度的需要:SAX實現通常要比DOM實現更快。
SAX和DOM不是相互排斥的,記住這點很重要。您可以使用DOM來創建SAX事件流,也可以使用SAX來創建DOM樹。事實上,用於創建DOM樹的大多數解析器實際上都使用SAX來完成這個任務!

4、SAX,DOM是兩種對XML文檔進行分析的方法(沒有具體的實現,只有介面),所以不是解釋器,如果光有他們,你是完成不了對xml文檔的處理的。SAX的包是org.xml.sax,DOM的包是org.w3c.dom,包的名稱很重要,它有助於你理解他們之間的關系。

5、jaxp是api,他封裝了sax/dom兩種介面。並在sax/dom的基礎之上,作了一套比較簡單的api以供開發人員使用。jaxp的包是javax.xml.parsers,可以看看jaxp的源文件,它的文件中包含了對sax或者dom的引用(import)jaxp也不是具體的實現,他只是一套api。如果你僅僅有jaxp那是無法工作的,(其實jaxp只是完成對sax、dom的包裝,生成了DocumentBuilderFactory/DocumentBuilder和SAXParserFactorySAXParser。也就是設計模式中的工廠模式,他的好處就是具體的對象(解釋器)建立由子類完成)

6、xerces解釋器(號稱地球上最快的xml解釋器)在xerces中對jaxp中定義的進行了繼承(extends)對應ryImpl這就是為什麼你的classpath中只要有xerces.jar(其中包含了saxdomjaxp)和xercesImpl.jar就可以的原因了.

⑹ JAVA技術:XML配置文件的讀取處理


Java和XML是黃金組合,網上已經有很多文章介紹,XML作為電子商務中數據交換,已經有其不可替代的作用,但是在平時系統開發中,我們不一定都用到數據交換,是不是無法使用XML了?
當然不是,現在已經有一個新趨勢,java程序的配置文件都開始使用XML格式,以前是使用類似windows的INI格式。(Java中也有Propertiesy這樣的類專門處理這樣的屬性配置文件)。使用XML作為Java的配置文件有很多好處,從Tomcat的安裝配置文件和J2ee的配置文件中,我們已經看到XML的普遍應用,讓我們也跟隨流行趨旦飢勢用XML武裝起來。
現在關鍵是如何讀取XML配置模余返文件?有好幾種XML解析器:主要有DOM和SAX ,這些區別網上文章介紹很多。
在apache的XML項目組中,目前有Xerces Xalan Cocoon幾個開毀讓發XML相關技術的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器。
好了,上面都是比較煩人的理論問題,還是趕快切入XML的配置文件的讀取吧。
在我們的程序中,通常要有一些根據主機環境確定的變數。比如資料庫訪問用戶名和密碼,不同的主機可能設置不一樣。只要更改XML配置文件,就可以正常運行。
localhost
sqlname
username
password
上面這個myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目錄下。
我們編制一個Java程序直接讀取,將dbhost dbuser dbpassword提取出來供其他程序訪問資料庫用。
目前使用SAX比較的多,與DOM主要區別是 SAX是一行一行讀取XML文件進行分析,適合比較大文件,DOM是一次性讀入內存,顯然不能對付大文件。這里我們使用SAX解析,由於SAX解析器不斷在發展,網上有不少文章是針對老版本的。如果你使用JDK1.4 ,可以參考 使用SAX處理XML文檔 一文。這里的程序是根據其改進並且經過實踐調試得來的。
對上面myenv.xml讀取的Java程序:
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
//使用DefaultHandler的好處 是 不必陳列出所有方法,
public class ConfigParser extends DefaultHandler {
////定義一個Properties 用來存放 dbhost dbuser dbpassword的值
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
//構建器初始化props
public ConfigParser() {
this.props = new Properties();
}
public Properties getProps() {
return this.props;
}
//定義開始解析元素的方法. 這里是將中的名稱xxx提取出來.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;
}
//這里是將之間的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
//在遇到結束後,將之前的名稱和值一一對應保存在props中
public void endElement(String uri, String localName, String qName) throws SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
上面的這個解析程序比較簡單吧? 其實解析XML就是這么簡單。
現在我們已經將dbhost dbuser dbpassword的值localhost sqlname username password提取了出來。但是這只是在在解析器內部,我們的程序還不能訪問。需要再編制一個程序。
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import .URL;
public class ParseXML{
//定義一個Properties 用來存放 dbhost dbuser dbpassword的值
private Properties props;
//這里的props
public Properties getProps() {
return this.props;
}
public void parse(String filename) throws Exception {
//將我們的解析器對象化
ConfigParser handler = new ConfigParser();
//獲取SAX工廠對象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
//獲取SAX解析
SAXParser parser = factory.newSAXParser();
//得到配置文件myenv.xml所在目錄. tomcat中是在WEB-INF/classes
//下例中BeansConstants是用來存放xml文件中配置信息的類,可以自己代替或定義
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);
try
{
//將解析器和解析對象myenv.xml聯系起來,開始解析
parser.parse(confURL.toString(), handler);
//獲取解析成功後的屬性 以後 我們其他應用程序只要調用本程序的props就可以提取出屬性名稱和值了
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}
}
}
由於我們的XML文件是使用最簡單的形式 ,因此解析器相對簡單,但是這已經足夠對付我們的配置文件了。

閱讀全文

與javaxml解析工具相關的資料

熱點內容
英語分類單詞pdf 瀏覽:184
打開微信時提醒微信已加密 瀏覽:346
svm演算法的論文好寫嗎 瀏覽:838
數學大辭典pdf 瀏覽:179
屏幕上滑兩次退出app怎麼取消 瀏覽:802
聯想伺服器如何開機 瀏覽:437
進入cmd後都有哪些命令 瀏覽:813
pythonmysql資料庫連接池 瀏覽:376
真三國無雙命令 瀏覽:664
警察故事在哪個app可以看 瀏覽:975
單片機8155 瀏覽:399
php音樂播放器代碼 瀏覽:753
java獲取資源文件 瀏覽:448
聯想筆記本怎麼設置私密文件夾 瀏覽:920
phpsql參數化 瀏覽:674
androiduserhandle 瀏覽:665
嬌軀命令小說 瀏覽:180
編譯android10源代碼 瀏覽:568
解壓促進睡眠音樂 瀏覽:460
分時六彩神龍指標源碼 瀏覽:222