|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
, l7 {' V1 q4 [! W5 Y% e* e0 ]
开放分类: 互连网、网页制作、web技术! U5 h5 O9 `3 S. y7 _' w
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。/ M* f ?: g. p+ o" Q$ ?
$ j/ ]# u7 q/ b- a# B& h
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
8 ]3 H: ]# d ]- G+ b3 {5 T- R2 }" }" W( p% e
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。, t* o% X: d/ l8 j; c
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
: [. L; E* `" O: d% s9 o* ~( i$ f( Z v) Q+ w3 Y
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
) p3 d2 H2 z/ N, V& k% ?7 x5 x% p( |7 \9 a* x- X
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
0 ~8 _" M# V# E! ?* C+ d" r8 m* k( b4 W' F
作为 API 的 DOM
; z, j, l7 e; _: f9 |" e1 L. ]# |+ ~8 D# l: K; |
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。5 d; {1 b: c* E3 q/ V( D( l! L
& k7 Z6 M1 [" }; O9 jLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。2 F% M& w$ l' _
& N9 I4 P4 A- G3 a+ S5 [
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
n- I1 ?/ J! H; J' f
. O- j) ~/ X, i当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。2 k5 @2 {5 F0 m
6 J5 I0 Z: U" R7 O( F2 r
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。( z5 a. e! Y m' |; r8 u4 B( x
6 A% a k% r# m, I" A& }( P/ G确定特性可用性
- q: f+ u; D0 _; D1 S' h/ e4 @8 |$ t4 T# Y' t l; {" _0 Z' {
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。7 u* q6 k/ ?! g8 P5 {* \8 L
& ^3 y% @/ x, o6 W8 Z5 R0 l# ~' g
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
+ P& Z7 n# y( `5 m# ~) m4 i1 x( _+ N, ~' a7 N9 u
import javax.xml.parsers.DocumentBuilderFactory;
5 `$ P) Z* y3 b, p0 p' e0 Y
- f# u4 Q) ?0 n2 b; t! d0 U% e1 Dimport javax.xml.parsers.DocumentBuilder;
$ Q3 k! t" c9 N* k
. U7 H1 x# {1 d# O; @import org.w3c.dom.DOMImplementation;
+ y* Q' c K; S1 J/ u0 T, d; K
% [! M4 M) H+ z! G1 u& G% ]! fpublic class ShowDomImpl {! y! c: {% j* K1 n+ ~4 J
& ?4 z d4 y; z+ T/ Q# }( xpublic static void main (String args[]) {* V9 m0 h; B3 p6 S3 y
; B0 g/ M- Z2 o0 @" ttry {
) e2 Q3 u) I. {, J% ]% x3 {( a" ]8 m1 O
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();$ |3 R& U s+ b/ ?4 i1 y) n8 y
1 x" l Q# \: Y% lDocumentBuilder docb = dbf.newDocumentBuilder();+ T$ _& b: d1 q2 {
: \( W, F0 S; n+ FDOMImplementation domImpl = docb.getDOMImplementation();1 [# w: h* g$ i: e& t
/ e' N1 r7 G+ z; ~( Pif (domImpl.hasFeature("StyleSheets", "2.0")) {
7 \% ?1 c" z: F; O, Z) w; B( |* e2 h _; r, k# S9 ?! G6 V& v/ f( P+ \
System.out.println("Style Sheets are supported.");4 h0 g8 r, U& _ K$ k# M. _
9 R' O8 E1 x2 u: i2 M3 x: a5 f
} else {
& ? R6 J* q# i5 L% g, L( \% G- m L- F2 h1 V: T
System.out.println("Style Sheets are not supported.");
, Z. K& A2 f- m# w: e$ g$ O, d1 e2 P9 H) h" @* p
}
/ p7 H) f) d# P- o$ {, X
+ a0 Z! ^+ ]0 t} catch (Exception e) {}* V; |3 k- p& i2 m2 X
6 l) d, o1 r/ X$ t* g}! ?* J. p# v+ i) J5 p
/ |' R- \# R( ?2 f}# h( `5 ^/ @1 R# i+ X$ F/ q s
7 _2 ~, I* b& l6 y; M! Z" j6 k(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)5 e) s! I- Q- F' F2 @1 @
; Y3 `9 i* x. z, ]) ^本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
- P; W. d# V/ X7 K, u$ K
/ b% C# \' ^7 U9 Q+ j9 q/ u" x* B基本的 XML 文件4 C! n1 e' O# e! F
! m2 W2 h1 a' k3 `( P& A& _& v
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
0 a: X* W, }) l4 \) |% }3 D
" s" N$ v/ G3 ~; q+ ]- B; k% \XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。. v8 |7 W1 D8 v. ?. M# h/ T9 [
) E; Q. {; `7 A5 c5 ADOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。% D$ X( V6 ~) x3 j. W
# f, p# R- _& h y) T数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
' Z2 O$ S, n1 M, R
2 j; z5 e! a ]3 `<?xml version="1.0" encoding="UTF-8"?>
? E% }' F" j8 v: [4 p
- b' \6 m) u. M5 Z8 J<!DOCTYPE ORDERS SYSTEM "orders.dtd">5 U: r2 }( K' ]' j R
6 o- ^' ~: w3 G0 d/ U' A<orders>( r: b8 |. J* _% b8 R- m# ]0 U( `
' B4 d9 Y( |* Z
<order>
7 a* {1 G) s+ x" l& ]3 b- O6 B- t5 p4 i* N( t! `" ~2 Y$ O
<customerid limit="1000">12341</customerid>% ^8 d- t* d1 w& y2 |. K5 L
& X# k- U" X6 {# A+ r
<status>pending</status>
: U( \) F# O& K6 s+ h; J) O. E2 \! p J
<item instock="Y" itemid="SA15">$ Z; ?# A$ N _$ x! J) L
, m# d# t9 Z( Q, d! b+ w <name>Silver Show Saddle, 16 inch</name>
3 |' I& M3 n: z+ I$ m
, B: ]7 T* P# u" }, A9 {0 R <price>825.00</price>
& G: x1 `# C8 e1 J( Z' w/ k6 v# r( {* R2 v* K$ n0 u% L/ b
<qty>1</qty>
5 a8 G4 p: E4 o# Z. w" N/ o
) N+ ~- b0 `3 u </item>! o$ X) S$ ~( \. u% U
, K$ g0 l9 t7 f; s7 X+ O <item instock="N" itemid="C49">
" x; h; [; W) i+ R. T& f; M v7 b& [ i- m8 r& u
<name>;Premium Cinch</name>
% J, u% R1 p+ P2 b+ t
% h+ z" h4 M9 @) _% c2 V# ` <price>49.00</price>; W0 E3 [& t* f
; F: U5 j \+ g4 W' Y
<qty>1</qty>3 j" _ j/ g6 ?$ |0 Y4 e
9 l( K% j2 A) l( K( a- u/ H9 Y2 T
</item>
5 z* m0 y% l8 X: E( r" k4 t2 ` {% W/ z% Z" i. m
</order>" ] w |/ Y- C& c8 ^( x8 C3 @0 P
2 m: q( Z. E" {* D/ g6 g9 r5 p+ `% b
<order>
0 v, ~" g; h5 D4 q' s' q( V% x5 m6 s, C
<customerid limit="150">251222</customerid>; \" |3 C+ v+ K/ R- |! M( P+ d
' N* z$ e) [5 Z8 l7 m" K <status>pending</status>% R, S; h. A! ~( j }4 N$ {6 L# b6 m
9 `0 q5 z9 V# k$ ~6 E
<item instock="Y" itemid="WB78">8 {2 h5 h; d5 w @5 V
( G4 \$ f# f- x8 k/ c) k
<name>Winter Blanket (78 inch)</name>5 N* o1 R( J# v# G& N
3 k5 |5 h U* i }+ a: r/ y1 M
<price>20</price>
7 C6 J6 U! N& R% v0 ^8 Z) f. s2 m7 Z! c4 X/ w0 S
<qty>10</qty>. \2 @; W( A: U2 D) u# ?8 _) }1 K
. ^7 K0 r! [) k' A/ f8 e1 b% k
</item>
& x; ^- |+ u5 V
" F- ?4 r( F% [: J% G</order>' x+ `" E( ^" I. Z5 Y
3 a/ K" l$ H, }2 Z0 W" ], { N</orders>
: G) K$ X9 ]+ A8 t2 c1 x5 h在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|