#
摘要: 一、簡(jiǎn)介
JUnit是一款由Erich Gamma(《設(shè)計(jì)模式》的作者)和Kent Beck(極限編程的提出者)編寫的開源的回歸測(cè)試框架,供Java編碼人員做單元測(cè)試之用。當(dāng)前版本4.1,可以從www.junit.org網(wǎng)站上獲得。與早期的JUnit 3相比,JUnit 4.1依賴于Java 5.0的新特性,因此無法兼容于jdk 1.4,可以說是一...
閱讀全文
public static String getFileCreateDate(File _file){
File file=_file;
try{
Process ls_proc = Runtime.getRuntime().exec("cmd.exe /c dir " + file.getAbsolutePath() + " /tc");
DataInputStream in = new DataInputStream(ls_proc.getInputStream());
for (int i = 0; i < 5; i++ )
{
in.readLine();
}
String stuff = in.readLine();
StringTokenizer st = new StringTokenizer(stuff);
String dateC = st.nextToken();
String time=st.nextToken();
in.close();
return dateC;
}catch (Exception e){
return null;
}
}
在jdk中,F(xiàn)ile的操作并沒有取得文件創(chuàng)建時(shí)間的方法。唯一提供提供的方法是
lastModified()返回long值。犧牲創(chuàng)建時(shí)間的方法實(shí)在是為了滿足跨平臺(tái)的需要。但在windows環(huán)境中,需要取得文件創(chuàng)建時(shí)間的情況是存在的。
實(shí)現(xiàn)的辦法是通過windows本地命令行來取得創(chuàng)建日期。以上代碼主要取自http://forum.java.sun.com/thread.jspa?threadID=311281&messageID=1247450
但此文提供的原始代碼尚有不足,無法解析帶有空格的文件夾名,如:C:\\Program files\等,解決辦法是在路徑前后加上",執(zhí)行語(yǔ)句變?yōu)?span id="_50_603_Open_Text">
"cmd.exe /c dir "" + file.getAbsolutePath() + "" /tc"。以上方法返回的是我實(shí)際程序需要的數(shù)據(jù)格式,大家有興趣可以自行改編
typedef是c/c++代碼中經(jīng)常用到的一個(gè)關(guān)鍵字. 他的主要做用是給變量類型定義一個(gè)別名.
從而達(dá)到代碼簡(jiǎn)化, 促進(jìn)跨平臺(tái)開發(fā)的目的.
下面是typedef的最經(jīng)常的用法:
typedef struct{
int a;
int b;
}MY_TYPE;
這里把一個(gè)未命名結(jié)構(gòu)直接取了一個(gè)叫MY_TYPE的別名, 這樣如果你想定義結(jié)構(gòu)的實(shí)例的時(shí)候就可以這樣:
MY_TYPE tmp;
這是typedef的第一種用法. 比較簡(jiǎn)單. 就是 typedef 原變量類型 別名
相似的例子:
typedef unsigned long DWORD; 無符號(hào)長(zhǎng)型
typedef void far *LPVOID; //void far *是原變量類型, 表示一個(gè)void 型指針(far 在32位系統(tǒng)里面已經(jīng)沒有意義了)
等等
typedef還有第二種用法. 可能這種用法初學(xué)者沒有接觸過.
比如:
typedef int (*MYFUN)(int, int);
這種用法一般用在給函數(shù)定義別名的時(shí)候.(其實(shí)質(zhì)還是和上面的用法一樣的)
上面的例子定義MYFUN 是一個(gè)函數(shù)指針, 函數(shù)類型是帶兩個(gè)int 參數(shù), 返回一個(gè)int
在分析這種形式的定義的時(shí)候可以用下面的方法:
先去掉typedef 和別名, 剩下的就是原變量的類型.
比如上面的例子:
去掉typedef和MYFUN以后就剩:
int (*)(int, int)
讀了我前面一課里面討論的 <<細(xì)說如何確定一個(gè)變量的類型>>的朋友應(yīng)該很容易就得出這個(gè)類型指的時(shí)是
一個(gè)函數(shù)指針, 函數(shù)類型是帶兩個(gè)int 參數(shù), 返回一個(gè)int
If your tarball is compressed with bzip2, run
$
tar xvjf linux-x.y.z.tar.bz2
If it is compressed with GNU zip, run
$ tar xvzf linux-x.y.z.tar.gz
C語(yǔ)言宏定義技巧(轉(zhuǎn))
寫好C語(yǔ)言,漂亮的宏定義很重要,使用宏定義可以防止出錯(cuò),提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟件中常用得宏定義。。。。。。
1,防止一個(gè)頭文件被重復(fù)包含
#ifndef COMDEF_H
#define COMDEF_H
//頭文件內(nèi)容
#endif
2,重新定義一些類型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
//下面的不建議使用
typedef unsigned char byte; /* Unsigned 8 bit value type. */
typedef unsigned short word; /* Unsinged 16 bit value type. */
typedef unsigned long dword; /* Unsigned 32 bit value type. */
typedef unsigned char uint1; /* Unsigned 8 bit value type. */
typedef unsigned short uint2; /* Unsigned 16 bit value type. */
typedef unsigned long uint4; /* Unsigned 32 bit value type. */
typedef signed char int1; /* Signed 8 bit value type. */
typedef signed short int2; /* Signed 16 bit value type. */
typedef long int int4; /* Signed 32 bit value type. */
typedef signed long sint31; /* Signed 32 bit value */
typedef signed short sint15; /* Signed 16 bit value */
typedef signed char sint7; /* Signed 8 bit value */
3,得到指定地址上的一個(gè)字節(jié)或字
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
4,求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5,得到一個(gè)field在結(jié)構(gòu)體(struct)中的偏移量
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */
6,得到一個(gè)結(jié)構(gòu)體中field所占用的字節(jié)數(shù)
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
7,按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word
#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )
8,按照LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié)
#define FLOPW( ray, val ) \
(ray)[0] = ((val) / 256); \
(ray)[1] = ((val) & 0xFF)
9,得到一個(gè)變量的地址(word寬度)
#define B_PTR( var ) ( (byte *) (void *) &(var) )
#define W_PTR( var ) ( (word *) (void *) &(var) )
10,得到一個(gè)字的高位和低位字節(jié)
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
11,返回一個(gè)比X大的最接近的8的倍數(shù)
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
12,將一個(gè)字母轉(zhuǎn)換為大寫
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
13,判斷字符是不是10進(jìn)值的數(shù)字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
14,判斷字符是不是16進(jìn)值的數(shù)字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
15,防止溢出的一個(gè)方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
16,返回?cái)?shù)組元素的個(gè)數(shù)
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
17,返回一個(gè)無符號(hào)數(shù)n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
( (dword)(val) & (dword)((mod_by)-1) )
18,對(duì)于IO空間映射在存儲(chǔ)空間的結(jié)構(gòu),輸入輸出處理
#define inp(port) (*((volatile byte *) (port)))
#define inpw(port) (*((volatile word *) (port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
[2005-9-9添加]
19,使用一些宏跟蹤調(diào)試
A N S I標(biāo)準(zhǔn)說明了五個(gè)預(yù)定義的宏名。它們是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
如果編譯不是標(biāo)準(zhǔn)的,則可能僅支持以上宏名中的幾個(gè),或根本不支持。記住編譯程序
也許還提供其它預(yù)定義的宏名。
_ L I N E _及_ F I L E _宏指令在有關(guān)# l i n e的部分中已討論,這里討論其余的宏名。
_ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時(shí)的日期。
源代碼翻譯到目標(biāo)代碼的時(shí)間作為串包含在_ T I M E _中。串形式為時(shí):分:秒。
如果實(shí)現(xiàn)是標(biāo)準(zhǔn)的,則宏_ S T D C _含有十進(jìn)制常量1。如果它含有任何其它數(shù),則實(shí)現(xiàn)是
非標(biāo)準(zhǔn)的。
可以定義宏,例如:
當(dāng)定義了_DEBUG,輸出數(shù)據(jù)信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
20,宏定義防止使用是錯(cuò)誤
用小括號(hào)包含。
例如:#define ADD(a,b) (a+b)
用do{}while(0)語(yǔ)句包含多語(yǔ)句防止錯(cuò)誤
例如:#difne DO(a,b) a+b;\
a++;
應(yīng)用時(shí):if(….)
DO(a,b); //產(chǎn)生錯(cuò)誤
else
解決方法: #difne DO(a,b) do{a+b;\
a++;}while(0)
|
gcc :C語(yǔ)言的編譯器
g++:C++/C語(yǔ)言的編譯器
gcc :C語(yǔ)言的編譯器
g++:C++/C語(yǔ)言的編譯器
#include 頭文件一般有兩種格式
一種是 <> 還有一種是""
如:
#include <iostream.h>
#include "myfile.h"
兩者的區(qū)別在于:
如果文件名用尖括號(hào)<>括起來,表示文件是一個(gè)標(biāo)準(zhǔn)頭文件,查找過程會(huì)預(yù)定義目錄.
如果文件名用一對(duì)引號(hào)""括起來,表明文件是用戶提供的頭文件查找該文件時(shí)將從當(dāng)前文件目錄開始.
所以用標(biāo)準(zhǔn)頭文件時(shí)用<>
用自定義的頭文件時(shí)用""
關(guān)于gcc的參數(shù) -Idirname
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況∶
A)#include
B)#include “myinc.h”
其中,A類使用尖括號(hào)(< >),B類使用雙引號(hào)(“ ”)。
對(duì)于A類,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,
而對(duì)于B類,cpp在當(dāng)前目錄中搜尋頭文件,這個(gè)選項(xiàng)的作用是告訴cpp,如果在當(dāng)前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設(shè)計(jì)中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個(gè)使用-I選項(xiàng)給出搜索路徑
第一:首先介紹一下SAX,DOM,JAXP,JDOM,DOM4J的基本知識(shí):
1、sax、dom是兩種對(duì)xml文檔進(jìn)行分析的方法(沒有具體的實(shí)現(xiàn),只有接口)
所以不是解釋器,如果光有他們,你是完成不了對(duì)xml文檔的處理的。
sax的包是org.xml.sax
dom的包是org.w3c.dom
包的名稱很重要,它有助于你理解他們之間的關(guān)系。
2、jaxp是api,他封裝了sax\dom兩種接口。并在sax\dom的基礎(chǔ)之上,作了一套比較簡(jiǎn)單的api以供開發(fā)人員使用。
jaxp的包是javax.xml.parsers
可以看看jaxp的源文件,它的文件中包含了對(duì)sax或者dom的引用(import)
jaxp也不是具體的實(shí)現(xiàn),他只是一套api。如果你僅僅有jaxp那是無法工作的
(其實(shí)jaxp只是完成對(duì)sax、dom的包裝,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也就是設(shè)計(jì)模式中的工廠模式,他的好處就是具體的對(duì)象( 解釋器)建立由子類完成)
3、xerces解釋器(號(hào)稱地球上最快的xml解釋器)
在xerces中對(duì)jaxp中定義的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactory進(jìn)行了繼承(extends)對(duì)應(yīng)SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
這就是為什么你的classpath中只要有xerces.jar(其中包含了sax dom jaxp )和 xercesImpl.jar就可以的原因了.
4、什么時(shí)候可以用別的解釋器 比如crimson呢
他也是和xerces一樣 是解釋器,很簡(jiǎn)單,用crimson.jar 替代xercesImpl.jar
5、jdom和dom4j
W3C的DOM標(biāo)準(zhǔn)API難用的讓人想撞墻,于是有一幫人開發(fā)Java專用的XML API目的是為了便于使用,這就是jdom的由來,開發(fā)到一半的時(shí)候,另一部分人又分了出來,他們有自己的想法,于是他們就去開發(fā)dom4j,形成了今天這樣兩個(gè)API,至于他們之間的性能,jdom全面慘敗,dom4j大獲全勝。我覺得jdom和dom4j就相當(dāng)于sax/dom+jaxp,具體的解釋器可以選擇。
第二:再介紹一下,dom,sax,jdom,dom4j的技術(shù)特點(diǎn):
1: DOM
DOM 是用與平臺(tái)和語(yǔ)言無關(guān)的方式表示 XML 文檔的官方 W3C 標(biāo)準(zhǔn)。DOM 是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認(rèn)為是基于樹或基于對(duì)象的。DOM 以及廣義的基于樹的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡(jiǎn)單得多。
另一方面,對(duì)于特別大的文檔,解析和加載整個(gè)文檔可能很慢且很耗資源,因此使用其他手段來處理這樣的數(shù)據(jù)會(huì)更好。這些基于事件的模型,比如 SAX。
2:SAX
這種處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
3: 選擇 DOM 還是選擇 SAX ?
對(duì)于需要自己編寫代碼來處理 XML 文檔的開發(fā)人員來說,選擇 DOM 還是 SAX 解析模型是一個(gè)非常重要的設(shè)計(jì)決策。
DOM 采用建立樹形結(jié)構(gòu)的方式訪問 XML 文檔,而 SAX 采用的事件模型。
DOM 解析器把 XML 文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用 DOM 解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問所需的樹節(jié)點(diǎn)來完成任務(wù)。可以很容易的添加和修改樹中的元素。然而由于使用 DOM 解析器的時(shí)候需要處理整個(gè) XML 文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的 XML 文件的時(shí)候。由于它的遍歷能力,DOM 解析器常用于 XML 文檔需要頻繁的改變的服務(wù)中。
SAX 解析器采用了基于事件的模型,它在解析 XML 文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX 對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag。特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX 這種擴(kuò)展能力得到了更好的體現(xiàn)。但用 SAX 解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問同一個(gè)文檔中的多處不同數(shù)據(jù)。
4:jdom http://www.jdom.org
JDOM 的目的是成為 Java 特定文檔模型,它簡(jiǎn)化與 XML 的交互并且比使用 DOM 實(shí)現(xiàn)更快。由于是第一個(gè) Java 特定模型,JDOM 一直得到大力推廣和促進(jìn)。正在考慮通過“Java 規(guī)范請(qǐng)求 JSR-102”將它最終用作“Java 標(biāo)準(zhǔn)擴(kuò)展”。從 2000 年初就已經(jīng)開始了 JDOM 開發(fā)。
JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡(jiǎn)化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,簡(jiǎn)化了那些已經(jīng)熟悉這些類的 Java 開發(fā)者的使用。
JDOM 文檔聲明其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問題”(根據(jù)學(xué)習(xí)曲線假定為 20%)。JDOM 對(duì)于大多數(shù) Java/XML 應(yīng)用程序來說當(dāng)然是有用的,并且大多數(shù)開發(fā)者發(fā)現(xiàn) API 比 DOM 容易理解得多。JDOM 還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶做任何在 XML 中無意義的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí) DOM 或 JDOM 接口都更有意義的工作。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器來解析和驗(yàn)證輸入 XML 文檔(盡管它還可以將以前構(gòu)造的 DOM 表示作為輸入)。它包含一些轉(zhuǎn)換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發(fā)布的開放源碼。
5: DOM4J http://dom4j.sourceforge.net/
雖然 DOM4J 代表了完全獨(dú)立的開發(fā)結(jié)果,但最初,它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過 DOM4J API 和標(biāo)準(zhǔn) DOM 接口具有并行訪問功能。從 2000 下半年開始,它就一直處于開發(fā)之中。
為支持所有這些功能,DOM4J 使用接口和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復(fù)雜的 API 的代價(jià),但是它提供了比 JDOM 大得多的靈活性。
在添加靈活性、XPath 集成和對(duì)大文檔處理的目標(biāo)時(shí),DOM4J 的目標(biāo)與 JDOM 是一樣的:針對(duì) Java 開發(fā)者的易用性和直觀操作。它還致力于成為比 JDOM 更完整的解決方案,實(shí)現(xiàn)在本質(zhì)上處理所有 Java/XML 問題的目標(biāo)。在完成該目標(biāo)時(shí),它比 JDOM 更少?gòu)?qiáng)調(diào)防止不正確的應(yīng)用程序行為。
DOM4J 是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。
最后:我建議用dom4j
JDOM 和 DOM 在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試 10M 文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發(fā)者已經(jīng)說明他們期望在正式發(fā)行版前專注性能問題,但是從性能觀點(diǎn)來看,它確實(shí)沒有值得推薦之處。另外,DOM 仍是一個(gè)非常好的選擇。DOM 實(shí)現(xiàn)廣泛應(yīng)用于多種編程語(yǔ)言。它還是許多其它與 XML 相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),因?yàn)樗将@得 W3C 推薦(與基于非標(biāo)準(zhǔn)的 Java 模型相對(duì)),所以在某些類型的項(xiàng)目中可能也需要它(如在 javascript 中使用 DOM)。
SAX表現(xiàn)較好,這要依賴于它特定的解析方式。一個(gè) SAX 檢測(cè)即將到來的XML流,但并沒有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。
無疑,DOM4J是最好的,目前許多開源項(xiàng)目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。如果不考慮可移植性,那就采用DOM4J吧!
四種xml操作方式的基本使用方法:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>蘇A88888</NO>
<ADDR>南京市新街口10號(hào)</ADDR>
</VALUE>
<VALUE>
<NO>蘇A99999</NO>
<ADDR>南京市山西路20號(hào)</ADDR>
</VALUE>
</RESULT>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("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("車牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運(yùn)行時(shí)間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號(hào)碼:" + 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);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("車牌號(hào)碼:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("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("車牌號(hào)碼:" + foo.elementText("NO"));
System.out.println("車主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
)
Introduction
FOAF-a-matic 是一個(gè)簡(jiǎn)單的 Javascript 應(yīng)用程式。它讓你能夠建立關(guān)於你自己的 FOAF("Friend-of-A-Friend")檔案。你可以參考 Edd Dumbill 的文章:「XML 觀察:使用 XML 和 RDF 找到朋友」,拜訪RDFWeb 的 FOAF 首頁(yè),以及FOAF 的詞彙描述(FOAF vocabulary description)。
簡(jiǎn)單地說,F(xiàn)OAF 是一種用 XML 跟 RDF 描述你自己的方式:你的名字、電子郵件信箱,以及你的朋友們。 這種方式使其可以被軟體處理,舉例來說可為搜尋引擎所利用,自動(dòng)化地發(fā)現(xiàn)社群與你的資訊。 FOAF 具有帶動(dòng)線上社群許多有趣發(fā)展的潛力。Ben Hammersely 的英國(guó)衛(wèi)報(bào)文章 "Click to the Clique" 提供 關(guān)於這些想法的更進(jìn)一步探討。
FOAF-a-Matic 被用來提供一個(gè)簡(jiǎn)單、快速的方式,產(chǎn)生你自己的 FOAF 檔案。最基本你至少需要提供你的 名字與 email 地址,並且你可以增加任何你想加入的朋友。把朋友加入 FOAF 檔案中是很重要的(當(dāng)然想 寫下多少朋友看你高興啦),因?yàn)楫?dāng) FOAF 彙整器索引你的 FOAF 描述時(shí),他們將會(huì)自動(dòng)把你們一起綁成 一群個(gè)體之間的網(wǎng)絡(luò)關(guān)係。
備註:在本頁(yè)你所輸入的所有資訊,都不會(huì)被存下來或被使用。全部的處理過程全部都是在客戶端進(jìn)行, 以確保你的隱私權(quán)。
如果你對(duì)這個(gè)應(yīng)用有任何的意見,或者關(guān)於 FOAF 的進(jìn)一步問題,為什麼不參加RDFWeb-dev 的通訊論壇?
最新消息:我目前正在撰寫一套建立與管理個(gè)人 FOAF 資料的桌面應(yīng)用程式,FOAF-a-Matic Mark 2 a
你所認(rèn)識(shí)的朋友
告訴 FOAF-a-matic 你所認(rèn)識(shí)的朋友。按下「加入更多朋友」,可以增加空白欄位,輸入更多你所認(rèn)識(shí)朋友的資訊。 如果你的朋友已經(jīng)有了 FOAF 檔案,請(qǐng)把該檔案連結(jié)的資訊(URL)輸入在「SeeAlso」的欄位中。
產(chǎn)生結(jié)果
現(xiàn)在你已經(jīng)輸入了這些資料。你已經(jīng)可以轉(zhuǎn)成 FOAF 檔案了。
接下來呢?
讓別人知道你的 FOAF 檔案
這個(gè)部分最簡(jiǎn)單。只要將產(chǎn)生出來的 FOAF 檔案從剛剛的文字區(qū)複製,貼到一個(gè)檔案裡。將這個(gè)檔案擺在你的網(wǎng)站中, 可以讓所有的人公開下載;建議將檔案名稱取名為 foaf.rdf,然後 google 的搜尋機(jī)器人就會(huì)自動(dòng)取用它,並且還會(huì) 用它自動(dòng)發(fā)現(xiàn)網(wǎng)路上其他的 FOAF 檔案。
你的 FOAF 檔案現(xiàn)在已經(jīng)好了。現(xiàn)在只需要其他人來拜訪並且開始閱讀它...
加入 FOAF 的社群
FOAF 的「查詢」問題(舉例來說,F(xiàn)OAF 相關(guān)的應(yīng)用程式如何發(fā)現(xiàn)你的 FOAF 檔案)目前仍然尚待討論。如果你有任何 的建議,請(qǐng)送到 RDFWeb-dev 通訊論壇。然而有三種可 能的方法加入社群,你可以自己試試看:
使用 link 這個(gè)標(biāo)籤
Aaron Swartz 曾經(jīng)建議使用 HTML 的 link 標(biāo)籤來指向 FOAF 檔案;這種做法和一般部落格的作者們指向他們的 RSS 檔案的方式是相同的。寫法應(yīng)該像 是下面的樣子:
<link rel="meta" type="application/rdf+xml" title="FOAF" href="foaf.rdf" />
從朋友的 FOAF 檔案指過來
另外一種推薦的方式,是請(qǐng)別人(也就是你的朋友)在他們的 FOAF 檔案中標(biāo)記你的 FOAF 檔案。一個(gè) FOAF 的蜘 蛛(搜尋代理程式)可以梭巡所有互相標(biāo)記關(guān)聯(lián)的 FOAF 檔案。你可以依照下列做法修改 FOAF 檔案:
- 修改
rdf:RDF
元素,如下增加 RDF Schema namespace: <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
- 然後透過加入
rdfs:seeAslo
的敘述,增加指向其他的 FOAF 檔案的鏈結(jié): <rdfs:seeAlso rdf:resource="http://www.example.com/friends.xrdf"/> <rdfs:seeAlso rdf:resource="http://www.ldodds.com/webwho.xrdf"/>
最新消息:如果你的朋友們已經(jīng)有了一個(gè) FOAF 檔案,那麼請(qǐng)把它加在上面表單 seeAlso 的欄位中。你也可以推薦朋友 來使用 FOAF-a-matic
使用 FOAF 告示板
一個(gè)查詢 FOAF 檔案最直接的方式,就是有一個(gè)所有人的註冊(cè)中心。我用一個(gè)簡(jiǎn)單的方式來進(jìn)行, 叫做 FOAF 公佈欄(FOAF Bulletin Board)。你只需要瀏 覽 FOAFWiki,並且編輯 FOAFBulletinBoard 的網(wǎng)頁(yè),把你的名字與連到你的 FOAF 檔案的連結(jié)加入到網(wǎng)頁(yè)中。你可以 使用我已經(jīng)加入的資料做為範(fàn)例,在公佈欄頁(yè)面中加入你的資料。
使用 HTML Tidy 與 XSLT 的魔法,意味著例如 Edd Dumbill 的 FOAFbot 這樣的應(yīng)用程式可以處理這個(gè)索引檔案。請(qǐng)瀏覽 FOAFBot 的首頁(yè)關(guān)於如何看它發(fā)揮作用。