  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
! t8 k e2 J, o4 K" [4 D& P开放分类: 互连网、网页制作、web技术
& y0 E& @$ M1 m9 c9 oDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。$ C' r9 B6 w5 k! ^! H0 E% b
6 J- |* o( T% P% J0 O" u
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
- s( F# | Z/ ^( x) ?( V2 x* q0 w* i
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
/ ^4 R) }7 B% Q. Y6 LSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。. y) B! S2 e+ Y' S) x, Q. y$ n" Z
7 x% E1 \3 G0 }8 {/ A) g8 e' ^另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
2 X5 R$ _4 Y5 [1 ^2 I! X* R) Y
' d' s$ }, s3 k3 p解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。9 Y5 d- N: p/ I9 G; M' A6 i
. O2 T7 u2 O% _ P2 G
作为 API 的 DOM5 |0 ]" ^+ F& p$ e+ N
" e+ u$ m- v" `( r* j( I从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
1 _6 E. v6 q2 M5 E+ B' s
: b- l: L/ U; Q N" i' t- \Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
8 P- g4 z3 c/ |& u' d5 ]$ P4 W" ^- a0 {4 Y, A7 o
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。% ^/ m( A8 [/ r/ \+ o; u+ U- I
8 H0 U2 s' |* g6 s; N! b
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。- ]- L6 n) h9 h" H: m2 V: ~
: L( ~1 g/ u, O, Z) g" t. k0 QDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
9 l- ~1 `5 \# K% l' w8 {
: l N8 @2 Y- u确定特性可用性' p8 U/ n+ o- ^8 l+ I
& G: c# j2 }0 ^/ W3 K$ {8 \DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。" j& \5 |, t& N, D+ \5 p! e. C, X8 b
3 d9 p4 U1 Z: M# |( cDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
) T' _( w) N# P- E& Q }% a5 q
; x& b# f c. }import javax.xml.parsers.DocumentBuilderFactory;
/ _6 c* V& z0 z5 Q
" \' R6 Z' O4 L* r6 {$ Wimport javax.xml.parsers.DocumentBuilder;2 B' d6 J! m T9 h/ H
; k, C3 I) c- [# Nimport org.w3c.dom.DOMImplementation;" D. }$ O3 B: ?( i1 M1 G9 p0 u
0 b$ S8 x8 T% Z! j2 {6 p, epublic class ShowDomImpl {
1 a2 x8 M6 S: ]) u' d0 o- Q; D: s& e3 C- K9 b, @
public static void main (String args[]) {- ~7 \5 u+ R/ G( U& E, T Z$ G8 o
/ ^( I5 x, Q9 o7 ^* Q( p! G
try {
; R" J$ z2 [3 s" n
% Y) v, [9 P* ]* O, |2 xDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();' `' z V( h) |
) \6 I2 d& R: f+ E$ q9 v2 H4 Y' N
DocumentBuilder docb = dbf.newDocumentBuilder();
+ a! x2 H. o0 C+ \! j4 j. b! j$ f" ^1 |7 s
DOMImplementation domImpl = docb.getDOMImplementation();
" D6 z2 ^ V$ R) {! t4 X* u5 d& S7 j7 ~8 F* Z w6 `3 a! e
if (domImpl.hasFeature("StyleSheets", "2.0")) {
; L) Q2 u3 i3 A
- K( q5 q1 X% Z9 U7 xSystem.out.println("Style Sheets are supported.");) e$ G) b5 M4 u! x: d* W" ~
$ ^! b. e8 }* a: X! k# |. [/ K
} else {
% \8 k0 `" H1 \+ J/ X) A& K* f' u' ^4 I* N7 V
System.out.println("Style Sheets are not supported.");$ n Y" `; H6 u `' W& G
; A" r1 {5 M* i1 v4 Y}
# W/ u7 g. f2 g" ?( o: z; F% B0 b- y8 a5 p
} catch (Exception e) {}
; l' [6 a- i9 `$ d1 J/ q1 j7 W3 o4 }6 r8 I
}
/ Q9 K, r; u4 Q. r
* o# |! |) u$ c% t/ a. p}+ G% y" r, o. l& o. u$ Y3 n
2 ^" F1 Z' Q2 {(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
# t4 p4 f9 o# u; W( P j' ?: w4 A, O5 c1 H9 M6 K( I$ n
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
. a5 @% v) n+ S
# I4 L2 Z( k! ^$ i8 n基本的 XML 文件
+ M+ D! l3 Y' f6 U+ L) m
4 k$ b5 j3 k2 R+ b" ]0 |本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:* o- |8 L: u% s2 I
4 o4 [3 E1 O# o% ]. J, }0 A
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
. X- y* m+ y: s; X/ ]1 h) e' \' g, Y7 m2 T* P+ b7 b# X
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
/ i6 d7 @! z' m! _: c9 R* p7 N: q( u
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。$ O. S/ M3 l2 @& f# C# ?
" q: {* e4 t, E/ o; r' H( E
<?xml version="1.0" encoding="UTF-8"?>
8 p* Z' D' S: V0 g; K7 @% X
8 ]! |- m9 q# @0 k9 l' n! a/ N7 ^<!DOCTYPE ORDERS SYSTEM "orders.dtd">0 [3 }- b$ U7 G! q3 E1 f
0 w4 S7 E& g( A4 P# H
<orders>
1 g, O$ [( Z" E$ D! n( D( R' K o
. `4 _0 Q/ m% y9 z" l5 E7 ? <order>+ K0 H, N7 z8 \5 J2 n& N9 y# ^
7 \5 L. X. A7 z# j0 @8 I <customerid limit="1000">12341</customerid>9 d# P" ]% N# [' i8 {& ?
, }; t& B w, |' g3 g/ J( Z6 U( t T <status>pending</status>
7 w' C; b7 w; r3 q& q! Y
" Q5 ~- d- P& R; |! e/ Q8 Y, R <item instock="Y" itemid="SA15">
5 \$ k( i7 R. Z$ P
" y) C8 @. u( M6 u <name>Silver Show Saddle, 16 inch</name>
1 r$ D8 O( ]' v( c- L6 Q1 p- Q2 Q0 t( N0 t' d, @5 S* M6 E
<price>825.00</price># A/ |3 P6 Z* k. _& g, P/ a5 M9 S
/ X% M/ P {' o
<qty>1</qty>3 C4 c' d' g3 H4 K; l8 V/ \
& h; J4 A0 \/ d9 k/ R7 f0 O </item>
5 Y+ ?2 o- E: m# c
1 D& Y3 ?4 X2 S3 B/ E* T" I <item instock="N" itemid="C49">
0 X; v5 k9 [9 O3 N) t2 O4 k& S, z A- `" f+ ]/ r! I$ p
<name>;Premium Cinch</name>
0 D8 W* c6 v0 |
8 d3 G" G- z8 M <price>49.00</price>. a2 k' l' e. w* L4 c
' K9 d) F8 c* j
<qty>1</qty>
; ~0 x* v! `. y' u5 {! n/ ?# E$ y5 M0 ?! n0 n
</item>; |7 J! o7 X" O* N+ |4 q
0 o: e) e; w. M( o7 D8 X
</order>$ E, O( I v A
0 q9 n" q' S% ]6 X8 ~
<order>, F8 F1 ~" U7 @" H* L
' d3 A. Z- M; ^% ^& r$ g/ [" i
<customerid limit="150">251222</customerid>
y1 Z1 `1 {! A$ r |9 A
2 J3 K, b* T I" I3 ^& b' Q K$ C <status>pending</status>
0 m; D$ v' O* D0 ?4 D
" n' i( c5 u* `7 o <item instock="Y" itemid="WB78">2 v2 Y" V/ h7 t
: ^ A8 D N! S! G
<name>Winter Blanket (78 inch)</name>
5 ?! }! P0 S; I% G
" m2 E S* t* _$ N9 W% S# _ <price>20</price>2 b4 o ]& \$ P- J
" }2 M) L/ s2 }) X
<qty>10</qty>! i1 J- f. @9 s' [, L1 T: u1 a
. w, W; _# E V
</item>
' V4 }. ]/ Y& B: j2 V
. L; {+ H0 m, y- C</order>. y( C, `- a7 |- k
( z( b) [7 n5 Y6 |, d6 o) Y/ B" s</orders>
- s2 k1 Z0 J+ d在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|