  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
& x p1 X- g8 x; x o+ w; d开放分类: 互连网、网页制作、web技术$ p2 O$ ]5 I W
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。; H& {4 q6 G5 S' D, ?5 u! Q' t
5 G- f' e% v3 S4 v% Q1 R- J2 U. J/ F- K
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。, _+ w: @* x/ Q
+ z f4 \% p7 M Z, u9 _! x" J8 }% L
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。; @: d$ H. f3 L7 J5 L
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
' J' X- A6 e# H. l X7 _' o7 Z% E3 @. l+ O6 i' h9 \2 D' U0 t
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段8 C' y+ ]- ~( G+ V2 F
5 K$ i1 x7 G V' N解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。4 z3 H/ u1 I( C
: k) t6 o9 M& x! ^6 B4 ]$ |# }
作为 API 的 DOM: \/ [+ Y3 y" r$ [# H8 Q% O( i; O
! J1 W- ? ?# X3 ^4 Q: s! b从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
; {' ~' |% E* F6 }9 K( a- S( N7 Z' ^9 j u8 {9 ~( m6 J3 ?
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。% K" Z) _: ?$ r9 b& [. i
7 o& y g! _+ g% q. }% u0 f* nDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。9 H' c4 v- P6 s" k q1 M: k! c
' ?( k6 @9 B% Y* ?, u当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
8 J0 F$ I4 J0 A- |$ I
, {4 Y2 }$ k/ PDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。2 n# v) ~+ V0 L/ @3 g
' w6 h7 N; R% ]
确定特性可用性
: e3 f, y2 \+ h2 t) n1 s a1 f' ?$ l6 T, X l
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。0 f: L$ ?2 n, D5 J8 q! ?, X ~
9 i$ F5 h9 |) h3 J" E. N! i8 N
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
: Z" e6 J( `: ?/ c5 [- ]7 |8 q8 B7 `7 |0 @* D2 R. l
import javax.xml.parsers.DocumentBuilderFactory;
. k7 Y+ T1 J M- o3 F* o+ v
: q5 f3 N1 o. V, t# E) ^import javax.xml.parsers.DocumentBuilder;( Q6 Y7 A7 ~0 x
- y* i7 ]9 Q2 p$ V5 r0 {& z9 `import org.w3c.dom.DOMImplementation;# u1 h2 z4 G+ V" y- e1 F b% d) A
3 N3 g, c! m6 b+ L0 s
public class ShowDomImpl {
3 ], M4 `: r6 N4 |9 P: j3 Q
, R! t/ Y l; |3 Z) Q: L9 apublic static void main (String args[]) {
7 x. n' R( Q0 ]/ P# }4 u
5 g% B$ r* U U& m0 B* b: P; mtry {! v7 x3 v2 x' s1 Q: Y
' c+ Q6 @2 ~+ ~: l, e7 |$ Z8 Z! }+ qDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();" Z; p, N& x9 ~+ x
, |! ]' c& x0 K+ d P
DocumentBuilder docb = dbf.newDocumentBuilder();- c* o& y# j' Y) ~
: J, e6 J$ }1 k/ x# W) D9 yDOMImplementation domImpl = docb.getDOMImplementation();' k/ x* A" c/ q
: U! j- y, t, D8 t+ [4 P
if (domImpl.hasFeature("StyleSheets", "2.0")) {0 I q1 B S2 G/ q, @; o7 i
B' g: Q2 E! C' s3 RSystem.out.println("Style Sheets are supported.");' k' G7 V4 k5 }* Y
4 X: O$ L' ^1 e6 a2 p; o
} else {( G7 n% _; Q& b, v: ^7 C! l# l
2 ^9 L+ j8 w5 R. d* `
System.out.println("Style Sheets are not supported.");1 S/ w4 o% y/ N0 J4 \0 p% y
$ U5 i; a3 g/ T7 N; T
}
) q9 [( G4 A6 U8 C) g" G* C" m3 T8 R0 B1 p# A' n
} catch (Exception e) {} _' P5 b; a& H! P
& K& z% R& J8 o6 I) M) z! [1 u* t
}& a% E* E q P. G
" q- y! \1 `0 I" F2 A- z3 j}
/ S! D, @% b1 D7 k. b. \( N7 T) C8 H
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。), w1 b6 V+ E% x
! E% z+ ?; i" e
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
6 V& I% p4 B' Q. |( k6 n, l6 d
基本的 XML 文件7 `( S4 I2 h ?0 ~# v. Z
$ S8 g, {5 p+ B G( ]7 A
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
$ f2 ~0 J4 F, [
3 O8 n, Y: m5 lXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
+ l" s- m: Y- G* y
1 r4 X0 v7 H. l8 f+ T# m: ^DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。( d. I2 z& X T4 K3 s
0 a6 I q$ @+ T/ o数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。3 D- @0 @ s$ ^5 S2 p* ^
6 P4 a6 z& C1 e9 f& c0 J) z
<?xml version="1.0" encoding="UTF-8"?>
( O/ J) B+ }8 Q9 p3 k% D
5 t2 z4 B) z5 Y% m+ {. V* X<!DOCTYPE ORDERS SYSTEM "orders.dtd">
0 @" y) A+ D4 ~. e. y9 F$ E( \. N
<orders>. \ @; J- x' d! b6 I- [( C1 J7 E
0 O `" I& X; ~1 L4 a1 k <order>
+ `% t% @+ y# c0 |8 |; a" K2 O8 M( ~# p, q, q& z: }
<customerid limit="1000">12341</customerid>
' x; V! Z: @. k& M, [
- }& _, M N+ o- v6 P$ C1 f <status>pending</status>
6 m# I K6 p7 ?" U/ {* d5 g
, U2 D. F) s) @4 p. g) ] <item instock="Y" itemid="SA15">
4 [9 @7 _) } b3 F I" j: F# W2 l( W6 |
<name>Silver Show Saddle, 16 inch</name>
1 [5 f' S$ E( d5 |! @3 L" Q- E, K7 T* I1 N" O4 o
<price>825.00</price>( a M/ c8 X; l6 O& {7 s
1 V9 Z$ J) [7 r+ d- o0 o& l <qty>1</qty>
/ t; C6 K% X: E
9 G! ^% Y* r% B( ^2 Z; R7 W& Z% O </item>
8 X0 L, r7 N; R/ ?9 M# `. @5 R6 _" }3 c% t
<item instock="N" itemid="C49">
, ^( ^) c/ c. f3 R' \: D- u+ Y# T& f9 C! D' h& o% m0 q+ s; I% g
<name>;Premium Cinch</name>1 J; Q% b9 _4 M- ^5 a+ N
h% h; F) F9 e) G <price>49.00</price>
5 V: {8 p0 d Y, ~
: k% O4 d i h2 O( [' G% Q <qty>1</qty>
: D: t) N& q% x: y* }2 M
5 g4 @/ {# P4 X4 i </item>
7 }+ f1 n! A# |$ ]2 m, G
3 t' g! m. F L </order>0 s# Y- Z t! X2 \( H9 T) ]; q6 Z( r" O
9 p- \7 `, y6 ~8 O; `
<order>
7 t5 N. X% S& t7 X" h7 D! |7 C8 ?" F" N% I
<customerid limit="150">251222</customerid> e& U" ^3 p( i- a9 b
7 T6 [/ c- c% u3 D% P5 f <status>pending</status>; f4 s& ] g* C+ S
; x/ J+ t% B9 W' b' i- M( w <item instock="Y" itemid="WB78"> i: |! v& E% y1 ~9 I3 O
( ~! r& o0 I1 F! s% _& V8 O
<name>Winter Blanket (78 inch)</name>1 l; P- S8 s4 d6 F
' p# t& Z/ T) R3 D0 E6 J1 M <price>20</price>% P# `% G+ B$ G! Z R0 |
2 C! m/ P' J. A1 p
<qty>10</qty>8 M8 P R- K/ a: U' Z2 p p
4 g* m. w: l8 S0 b- R b
</item>$ @' h5 Z' s; ^; H
# n" |2 L% d3 _: F2 O7 ]/ _, b</order>/ Z; g5 ]% S4 O. {
4 z% G3 l# ^' d/ r J! D
</orders>
) A9 r5 n1 t% Q6 g0 U. B* I在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|