4. 修改XML文档 有三项修改任务,依次为:5 d2 P( {: Y4 n. D* P" [9 T" L* h
l 如果book节点中show属性的内容为yes,则修改成no
, S( j9 d5 w8 V0 h: l8 A l 把owner项内容改为Tshinghua,并添加date节点) b& c# B/ [: k+ K
l 若title内容为Dom4j Tutorials,则删除该节点
8 l0 R( x J" h' E6 k+ x) Y O'Reilly2 ]: R' [5 t2 p2 X# U! s
/**
?5 p6 a6 x. a; T/ C" h4 d * 修改XML文件中内容,并另存为一个新文件7 }& e4 J3 R4 g- x& b3 _" b' _
* 重点掌握dom4j中如何添加节点,修改节点,删除节点
1 [ N7 q* W" N- }. I * @param filename 修改对象文件2 c/ U* ^8 v: N0 f( N# t( a; _
* @param newfilename 修改后另存为该文件0 M9 I6 D" T8 m) h/ F9 \7 C2 E
* @return 返回操作结果, 0表失败, 1表成功
5 h. _" S. M( \' p. V* N */3 ]0 B, G+ f3 x) Z
public int ModiXMLFile(String filename,String newfilename){
0 }. o- J" Y+ H) o* F, n' D2 ? int returnValue = 0;% k5 M! s3 B5 o* `0 [/ ~" c# l$ t1 z8 y
try{
4 S# n* e, p; L& {& [5 m6 Q# z7 p( t SAXReader saxReader = new SAXReader();* p6 c& d! t' D
Document document = saxReader.read(new File(filename));3 K8 o9 O& g8 Q8 K9 l, W$ |
/** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
/ Q% c" H& ` G, U5 f9 o /** 先用xpath查找对象 */
. P0 V, m1 E9 L( v/ b; K List list = document.selectNodes("/books/book/@show" );
. E$ V& y5 F4 Z# P: J9 w9 M3 p Iterator iter = list.iterator();
4 Z6 G( j9 H) d: r, V& d while(iter.hasNext()){
" d6 o8 @% B; @: L$ z5 S8 h Attribute attribute = (Attribute)iter.next();( @, z k, m/ [$ {& u+ {; t
if(attribute.getValue().equals("yes")){
Z: Q& H; A1 i attribute.setValue("no");
* M: w/ g* e: }' V }# W: l' r3 y% W$ O+ ^
} R6 S- h% M1 C3 ^ s( v: O9 n9 f
/**
! ^" i' R$ l7 t' O * 修改内容之二: 把owner项内容改为Tshinghua
! L/ J$ K) A2 h6 y" x * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type) @7 m% j, b* |4 W
*/
) s' l" O @$ _7 A list = document.selectNodes("/books/owner" );9 m; z, J, F+ `: s6 P: y4 d
iter = list.iterator();4 } H/ X: R, X/ H B1 x
if(iter.hasNext()){3 o5 L% K0 z9 t y% n' R
Element ownerElement = (Element)iter.next();1 A: A% Z" ^, S
ownerElement.setText("Tshinghua");5 x8 y+ D& C3 c1 C0 }
Element dateElement = ownerElement.addElement("date");
9 W; M" U9 [+ R5 H, a dateElement.setText("2004-09-11");
1 s9 g% D% L/ v4 H dateElement.addAttribute("type","Gregorian calendar");8 b+ m) D k9 y0 X
}
* A2 c. g) {/ w2 b% y7 _; E4 I /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
1 [: q& W: C, h# F1 z8 M0 I list = document.selectNodes("/books/book");
8 \8 H. c. D8 o, ^ iter = list.iterator();
9 J/ p( E! x; m while(iter.hasNext()){$ [" y$ O3 X9 e# ^% ^
Element bookElement = (Element)iter.next();
! Q D" A% z2 Z6 c Iterator iterator = bookElement.elementIterator("title");3 X0 r, p; H4 u
while(iterator.hasNext()){
* p& L% ~2 {6 n, x, R Element titleElement=(Element)iterator.next();
, f! I/ t( r/ ~9 f if(titleElement.getText().equals("Dom4j Tutorials")){
3 |9 a0 E. K6 C" u3 P bookElement.remove(titleElement);
. S4 C0 T2 l8 j& P+ v5 H! p }5 G* c) r8 ^; d3 E
}! J4 b4 V# |8 ~6 F
}5 x+ Y6 L+ b2 q7 |3 |
try{+ J: l6 Y! o# Y) v8 Z
/** 将document中的内容写入文件中 */" u" `$ }1 X- J9 {& s9 t' D" i
XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));$ y( m: p; Y( T1 _0 d. h
writer.write(document);) H& e/ n; L: `, Z
writer.close();
! v: c% N+ p! p* e /** 执行成功,需返回1 */3 P8 x* u+ j0 ?
returnValue = 1;
k6 O0 B& j$ o* M }catch(Exception ex){
, K( O2 C- L. f( `( |# l. j6 d ex.printStackTrace();
* W9 J }7 _" C- v }
% m9 J: C+ P" i2 T% N }catch(Exception ex){
3 c% n2 w; m: s# i2 s ex.printStackTrace();
0 N" r. L" {! y. c- T" o" r }
3 `0 z" G# Q0 c, e6 Z return returnValue;! t( n0 X5 G, _' |+ X: [
}/ f" c* V" T! F# v$ w1 P
说明:
6 P, V) y }: p( ^0 S8 O List list = document.selectNodes("/books/book/@show" );# D% M- t s" j* d6 b3 e
list = document.selectNodes("/books/book");
8 k8 P; f& g/ `0 m! k0 ? 上述代码通过xpath查找到相应内容。
8 A, N6 ]8 _ f. j, B' f 通过setValue()、setText()修改节点内容。
) h$ J, G- U! E6 @* X4 V7 R2 A 通过remove()删除节点或属性。 |