资讯·论坛·笑话大全·QQ表情·设为首页
发新话题
打印

[java] 在Java中实现DOM文档和XML文件互相转换

在Java中实现DOM文档和XML文件互相转换

文简要描述了DOM的概念和内部逻辑结构,实例讲述DOM文档操作和XML文件互相转换的java实现过程。
. _' J2 v" Y! ~( q* ?8 t1 ~我爱电脑技术论坛2 A. l9 ]2 ~' W3 l' p3 G
我爱电脑技术论坛$ ~3 F) P1 ?, {/ n. c5 e: |
1. DOM简介
5 R3 C6 v" B6 Y, n- j- L  W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛! `; C) v& H3 _/ d7 {* o

2 ?  H& m: @  q- y我爱电脑技术社区--打造最好的电脑技术自学交流平台目前,W3C已于2000年11月13日推出了规范DOM level 2。文档对象模型(DOM)是HTML和XML文档的编程接口规范,它与平台和语言是无关的,因而可以用各种语言在各种平台上实现。该模型定义了THML和XML文件在内存中的逻辑结构(即为文档),提供了访问、存取THML和XML文件的方法。利用DOM规范,可以实现DOM 文档和XML之间的相互转换,遍历、操作相应DOM文档的内容。可以说,要自由的操纵XML文件,就要用到DOM规范。 www.520diannao.com% s( I& K9 A+ M$ V/ W
www.520diannao.com3 K  z- ~0 V9 z3 R4 y! q& d3 N

1 c5 F8 v* P1 I  e& }# ^我爱电脑技术社区--打造最好的电脑技术自学交流平台2. DOM内部逻辑结构 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站& @! C, m& z( V& T

4 J5 E2 t' o7 v) V7 q% I1 ~, O+ d我爱电脑技术论坛8 e. i; I( O8 M
DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。DOM的文档节点有Document、Element、Comment、Type等等节点类型,其中每一个DOM文档必须有一个Document节点,并且为节点树的根节点。它可以有子节点,或者叶子节点如Text节点、Comment节点等。任何的格式良好的XML文件中的每一个元素均有DOM文档中的一个节点类型与之对应。利用DOM接口将XML文件转化成DOM文档后,我们就可以自由的处理XML文件了。
# L- y! v, m6 v! r4 n我爱电脑技术论坛
8 g0 G; J* {* F: m* N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站. U0 x5 B9 l* C4 L- _
3. java中的DOM接口 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- w& U/ Q6 I" f4 o% j" S' M

4 M2 a6 e4 ]: H4 z* o6 p6 j打造最好的电脑自学交流论坛
" e' _* ]" \$ U) N& S电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站DOM规范提供的API的规范,目前Sun公司推出的jdk1.4测试版中的java API遵循了 DOM level 2 Core推荐接口的语义说明,提供了相应的java语言的实现。
1 `6 p* G& M- H$ d$ B我爱电脑技术论坛
9 K8 U7 k  T/ W我爱电脑技术社区--打造最好的电脑技术自学交流平台4 C& f9 _6 |. J9 W8 {! q
在org.xml.dom中,jkd1.4提供了Document、DocumentType、Node、NodeList、Element、Text等接口,这些接口均是访问DOM文档所必须的。我们可以利用这些接口创建、遍历、修改DOM文档。
5 H) j: N6 q) q  `打造最好的电脑自学交流论坛www.520diannao.com0 n. O$ t8 }6 y3 d+ c4 x( _2 j$ v
www.520diannao.com  c* C3 K6 Z2 B* a! n1 H1 m
在javax.xml.parsers中,jkd1.4提供的DoumentBuilder和DocumentBuilderFactory组合可以对XML文件进行解析,转换成DOM文档。
9 I2 n6 Y& J" w- ?打造最好的电脑自学交流论坛
; ?- {" r& j* s, Q# Q' y  r# P打造最好的电脑自学交流论坛- k3 n" p7 m( y; I% k& S
在javax.xml.transform.dom和javax.xml.transform.stream中,jdk1.4提供了DOMSource类和StreamSource类,可以用来将更新后的DOM文档写入生成的XML文件中。
3 `  J2 i; i9 P- \7 gwww.520diannao.com
( h4 k7 @4 a  T+ @& u0 b" H我爱电脑技术论坛: B3 X4 c5 |+ d1 X4 s
4. 例程 ' u/ X, y. N/ t+ E- R

$ V/ n9 u& M1 W4 S
2 q$ o; j  d6 @8 \7 i7 }5 t1 d& y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4.1 将XML文件转化成DOM文档 打造最好的电脑自学交流论坛  y$ ^" u' o: f+ L, s

. ^- t# Y/ h8 a+ f打造最好的电脑自学交流论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台* @$ r2 @" W3 ~6 F9 S( `! _6 ]( C
这个过程是获得一个XML文件解析器,解析XML文件转化成DOM文档的过程。 我爱电脑技术论坛$ b4 y% w: W4 L- n# o2 @
打造最好的电脑自学交流论坛! \! D9 X* V: [8 P

" H, _" e" n4 h- y4 |( y4 C我爱电脑技术社区--打造最好的电脑技术自学交流平台Jdk1.4中,Document接口描述了对应于整个XML文件的文档树,提供了对文档数据的访问,是该步骤的目标。Document接口可以从类DocumentBuilder中获取,该类包含了从XML文档获得DOM文档实例的API。XML的解析器可以从类DocumentBuilderFactory中获取。在jdk1.4中,XML文件转化成DOM文档可以有如下代码实现: 我爱电脑技术社区--打造最好的电脑技术自学交流平台# W: V8 m4 V5 A, l4 N+ g# U- m
5 E( \, o7 E: F$ E% B

( z" @2 ?; @' U' [, J6 |: W我爱电脑技术社区--打造最好的电脑技术自学交流平台//获得一个XML文件的解析器 我爱电脑技术社区--打造最好的电脑技术自学交流平台: J6 }5 V# l. k& O" M9 k+ }

) `3 R1 B7 K7 m, D3 y6 {我爱电脑技术论坛
0 p" N5 M3 ]; h0 |! R* V我爱电脑技术社区--打造最好的电脑技术自学交流平台DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
6 c9 d9 f% u6 o我爱电脑技术论坛www.520diannao.com. s) ^  s6 k2 Z
//解析XML文件生成DOM文档的接口类,以便访问DOM。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站. h8 E/ p. O# v2 E3 z# Y2 j

. }9 F% I; d1 f' {0 X) D" p* r我爱电脑技术社区--打造最好的电脑技术自学交流平台9 f5 R: K) Z2 P9 P2 w& c+ q
DocumentBuilder builder = factory.newDocumentBuilder();
  g' h+ v- ?. m电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术社区--打造最好的电脑技术自学交流平台) V  m$ M8 \7 l! W0 P
document = builder.parse( new File(FileName) ); 我爱电脑技术社区--打造最好的电脑技术自学交流平台* P1 g1 l5 b" N

5 _4 v* A& Z: D! w$ H我爱电脑技术社区--打造最好的电脑技术自学交流平台
& m' n8 ~: I! `7 [: A' ?4.2 遍历DOM文档 www.520diannao.com! W$ S6 R) ?2 K/ W9 m0 ~
打造最好的电脑自学交流论坛8 f  m, U* \0 c5 y/ l2 t0 E
www.520diannao.com/ C$ C  L; ^8 c$ q. e# Z
获得接口类document实例后,可以对DOM的文档树进行访问。要遍历DOM文档,首先要获得Root元素。然后获得Root元素的子节点列表。这里通过递归的方法实现遍历的目的。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 {0 i1 a. l; S' ?. K+ l0 e) q  |
www.520diannao.com/ y9 c! I2 n. T0 y& |
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站+ `& F0 a/ D& ~8 D" ^8 i# E
//获得Root元素
5 h1 x$ N7 |1 g: S7 c
' H) c& c$ e3 H) S7 j- T打造最好的电脑自学交流论坛
1 H& |/ _$ N  s# Q( ?我爱电脑技术论坛Element element = document.getDocumentElement();
) g; P/ B/ D2 Z+ t我爱电脑技术社区--打造最好的电脑技术自学交流平台# D/ M0 E5 x( O" s/ ?

& c% l- a7 r! D, I9 }- X1 P+ N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站//获得Root元素的子节点列表
, q! `; I: M; @( E- I我爱电脑技术论坛; x; G: d2 n4 w; }
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ E; G- [( A, L- h5 B$ H1 j( l, {
nodelist = element.getChildNodes(); : S+ l1 N7 Y' P+ @7 O9 J; T' D0 u1 Y: m

  K! q/ d( o1 ]1 G& Y7 w我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术论坛6 \/ T# E/ `5 A* v" s% q, n$ G
//用递归方法实现DOM文档的遍历

TOP

GetElement(nodelist); 打造最好的电脑自学交流论坛2 N" Z: ]; D  K, v

7 x1 A% N1 v# n8 Uwww.520diannao.com我爱电脑技术论坛# J) \, P1 A0 j1 I4 F

& K# O1 V! O! k8 D* G4 m我爱电脑技术社区--打造最好的电脑技术自学交流平台其中GetElement方法实现如下:
7 E6 Y4 W' `* U& y- Z) l打造最好的电脑自学交流论坛3 {4 K& }% y5 Z( ]2 `: `1 O/ d

, z* d2 ^# D) b# L9 ^+ ~电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
. |" i$ i0 d$ H4 \" @$ j我爱电脑技术论坛  public void GetElement(NodeList nodelist){
- z5 l0 z+ @3 _; Z# D- C+ Z我爱电脑技术论坛  Node cnode;www.520diannao.com, _1 W& S9 a" g- }' E5 G( b
  int i,len;- l. S' y" j' v, i$ u& R9 e5 ]
  String str;打造最好的电脑自学交流论坛+ W$ i5 a1 x! N1 ^4 D6 B
  if(nodelist.getLength() == 0)
9 d7 A6 E) P5 M  q/ X! y9 Twww.520diannao.com  // 该节点没有子节点+ G9 {* Z3 y$ d/ G# C" k
我爱电脑技术论坛9 e* \# x$ D( A! u
  return;www.520diannao.com4 a) F  U9 H0 I- |1 A' b/ e& w
  }
8 ^0 [& |) s' p4 h$ E: ~' b8 g$ [我爱电脑技术论坛  for(i=0;i 1)我爱电脑技术论坛$ h& Y) v! J1 ]& l- _4 s) t
  System.out.println(" "+str+" "+len);电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 |- q, m* T( ]% v8 R
  }
) |7 j1 D3 G* K# R* Uwww.520diannao.com  }www.520diannao.com2 G7 M7 ^0 b% S+ y; }4 u
  }0 o" z6 I4 X+ j; j
打造最好的电脑自学交流论坛3 s3 L+ h) D$ F9 U7 a
打造最好的电脑自学交流论坛4 C0 k  |5 P8 [8 q1 ?2 K
我爱电脑技术社区--打造最好的电脑技术自学交流平台; D8 H% d  ~2 B, {4 A1 e4 A6 ?9 s
注意:上面的代码只是显示Node类型和Text类型的对象。它们的类型标识分别是1和3。 我爱电脑技术论坛% C5 a" Z/ C+ A4 r8 t

: Y3 u1 \" `+ {" ]9 B* y; ^打造最好的电脑自学交流论坛
2 P: |$ @2 q7 M, n我爱电脑技术社区--打造最好的电脑技术自学交流平台4.3 修改DOM文档
& G- b" n8 o2 f; V5 @www.520diannao.com打造最好的电脑自学交流论坛  X9 K8 j( o; O1 ?

% v5 v$ `; M: H. A) Z打造最好的电脑自学交流论坛修改DOM文档的API在DOM level 2 Core规范中做了说明,jkd1.4中的org.xml.dom中实现了这些API。修改DOM文档操作主要集中在Document、Element、Node、Text等类中,这里给出的例子中是在解析出的DOM文档中增加一系列对象,对应与在XML文件中增加一条记录。 www.520diannao.com  N2 P9 W, i" ]8 L, L( @+ c

7 s" c7 |" H. D, g电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" d, w; P) L: M8 g1 J( ]8 Y
// 获得Root对象 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  S! j+ F# E7 o6 {- @5 H4 P* k
) T; I  W: W, r# J; n7 f: E
6 F" v7 `% \1 U9 T
Element root = document.getDocumentElement();
8 s8 _! i" Q2 a" Y* D9 b我爱电脑技术论坛www.520diannao.com1 N7 x% L' V  g: M% R
// 在DOM文档中增加一个Element节点
& G+ T' J! q; B3 w5 s( J我爱电脑技术论坛: E+ [4 P; ^! A5 P
www.520diannao.com. `- e! u' D4 _
Element booktype = document.createElement("COMPUTES");
1 Y. m; L: P0 y  i+ R$ r% y打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛' G: |2 V' ^" h5 i- j) b+ l
//将该节点转化成root对象的子节点 打造最好的电脑自学交流论坛6 u3 A4 `; ^; Q( e4 b+ C9 [  W! g/ y
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站. m- X" O% Y" Z+ K5 d

2 f& I3 d" |# \- ~( T$ T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站root.appendChild(cdrom);
# w( R$ O6 g, b9 e9 }打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: e/ p+ d/ L1 C8 g
//在DOM文档中增加一个Element节点
  `3 E7 w* x8 R  W2 m) {' L- x6 M/ s6 ]打造最好的电脑自学交流论坛
0 ?& O4 I5 w( Z0 K; e2 H: F, q打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, I* V3 l$ m) k4 B; ?
Element booktitle = document.createElement("Title");
2 l  T, C; S: ~& M- G5 N6 |我爱电脑技术论坛* x) s& Y4 \- r' S) }+ \% a7 d% a
//将该节点转化成booktype对象的子节点 ; B, D1 o# ~2 ~& f; z
打造最好的电脑自学交流论坛: \  D6 v6 s) R# o

6 Q4 Q1 }$ g) B! _4 q0 k8 B) N电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站booktype.appendChild(booktitle);
% K. y+ y- j  ~; [. d+ t- \5 w我爱电脑技术论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 I, z+ J  K0 r" Z: Z
//在DOM文档中增加一个Text节点
! ^& u8 T. S5 B2 ^- g我爱电脑技术论坛我爱电脑技术论坛, S" a$ i8 {, n7 V

1 A' J; R  d, E  U4 V$ L  L我爱电脑技术社区--打造最好的电脑技术自学交流平台Text bookname = document.createTextNode("understand Corba");
5 l8 Z* o8 T  j- g9 q电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
$ r7 b0 b" @% [- l' J6 W//将该节点转化成bookname对象的子节点
$ O* u4 u( J' o! U, B打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛% [6 h! n0 `3 f( b( {& U. G
www.520diannao.com  @+ t& l% f- E1 K; o; b2 C0 h
booktitle.appendChild(bookname); www.520diannao.com* [  y0 l( ]7 {! `/ ~# P8 V. S
7 x8 s1 ]. x) h$ g/ o) [# w% D( y) E. j
www.520diannao.com' ?+ ]% X/ y: J6 h
4.4 将DOM文档转化成XML文件
2 k9 k: e% c9 n# \% E% e# Z7 U5 iwww.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ O, T* w* }# x9 V1 `

( B- B& |) Y0 X- Z5 j: j3 I// 获得将DOM文档转化为XML文件的转换器,在jdk1.4中,有类TransformerFactory
$ r% h3 N0 r8 k7 a8 G
9 Q; X$ u1 r! N9 \www.520diannao.com// 来实现,类Transformer实现转化API。
+ Z3 `3 g! q; h/ t; @我爱电脑技术社区--打造最好的电脑技术自学交流平台$ n7 S5 O% E0 {! |. K2 h

3 P( l9 C- r3 x打造最好的电脑自学交流论坛TransformerFactory tfactory = TransformerFactory.newInstance();
3 N- t9 o5 b5 cwww.520diannao.com5 N6 d! x1 @9 T2 ~# W5 p% H
Transformer transformer = tfactory.newTransformer(); www.520diannao.com& x7 l4 C: K, G0 D

/ q3 A) q, V( d5 ~$ ?4 ]4 @0 G电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站// 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。
! Q1 I1 m! K) a$ L, r+ I我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术论坛4 v% U7 f  C/ ^! G8 C4 _
www.520diannao.com- D  ]! m3 G2 Q
DOMSource source = new DOMSource(document); ( n9 C8 P. }$ {
7 l! H- E% \+ ^, Q: w7 m
/* 获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,
# `$ M% z! g4 W) |( I我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术论坛' s+ U, r, ]7 s: b
可以是XML文件,文本文件,HTML文件。这里为一个XML文件。*/
0 ^& y. |( M+ a+ m我爱电脑技术论坛/ n; H+ }9 n* n# L. }
StreamResult result = new StreamResult(new File(“text.xml”)); 我爱电脑技术社区--打造最好的电脑技术自学交流平台& k9 Q9 f8 n) |) C! o/ i3 i$ S+ s
打造最好的电脑自学交流论坛+ S) o1 C( h" U0 N0 J" ^) o
// 调用API,将DOM文档转化成XML文件。 & a, @" M% t% h/ U" z1 N# A2 j. A

* k* U/ `) r* U$ k. U& X3 h打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛' V/ L0 E! f/ x+ \' U
transformer.transform(source,result); 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, z# h5 z- t* l

' B4 g5 T4 C2 X: ~2 r" ewww.520diannao.com4 k6 ?4 w6 E. t3 S6 o' u$ F
这里提供了该例程的完整程序,该例程在windows 2000中jdk1.4环境中运行通过。
8 x  W, v( u/ |& S6 y我爱电脑技术社区--打造最好的电脑技术自学交流平台% V, t( A+ N7 |1 V$ [$ ^

, f9 y' o4 O  I. q2 b. l# x0 o我爱电脑技术论坛以上给出了一个例子,读者可以从中了解到对DOM操作的思路。因为对DOM的操作均遵循了DOM规范,所以也适用于其它语言对DOM的处理。

TOP

发新话题