dom4j 是一种解析 xml 文档的开放源代码 xml 框架。本文介绍如何使用包含在 dom4j 中的解析器创建并修改 xml 文档。
$!dmD>+ dom4j api 包含一个解析 xml 文档的工具。本文中将使用这个解析器创建一个示例 xml 文档。清单 1 显示了这个示例 xml 文档,catalog.xml。
7.[ ,EWloA `r,>JI dX 清单 1. 示例 xml 文档(catalog.xml)
Q4];l.)( EsBGWG <?xml version="1.0" encoding="utf-8"?>
VEOz5 1F <catalog>
gyi.A.#0 <!--an xml catalog-->
aHyRqrX <?target instruction?>
<Td:@A} . <journal title="xml zone"
U%LTOMJ publisher="ibm developerworks">
5D#y' w^4TGv=X <article level="intermediate" date="december-2001">
./|Iq]Y <title>java configuration with xml schema</title>
2=|YLN <author>
r&\dKnt <firstname>marcello</firstname>
Ex=,}^\W1 <lastname>vitaletti</lastname>
}5^3 *- 1 </author>
l%mz(k1 </article>
~de~G ~U </journal>
qXwXDm\g </catalog>
qVd&RV]b c2wH( 6hU6enki5 cNP{B 然后使用同一个解析器修改 catalog.xml,清单 2 是修改后的 xml 文档,catalog-modified.xml。
-7{wXP$ sg$KA @_ 清单 2. 修改后的 xml 文档(catalog-modified.xml)
UqWr\t) T/[%j57 <?xml version="1.0" encoding="utf-8"?>
0i&. vob <catalog>
Me/PybS <!--an xml catalog-->
dE*W89R A <?target instruction?>
+ R2 :y <journal title="xml zone"
F"mhJp publisher="ibm developerworks">
G]()J%c-s wY\{ s9/ <article level="introductory" date="october-2002">
pEFq\I aBA <title>create flexible and extensible xml schemas</title>
p{;xElr <author>
dB|mm" , <firstname>ayesha</firstname>
dx= [/ <lastname>malik</lastname>
at=KN </author>
jq6wZ@h </article>
Pfl{"8vS7 </journal>
[8!{,Z </catalog>
I@6*kE*g gXq1 ;$MRRl%30 4 , .[ 与 w3c dom api 相比,使用 dom4j 所包含的解析器的好处是 dom4j 拥有本地的 xpath 支持。dom 解析器不支持使用 xpath 选择节点。
#d*)cm7 Q|qk[3 本文包括以下几个部分:
iTE(?k F Wjc"y 预先设置
wwQfkCa 创建文档
zC9YZ 修改文档
qnths ! 预先设置
1sLqZn(> ;)HX2 这个解析器可以从
http://dom4j.org 获取。通过设置使 dom4j-1.4/dom4j-full.jar 能够在 classpath 中访问,该文件中包括 dom4j 类、xpath 引擎以及 sax 和 dom 接口。如果已经使用了 jaxp 解析器中包含的 sax 和 dom 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar 。 dom4j.jar 包括 dom4j 类和 xpath 引擎,但是不含 sax 与 dom 接口。
O]_ ] K] 17}e4xll Z 7u]][| ZW|o:q#j FzSGo K 1jpF?JvP< 回页首
)qeuO+ xa}F + )V lZg H"*4 Kv8m6u{ 创建文档
/j ovyA (x> tzsX 本节讨论使用 dom4j api 创建 xml 文档的过程,并创建示例 xml 文档 catalog.xml。
}"Y^}/s6 #l:%s\,I 使用 import 语句导入 dom4j api 类:
IIi!gZ\F o3uU.B8/ NSS"A&P import org.dom4j.document;
>]pml94 import org.dom4j.documenthelper;
CY6o0s> import org.dom4j.element;
LlPgWb;=U a\Z%,&}F Vts `R15* trRPU#QA 使用 documenthelper 类创建一个文档实例。 documenthelper 是生成 xml 文档节点的 dom4j api 工厂类。
th}O2F" o?g#$U document document = documenthelper.createdocument();
jZ!hEId)c |%N`F^koo $;7dt 7+ 使用 addelement() 方法创建根元素 catalog 。 addelement() 用于向 xml 文档中增加元素。
\k#ve_X3x cq y element catalogelement = document.addelement("catalog");
G*~`(T {AHAuEN9 6lSi2 在 catalog 元素中使用 addcomment() 方法添加注释“an xml catalog”。
N" Rd)W "+pr catalogelement.addcomment("an xml catalog");
"dC# $?27r f>5+ ({L_ bz7in1O $ 在 catalog 元素中使用 addprocessinginstruction() 方法增加一个处理指令。
: 6!2h<I >oCW Put catalogelement.addprocessinginstruction("target","text");
2-@577\O8_ y!:s7)! H}{B\7aU 在 catalog 元素中使用 addelement() 方法增加 journal 元素。
)M``oG7sQ ^YmH.-G element journalelement = catalogelement.addelement("journal");
,r+*! '*:D> Ro 6c#{dSU 使用 addattribute() 方法向 journal 元素添加 title 和 publisher 属性。
eXB,qQ XO8e*vz~fW journalelement.addattribute("title", "xml zone");
z6R`Z8i2 journalelement.addattribute("publisher", "ibm developerworks");
v F`7ecmS 86Y\u/-"n h;p?aT, 向 article 元素中添加 journal 元素。
YkLQ DhR{ y"<D element articleelement=journalelement.addelement("article");
y+2ciF&\M T!yWlT~aR PW^II5P 为 article 元素增加 level 和 date 属性。
6=>g8Pb 7x6` tn)Kz articleelement.addattribute("level", "intermediate");
~;s[\J articleelement.addattribute("date", "december-2001");
4S8f8px .WXf=&8m+ h3>7wa;x 向 article 元素中增加 title 元素。
g_]hA o>M |9K element titleelement=articleelement.addelement("title");
3FqZ4boU%% ffFrvkufE 9}FZ 使用 settext() 方法设置 article 元素的文本。
F"mV~)^8 X7<e>vk titleelement.settext("java configuration with xml schema");
)y\v Wo:~ <zR~R~l '`n? $6 在 article 元素中增加 author 元素。
ny= yl+pv9 &c='Bm;c element authorelement=articleelement.addelement("author");
4|k)=w K@x 4m8Ete{? ,5N0\ TN<M 在 author 元素中增加 firstname 元素并设置该元素的文本。
p )50se ehP9trL~ element firstnameelement=authorelement.addelement("firstname");
Vex7X:~ firstnameelement.settext("marcello");
mNzP7n.CWO *jUk3lR^B H-<'1G)W 在 author 元素中增加 lastname 元素并设置该元素的文本。
9xE2\`Fk2 3}6%uYmq& element lastnameelement=authorelement.addelement("lastname");
pJU0PKT lastnameelement.settext("vitaletti");
G Nf^H< %VfpC_=Z 'c5 R qf 可以使用 adddoctype() 方法添加文档类型说明。
_m4bBO$ K XmP document.adddoctype("catalog", null,"file://c:/dtds/catalog.dtd");
Zm-LI/D 9kXm-7 5 a;_8Mf 这样就向 xml 文档中增加文档类型说明:
2)Ihs|q/X ;p04,}nF <!doctype catalog system "file://c:/dtds/catalog.dtd">
PRL||iU %|1yjX07e Uz{L|bs-C 如果文档要使用文档类型定义(dtd)文档验证则必须有 doctype。
p 9Eb+} . L[c""K xml 声明 <?xml version="1.0" encoding="utf-8"?> 自动添加到 xml 文档中。
X*|R9a4QK T/cL>~ 清单 3 所示的例子程序 xmldom4j.java 用于创建 xml 文档 catalog.xml。
QkF=z87&| ZNb8~<{m 清单 3. 生成 xml 文档 catalog.xml 的程序(xmldom4j.java)
*py(vv2 JUH8lEt import org.dom4j.document;
$ r$mE import org.dom4j.documenthelper;
$a:_$V import org.dom4j.element;
LmYvkrmm6 import org.dom4j.io.xmlwriter;
{`~Mcd&aK import java.io.*;
K.f8RgY Gl-l_qbz hEC1.<qV public class xmldom4j{
3IlMvcg j^N6tO " qB.@S7 public void generatedocument(){
+EUh IEPN document document = documenthelper.createdocument();
<Ce2!S9rzL element catalogelement = document.addelement("catalog");
Bkj#49.X@ catalogelement.addcomment("an xml catalog");
w{)NG?> catalogelement.addprocessinginstruction("target","text");
50a_R*8 element journalelement = catalogelement.addelement("journal");
j=wp{+J/ journalelement.addattribute("title", "xml zone");
Z2 zd7o journalelement.addattribute("publisher", "ibm developerworks");
3;cc/,uN> eTjP=N: i N@4_;Uu'A element articleelement=journalelement.addelement("article");
-"^#sZJr articleelement.addattribute("level", "intermediate");
YM@ \]E articleelement.addattribute("date", "december-2001");
m#@9' }O element titleelement=articleelement.addelement("title");
Y4Zf>2uv@ titleelement.settext("java configuration with xml schema");
!]HD-/ element authorelement=articleelement.addelement("author");
3=Ka?81KL element firstnameelement=authorelement.addelement("firstname");
/BIu yc4 firstnameelement.settext("marcello");
pgbY+_E*T element lastnameelement=authorelement.addelement("lastname");
k`]+/u>\ lastnameelement.settext("vitaletti");
mi2\N2 ` .FQh] document.adddoctype("catalog",
.ED)WF* null,"file://c:/dtds/catalog.dtd");
8lt<X]-O5 try{
-07"GQZ8vd xmlwriter output = new xmlwriter(
m%RAzfP new filewriter( new file("c:/catalog/catalog.xml") ));
kE(@g output.write( document );
D5,%_{fO output.close();
q9q.~?`/ }
_.oLAe_R~X catch(ioexception e){system.out.println(e.getmessage());}
nJXPg1On$q }
@+:%(\*% #WY @lw w public static void main(string[] argv){
{to d2-0V xmldom4j dom4j=new xmldom4j();
Y{G]A}S8 dom4j.generatedocument();
Fqm=\nSF% }}