我们希望在上面的XML文件中加入一个新的link节点,因而首先还是要读入links.xml文件,构建一个DOM树,然后再对这个DOM树进行修改(添加节点),最后把修改后的DOM写回到links.xml文件中: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();; M) c0 ?6 \. }* |2 L
DocumentBuilder builder=factory.newDocumentBuilder();1 q0 e1 t& M; W \
Document doc=builder.parse("links.xml");
6 ^. ^, n/ x4 y9 |$ q3 v2 h! b1 h doc.normalize();" N. Y0 \' {" |# T
//---取得变量----2 \3 l: W' V0 D0 i
String text="Hanzhong's Homepage";
+ C% D6 ^* P4 f0 @ String url="www.hzliu.com";3 Z2 K) U# B7 h+ z- l
String author="Hzliu Liu";7 p6 o. q7 N# O( `
String discription="A site from Hanzhong Liu, give u lots of suprise!!!";; P" u( @: ?4 S1 P
为了看清重点,简化程序,我们把要加入的内容硬编码到记忆String对象中,而实际操作中,往往利用一个界面来提取用户输入,或者通过JDBC从数据库中提取想要的内容。9 \+ P a' s9 ~* @. O4 F
Text textseg;) j( V2 N( o5 }' u+ c* p H5 s
Element link=doc.createElement("link");
0 X1 @: \# m) A+ q; l- r- F4 ~ 首先应该明了的是,无论什么类型的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创建都是通过Document对象中的createXXX()方法来创建的(XXX代表具体要创建的类型),因此,我们要向XML文档中添加一个link项目,首先要创建一个link对象:# y5 o. e3 n3 {0 [
Element linktext=doc.createElement("text");( i+ L& W. b Z% Q
textseg=doc.createTextNode(text);6 T: J/ O/ ]7 _/ b. \3 u
linktext.appendChild(textseg);; `! p6 v; ^6 f+ z) H" @
link.appendChild(linktext);
. C! d. Q! Q! t, O Element linkurl=doc.createElement("url");6 y& j: q- @, v% z- @: X% u
textseg=doc.createTextNode(url);
: D! z' _% W( u. `1 w# i linkurl.appendChild(textseg);, _6 y1 m' \7 v& `
link.appendChild(linkurl);. i* \2 t$ H7 U1 C! {/ o1 J& S
Element linkauthor=doc.createElement("author");( U- J6 P+ l( j; J) p# G
textseg=doc.createTextNode(author);
2 m& v% w" B; s0 |$ r! H linkauthor.appendChild(textseg);
7 w! H1 i: q: U: @9 q8 w5 G link.appendChild(linkauthor);% w! D q) J5 w3 N1 X- C4 C
java.util.Calendar rightNow = java.util.Calendar.getInstance();
* N8 I$ M, [. ^8 N% }7 x5 `/ P String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));) i8 |# h% U o# a. x f: O% \8 f
String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));$ |/ @' j0 ?) v' x+ a$ T# S& f
String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));
' A4 i' n# F4 y- b4 l6 j2 _; k' p Element linkdate=doc.createElement("date");, e; s. \5 G$ U& K2 Y O! k8 @ ]
Element linkdateday=doc.createElement("day");
8 A$ ^0 ~) {/ _; [- o9 G7 I textseg=doc.createTextNode(day);
+ ]( k* t; D6 U3 n4 p) r) ~$ g linkdateday.appendChild(textseg);
8 N1 n+ g/ l# f( E/ r& B7 A( | Element linkdatemonth=doc.createElement("month");
! V+ |8 u8 U7 K5 F textseg=doc.createTextNode(month);. f4 g& x/ o- z E J
linkdatemonth.appendChild(textseg);/ v7 T+ U3 E& d' f8 P' ~
Element linkdateyear=doc.createElement("year");- F! u9 E' t# k# x$ q) ?% u6 J' M
textseg=doc.createTextNode(year);
% L2 }: f- \5 s4 Y) s, f* g linkdateyear.appendChild(textseg);
& }7 q8 \6 @. [. `6 f) l linkdate.appendChild(linkdateday);" x$ b! e2 ?% g
linkdate.appendChild(linkdatemonth);
& n3 ]* z1 L* Z/ L% P3 c linkdate.appendChild(linkdateyear);
' a3 w9 b+ Z" F7 W# H; A6 q link.appendChild(linkdate);
8 w' T, a$ g8 @8 ^% ^9 W } Element linkdiscription=doc.createElement("description");. S* y7 }4 r4 X* O+ f& {
textseg=doc.createTextNode(discription);
( P4 o; K- I3 K1 l$ B linkdiscription.appendChild(textseg);
5 q1 B% w7 U! N3 x& R$ V3 k h link.appendChild(linkdiscription);
+ p; h2 b+ F3 f# E 创建节点的过程可能有些千篇一律,但需要注意的地方是,对Element中所包含的text(在DOM中,这些text也是代表了一个Node的,因此也必须为它们创建相应的node),不能直接用Element对象的setNodeValue()方法来设置这些text的内容,而需要用创建的Text对象的setNodeValue()方法来设置文本,这样才能够把创建的Element和其文本内容添加到DOM树中。看看前面的代码,你会更好的理解这一点:& S* J8 |# M% ]3 n( S
doc.getDocumentElement().appendChild(link);
2 {& y- w" S9 A' u6 C& b 最后,不要忘记把创建好的节点添加到DOM树中。Document类的getDocumentElement()方法,返回代表文档根节点的Element对象。在XML文档中,根节点一定是唯一的。
6 l1 N& F/ c* S7 d- V: V Q2 L: G1 t$ \ TransformerFactory tFactory =TransformerFactory.newInstance();4 ~1 \! D. B0 ]- a
Transformer transformer = tFactory.newTransformer();
6 _9 O) T7 o/ _2 z, \1 k3 s DOMSource source = new DOMSource(doc);# B- Z( Z Q8 n! U9 u! z
StreamResult result = new StreamResult(new java.io.File("links.xml"));" b1 `' h# c3 {) x1 P8 r0 a1 N8 u
transformer.transform(source, result);
) ?- p$ j6 Y5 g; n) ` 然后就是用XSLT把DOM树输出了。这里的TransformerFactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。实现的方法和DocumentBuilderFactory相同,这儿就不赘述了。Transformer类的transfrom方法接受两个参数、一个数据源Source和一个输出目标Result。这里分别使用的是DOMSource和StreamResult,这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文件中去了。 |