  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
) x3 e0 [( [. b
开放分类: 互连网、网页制作、web技术
, }, w# P1 e7 q5 h+ o8 G7 i1 JDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
4 \- U3 [2 C; k' y7 J
7 p7 g6 L- r! B/ x% |: W8 A! |6 WDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。2 J; y5 M7 B( a3 F
5 I" P+ s5 f# o% \对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
0 ]' U+ ?: m% x, d+ y+ j) ISAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
* @* W+ P4 ]9 p" W' g* G. R" [* n3 B u7 N Y. w( x
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
1 X$ l' {" j g; ^' h: j; y( |3 K6 z4 W
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。2 ?& _ ]5 }1 s- S0 u
% b. W7 h1 B. Q8 E2 _) }! o
作为 API 的 DOM
2 w6 j# V8 g9 [
7 |/ m5 q5 f, Q; X1 I/ u从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
& F7 I" I% O( y% Y* V6 c5 w) U4 O0 T2 t& r' \
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
m: I1 J( {3 v& g7 f
* s, j" f8 F$ z7 q( n* U' EDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。& X1 X7 {" Z! c
q0 u& J9 v2 c3 i" ~2 F! b* k
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
. |8 L; Q) b8 N( n0 L9 ~$ C! k: [8 k5 Q5 X
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。" M' y7 c# l% L
) ?4 {/ l$ y3 N# H! }" n7 t
确定特性可用性( n% G8 Z! q% h
I4 M; h5 \1 K8 F q+ `, I0 c. |
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
8 y9 D' `6 R8 F! o" A' N4 _2 k1 j5 K, W+ {, q4 O
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。- \2 H- M9 _9 z" v
( v) @/ R+ e: y+ T! H$ `import javax.xml.parsers.DocumentBuilderFactory;
4 F# e1 E6 ~6 K
b4 [. P0 L/ F: z7 ~import javax.xml.parsers.DocumentBuilder;* R. L& P! E% e3 f+ e) k7 @% S
" a' f& n1 m5 t# ]; ^import org.w3c.dom.DOMImplementation;3 ]+ h* q e; D X6 K, B
- N2 [, w c. S" W( k+ q+ ]: a# ?1 [
public class ShowDomImpl {7 X- H* D7 J" Y, O3 N$ X
/ Q& I3 F$ m& u p e3 G
public static void main (String args[]) {6 g% e; m4 Q- b4 Q
1 I1 | }. C2 A, g$ A# L( d( u
try {
o/ @/ B' W( x% i, Q; ?; R5 j! g! f. _$ S
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();" |. A) [0 S, I* S
) ~% J3 K, w. l A( c, N1 b9 d
DocumentBuilder docb = dbf.newDocumentBuilder();; A( ^& \: y% ?# ~7 a6 {% \8 s7 Y
3 T, d! T# A/ [6 f+ U6 p# ]: W- ~) @DOMImplementation domImpl = docb.getDOMImplementation();4 }" }2 h r& p' D! l( g/ r
: ~. P: u+ o% w5 }5 v& X
if (domImpl.hasFeature("StyleSheets", "2.0")) {
S2 u; W. V9 _5 M% ]6 q/ @ x7 n! F$ I. K: j5 m0 w$ D4 _8 [2 a+ G
System.out.println("Style Sheets are supported.");
- M+ G/ |( n$ J' K. l+ u" {! X7 j# U# _* L' }
} else {
! m! h* @+ y3 T8 V- z9 M' h& R* i! b9 I D: U8 ?3 t6 C7 v- b. \9 X
System.out.println("Style Sheets are not supported.");
2 [" e5 [0 S! E
- w8 x, t7 b3 O5 I/ a% C}
8 }1 h$ x1 l& i6 a! y# V
) v0 |; p5 f- E* p% T& N: @& N} catch (Exception e) {}, w0 y. o7 O' }* x( D. c
: _$ v% w* H0 {- j; h4 p3 ^0 A}9 Z* K- v: \" \7 q/ M+ p9 E& Z. ^ s" u
. u: L3 ~ V! l7 D! l+ ~+ g% U
}
, n Q8 F1 |1 `4 g( b+ j5 _
) l' r! H# L5 S0 _. m(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
! y$ }/ V& H2 r8 a6 p7 o' m
2 F5 G7 t6 G ?$ a- [& r本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。3 `. `; F$ E0 X, f/ ]5 p$ X; A
& D u% I8 c' ]- J+ Z/ V! ^基本的 XML 文件
! ^- u# `7 N. x+ p- A- X
8 o7 r/ j$ o$ x6 O& V本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
3 F2 _4 ?+ y, I6 u1 L0 B: Z- B' S; G. E" c( `& L
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。" g# G n0 }& I; g
$ B2 }* G3 e* g9 d8 r2 G& uDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。) ]( o0 s4 E5 w3 G$ W1 ^+ ~5 g& S/ W
% z! I/ }# N6 K" x y; d/ @
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
; I" N: F& W; E! r. k0 H8 B2 v$ z( G4 `5 u& J
<?xml version="1.0" encoding="UTF-8"?>& V, o! e, z7 C( O: C! z' T7 d
4 h8 y( x; N$ }/ v# D
<!DOCTYPE ORDERS SYSTEM "orders.dtd">; N+ ~) a3 @2 }5 d9 u& b) R6 L
+ W w3 Y1 E$ L& p4 [<orders>
6 o3 {+ t% W: p7 o
! j# j3 E( j5 s! P! T- W4 w <order>
8 D) c) M6 F& p7 Q+ x7 ?9 T7 x; x. Y/ H9 I5 `: J+ U
<customerid limit="1000">12341</customerid> o# u0 M& H8 I8 `! u' }
( `6 p3 g9 s! V' ]- g' c
<status>pending</status>
! q" z4 B" _/ P$ D3 o/ `3 S& Q+ Y1 ?3 i1 \: f
<item instock="Y" itemid="SA15">* N: d' Z3 S$ }
- i9 {" _% n" d1 c# I
<name>Silver Show Saddle, 16 inch</name>5 M2 v! \; F( i6 e2 y8 m
& {* ~, u( ^- t( S7 S! o <price>825.00</price>
- \* n+ r& h6 m( s* i# f5 e$ m) w& O+ ~: z5 b( m* V- U
<qty>1</qty> M* ^0 c, ~; D/ j5 E6 f: f
% C* n+ v0 L/ c7 J; z+ y5 N) `
</item>" T+ {0 A5 |& r+ p3 [5 g5 f3 o
0 `1 K0 N1 k9 N; H9 b" g! ] <item instock="N" itemid="C49">+ V# Q; Q7 ?; S3 O$ r2 y+ t
# R( @* J- A# L <name>;Premium Cinch</name>
8 h U' m% i A! R) C3 Z$ `, k+ \3 R, e5 h" Q" B% h
<price>49.00</price>
; B R! `9 R# m# r6 m
/ l3 q: X. \+ H" s <qty>1</qty>
; L [6 _ d! @4 _: l! ^) M& N+ V/ D+ m8 i2 b8 H% i
</item>- D! i% \ T1 h! W4 C
) F: ^; {" F) u4 h </order>
& A, L6 {* J8 m# p6 M( ~" F; |* E$ {, T2 a
<order>
9 {! f7 ^4 I7 Q0 j3 t" {# G' p+ h, u, J$ M# c' j9 W
<customerid limit="150">251222</customerid>, s+ J2 k/ O: l' R# n. \( z
1 H# m* O& W( ?, M9 M" x1 A <status>pending</status>6 f& Z. G0 {% O- V! x
3 x7 h0 R$ I+ m( D2 M$ G <item instock="Y" itemid="WB78">9 ] f! R9 A' D2 M$ l
5 P) z F" q. F- t" L3 E6 C L
<name>Winter Blanket (78 inch)</name># w/ o5 a3 M- I2 H. C# G
& w7 V& G1 G, x: p5 [- @% D: T <price>20</price>* ?$ {+ x; m, e3 h6 \9 F
# |. I) ~: N* S4 x, |8 a- ^
<qty>10</qty>0 I3 T/ ^. @9 g3 c
- \ b6 S% \ k
</item>
: h$ j4 H. C2 ]
" L- G1 _" a2 `1 v# F</order>
6 Y6 j- z5 X" v F/ p4 u+ b: [
8 j& u9 M$ a4 q4 N7 K</orders>3 M. u. @- J6 |' l8 G0 E4 V. R% I( ]
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|