Java語言中XML解析技術如何測試?
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>
測試方法:
采用JSP端調用Bean(至于為什麼采用JSP來調用,請參考:。
Java解析XML的四種方法是哪些?
dinghl * 定義XML文檔建立與解析的接口
*/ public interface XmlDocument {
* 建立XML文檔
* @param fileName 檔案全路徑名稱
*/ public void createXml(String fileName);
* 解析XML文檔
* @param fileName 檔案全路徑名稱
*/ public void parserXml(String fileName);
編輯特别推薦:
小試Hessian實作webservice
用哈弗曼編碼實作壓縮軟體
40個輕量級JavaScript庫介紹。
在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解析
dom是解析xml的底層接口之一(另一種是sax)
而jdom和dom4j則是基于底層api的更進階封裝
dom是通用的,而jdom和dom4j則是面向java語言的
DOM 是用與平台和語言無關的方式表示 XML 文檔的官方 W3C 标準。DOM 是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由于它是基于資訊層次的,因而 DOM 被認為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優點。首先,由于樹在記憶體中是持久的,是以可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
XML的四種解析器(dom,sax,jdom,dom4j)原理及性能比較(轉自zsq)
1、DOM
DOM 是用與平台和語言無關的方式表示 XML 文檔的官方 W3C 标準。DOM 是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由于它是基于資訊層次的,因而 DOM 被認為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優點。
首先,由于樹在記憶體中是持久的,是以可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
另一方面,對于特别大的文檔,解析和加載整個文檔可能很慢且很耗資源,是以使用其他手段來處理這樣的資料會更好。這些基于事件的模型,比如 SAX。
2、SAX
這種處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由于應用程式隻是在讀取資料時檢查資料,是以不需要将資料存儲在記憶體中。這對于大型文檔來說是個巨大的優點。事實上,應用程式甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
3、選擇 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 解析器的時候編碼工作會比較困難,而且很難同時通路同一個文檔中的多處不同資料。
4、JDOM
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 許可證變體下釋出的開放源碼。
5、DOM4J
雖然 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。
6、總述
JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時記憶體溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它确實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實作廣泛應用于多種程式設計語言。它還是許多其它與 XML 相關的标準的基礎,因為它正式獲得 W3C 推薦(與基于非标準的 Java 模型相對),是以在某些類型的項目中可能也需要它(如在 javascript 中使用 DOM)。
SAX表現較好,這要依賴于它特定的解析方式。一個 SAX 檢測即将到來的XML流,但并沒有載入到記憶體(當然當XML流被讀入時,會有部分文檔暫時隐藏在記憶體中)。
無疑,DOM4J是最好的,目前許多開源項目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置檔案。如果不考慮可移植性,那就采用DOM4J吧!一般情況是使用dom,sax這是2個開原的插件,你隻要在你的程式裡導入就可以了jdom或者dom4j的jar包就可以了。
下載下傳的這2個插件都有自己的網站,建議使用jdom這個比較簡單的,至于如何讀和寫,網上有很多的例子.
xml作為全球通用的結構化語言,越來越受人們青睐,各種開發平台(比如microsoftstudio系列、oracle系列、inpriseborland系列等)也都把支援xml開發作為宣傳口号之一。由于筆者所從事的電子政務開發較早的引入了xml,是以嘗到了許多甜頭,在許多項目中利用xml資料交換資訊,省去了許多麻煩事,不用制定繁鎖的資料格式,利用xml資料易于表達,也利于一線開發者跟蹤調試。
筆者先前也曾發表過相關的文章,比如《簡析delphi中的xml程式設計》一文,有興趣的讀者可以到google網()去搜尋一下,有很多媒體轉載。今天筆者想探讨的是關于java中的xml程式設計,希望對正在或想要學習xml程式設計的新老讀者有所幫助。
在xml應用中,最常用也最實用的莫過于xml檔案的讀寫,是以筆者通過一個簡單的xml檔案讀寫來作簡要分析。可以在任何文本編輯器中先建立如下結構的xml檔案,類似于html結構,但xml語義比較嚴格,起始标記必須配對,比如"〈學生花名冊〉"與"〈/學生花名冊〉"對應,空格多少可不必在意,但一般都以縮格形式書寫,便于閱讀。把此檔案命名為input.xml,可以在任何支援xml的浏覽器中打開測試一下,如果輸入正确,在浏覽中可以看到此檔案的樹形表示結構。如果您還對xml結構感到比較陌生,建議先看看《簡析delphi中的xml程式設計》一文中關于xml檔案的說明。
input.xml
[code:1:af65f1d5b3]
李華姓名>
14年齡>
6287555電話>
學生>
張三姓名>
16年齡>
8273425電話>
學生>
學生花名冊>
[/code:1:af65f1d5b3]
準備工作做完後,接着就開始寫實質性的java代碼了。為儲存從xml檔案讀入的資訊,需要先建一個簡單的bean來儲存學生資訊,命名為studentbean,代碼如下所示:
studentbean.java
[code:1:af65f1d5b3]
publicclassstudentbean{
privatestringsex;//學生性别
privatestringname;//學生姓名
privateintage;//學生年齡
privatestringphone;//電話号碼
publicvoidsetsex(strings){
sex=s;
publicvoidsetname(strings){
name=s;
publicvoidsetage(inta){
age=a;
publicvoidsetphone(strings){
phone=s;
publicstringgetsex(){
returnsex;
publicstringgetname(){
returnname;
publicintgetage(){
returnage;
publicstringgetphone(){
returnphone;
[/code:1:af65f1d5b3]
之後寫xml的測試類,
testxml.java
[code:1:af65f1d5b3]
importjava.io.*;//java基礎包,包含各種io操作
importjava.util.*;//java基礎包,包含各種标準資料結構操作
importjavax.xml.parsers.*;//xml解析器接口
importorg.w3c.dom.*;//xml的dom實作
importorg.apache.crimson.tree.xmldocument;//寫xml檔案要用到
publicclassxmltest{
vectorstudent_vector;
xmltest(){
//為了儲存多個學生資訊,還得借助一個集合類(并不是單純意義上的集合,java中的集合是集合架構的概念,包含向量、清單、哈希表等),這裡采用vector向量類。定義在xmltest測試類中,命名為student_vector。然後定義兩個方法readxmlfile和writexmlfile,實作讀寫操作。代碼如下:
privatevoidreadxmlfile(stringinfile)throwsexception{
//為解析xml作準備,建立documentbuilderfactory執行個體,指定documentbuilder
documentbuilderfactorydbf=documentbuilderfactory.newinstance();
documentbuilderdb=null;
db=dbf.newdocumentbuilder();
catch(parserconfigurationexceptionpce){
system.err.println(pce);//出異常時輸出異常資訊,然後退出,下同
system.exit(1);
documentdoc=null;
doc=db.parse(infile);
catch(domexceptiondom){
system.err.println(dom.getmessage());
system.exit(1);
catch(ioexceptionioe){
system.err.println(ioe);
system.exit(1);
//下面是解析xml的全過程,比較簡單,先取根元素"學生花名冊"
elementroot=doc.getdocumentelement();
//取"學生"元素清單
nodeliststudents=root.getelementsbytagname("學生");
for(inti=0;i
//依次取每個"學生"元素
elementstudent=(element)students.item(i);
//建立一個學生的bean執行個體
studentbeanstudentbean=newstudentbean();
//取學生的性别屬性
studentbean.setsex(student.getattribute("性别"));
//取"姓名"元素,下面類同
nodelistnames=student.getelementsbytagname("姓名");
if(names.getlength()==1){
elemente=(element)names.item(0);
textt=(text)e.getfirstchild();
studentbean.setname(t.getnodeval());
nodelistages=student.getelementsbytagname("年齡");
if(ages.getlength()==1){
elemente=(element)ages.item(0);
textt=(text)e.getfirstchild();
studentbean.setage(integer.parseint(t.getnodeval()));
nodelistphones=student.getelementsbytagname("電話");
if(phones.getlength()==1){
elemente=(element)phones.item(0);
textt=(text)e.getfirstchild();
studentbean.setphone(t.getnodeval());
student_vector.add(studentbean);
privatevoidwritexmlfile(stringoutfile)throwsexception{
//為解析xml作準備,建立documentbuilderfactory執行個體,指定documentbuilder
documentbuilderfactorydbf=documentbuilderfactory.newinstance();
documentbuilderdb=null;
db=dbf.newdocumentbuilder();
catch(parserconfigurationexceptionpce){
system.err.println(pce);
system.exit(1);
documentdoc=null;
doc=db.newdocument();
//下面是建立xml文檔内容的過程,先建立根元素"學生花名冊"
elementroot=doc.createelement("學生花名冊");
//根元素添加上文檔
doc.appendchild(root);
//取學生資訊的bean清單
for(inti=0;i
//依次取每個學生的資訊
studentbeanstudentbean=(studentbean)student_vector.get(i);
//建立"學生"元素,添加到根元素
elementstudent=doc.createelement("學生");
student.setattribute("性别",studentbean.getsex());
root.appendchild(student);
//建立"姓名"元素,添加到學生下面,下同
elementname=doc.createelement("姓名");
student.appendchild(name);
texttname=doc.createtextnode(studentbean.getname());
name.appendchild(tname);
elementage=doc.createelement("年齡");
student.appendchild(age);
texttage=doc.createtextnode(string.valueof(studentbean.
getage()));
age.appendchild(tage);
elementphone=doc.createelement("電話");
student.appendchild(phone);
texttphone=doc.createtextnode(studentbean.getphone());
phone.appendchild(tphone);
//把xml文檔輸出到指定的檔案
fileoutputstreamoutstream=newfileoutputstream(outfile);
outputstreamwriteroutwriter=newoutputstreamwriter(outstream);
((xmldocument)doc).write(outwriter,"gb2312");
outwriter.close();
outstream.close();
//最後加入測試主函數,如下:
publicstaticvoidmain(string[]args)throwsexception{
//建立測試執行個體
xmltestxmltest=newxmltest();
//初始化向量清單
xmltest.student_vector=newvector();
system.out.println("開始讀input.xml檔案");
xmltest.readxmlfile("input.xml");
system.out.println("讀入完畢,開始寫output.xml檔案");
xmltest.writexmlfile("output.xml");
system.out.println("寫入完成");