|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
+ O: N; H( y! x& v; h8 T6 X7 L开放分类: 互连网、网页制作、web技术$ @8 o; d) @% k" c+ Q# ?
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。2 o9 }+ z. {2 z) p; _8 K
4 J9 U" [8 o) f1 f
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。6 |, m; y5 I- O& h4 R& H ~3 ?* k
2 @ h/ \: D: ~
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。+ j, A# W e5 D9 L5 l
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。% _/ e: f9 K( @3 C6 A
( x. e% _+ ~2 K* q: a# u# A另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段/ E) O- r$ w0 G+ \, N" j1 J8 V" i4 Q! j
. j; F: b, L/ E解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
7 s: j; Z- s2 u7 z1 e" ^. c/ J b; Q4 J t8 L2 u4 }
作为 API 的 DOM
+ ~0 c. N+ z. N l* Q K1 L0 [3 C! L8 A1 |
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
6 l1 X8 W$ t1 z# v: a' k, g1 p. @5 ]; T" ?7 F" ~5 i
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。( V: ?5 B2 r- f7 e3 C8 x* ]
1 G7 M& r+ U4 m! V: KDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
" V* \ V7 e7 M8 t" S
( ^2 T' S y9 F$ c1 o: z: _/ k* v当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
& s$ k8 @7 S+ s4 b( F* Y& u: _6 T1 ?$ Y: r/ n" o% p: n) }
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
8 c2 s8 k2 f, q. |# ^3 V0 M$ M7 w
确定特性可用性
. J0 F! ]! s/ B0 d+ [ R8 a
6 Q5 l" |$ |4 vDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。. A) M$ E0 l5 x5 j; L1 Q
% l! T& V4 G2 L2 D
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
( x3 h- U1 T; }7 ]3 t/ |$ ?
6 l" l5 s- x% E" n3 R l" simport javax.xml.parsers.DocumentBuilderFactory;; b! b Z7 |( d ?
/ i, k W5 m' o% [3 N F0 d5 Z
import javax.xml.parsers.DocumentBuilder;
+ p# Q' {/ D! x0 F: H+ d4 F* X/ |9 `3 c E8 i- d6 ^
import org.w3c.dom.DOMImplementation;
( ~0 [1 N* A/ G4 d H
( n8 a1 k* ]: u9 epublic class ShowDomImpl {5 |' c5 ~: _6 h# R9 ~- {& |
9 X, |( [. r: D$ F" @
public static void main (String args[]) {
2 {6 g0 ?9 |7 u: m/ m L
) [2 E1 v) U$ Z+ K' F* b: {try {
1 ?/ V" H4 |% V$ B4 B. q; J3 K* ~! F% e, ]/ z4 k; q
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();1 E3 u* u7 b% Y4 G& @' q n. Y
! ]. h- L) j L! v3 l SDocumentBuilder docb = dbf.newDocumentBuilder();
3 g6 k' s! J- [8 q( H3 |3 k% j( T" P$ t: T$ ? [
DOMImplementation domImpl = docb.getDOMImplementation();
2 V+ i% h) ?' L7 @0 b. D# v. L% w8 z R( E/ k0 v& z) ?, j1 Z8 ?1 p C
if (domImpl.hasFeature("StyleSheets", "2.0")) {! e5 w2 X+ `7 k
" S3 d$ v M4 [3 `# `& m
System.out.println("Style Sheets are supported.");
# n8 Z4 t8 R3 s+ f) b- ~5 Q( R/ ^1 I$ @
} else {
8 Y7 @) l( Q% `1 u9 V* j3 J* u) y7 e7 X% ^4 ?4 ]
System.out.println("Style Sheets are not supported.");: ]6 b7 N% {. W" _* h
2 p/ U% Q8 Y( T
}
9 j% ~# d$ s- |! H* O& l7 v' J h# [4 c# \0 M9 J" f
} catch (Exception e) {}& B) {. F6 p/ r
/ c* [# C# k9 u
}& ^$ P$ H3 W' f: C! k( q
5 v; D' U7 g, g}. |$ `1 m; b& h4 Z& b. |; u7 H2 F' k
$ a9 U, K* `( t r% ?
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)1 [ G7 d8 U$ k2 ^4 u
: g9 Y& ]5 k8 n& k本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
; |* J5 i) g; b) y" n5 {2 V4 \. C8 L! J! S; I
基本的 XML 文件
7 @4 ]# ?2 f6 b! ]* \! Q% `% m' W) R
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:) F( T% s. `6 N( h
6 Z* q9 Q w) E8 v/ k
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
" C8 j, D' z! h+ P; O9 D% ]& y' c
5 @& d0 R& v" ]" u0 YDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
6 e3 }2 k; ]7 y, d) r- T; V% r: N
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
8 e8 T: ]& e9 _- c8 X' e' Z: t6 Z6 O( I
<?xml version="1.0" encoding="UTF-8"?>
6 R) t! ` [' `" S0 s$ _
8 M c7 t( |7 x<!DOCTYPE ORDERS SYSTEM "orders.dtd">
/ p. x' z! q& e; b4 v% t9 W7 {; l% S* K, j4 `( T' M
<orders>/ }4 \3 C' y# i8 p
, K7 e9 C5 x9 L9 ] <order>7 }( g" b, y; U/ ]
8 X; [5 y: e4 l9 m$ f! Z8 P
<customerid limit="1000">12341</customerid>- V6 y) s8 n7 |7 a. O+ T5 B$ r# Q9 n
$ b7 g" Q3 ?' D& r <status>pending</status>/ L# @: A. k9 \! U
, h2 _' ?4 J7 n* Z* s: k! N9 z/ T <item instock="Y" itemid="SA15">7 o/ T& d& e1 J9 J( t" ?
- N: e0 x; Z' G. B5 l <name>Silver Show Saddle, 16 inch</name>
$ ~. [! Y* K1 u, Y; s6 {* z( p* u& Q$ Z
<price>825.00</price>
- w+ H0 k- t" P
& e2 ]$ m& _% M7 E <qty>1</qty>
]% ]" J5 K) D( d% b" D2 y
6 n' S% W8 q8 [/ v/ `% f2 v </item>
' O3 H6 k4 e4 {" |- ?$ v* V5 }3 \3 r& T& g4 i' g8 u
<item instock="N" itemid="C49">
- S; v0 O) i' W3 O
. w7 q* {9 n& o: c' ` <name>;Premium Cinch</name>/ Z8 x; G2 {1 T' W
/ A4 r0 y5 i. }) T& c: f3 P( I
<price>49.00</price>
! ~7 E6 B, K/ e" Z* c& H% T/ b1 ?6 d. L! i3 c
<qty>1</qty>5 S# ~! Y5 V2 \# R% K3 F
2 F0 q6 P% u0 l0 ^& M
</item>/ [9 N! k; U0 h; [
/ J; L' Q8 V: j5 F% d </order>" b2 C$ U& ~& F: l. v
6 q3 @4 t1 K" e* n8 |: H
<order>" j& ^5 Z! g# b& q6 O1 \
% @0 t. _9 \! q$ B/ X
<customerid limit="150">251222</customerid>
6 ]3 S( g8 m W' h" R. ~2 ^8 O7 ]% B# [- q& H5 [
<status>pending</status>
d/ u/ Z' S, K) L) ?3 Q7 f9 O" T P3 o4 w; I) Q3 l
<item instock="Y" itemid="WB78">
" o# \/ ^1 i" d8 e( f1 l# U J5 h# ?& {6 N( _( s% n ~( [
<name>Winter Blanket (78 inch)</name>" j5 A% i) Z; j/ p& A9 G- e
' G/ j0 @7 c8 z# k( R <price>20</price>2 b6 W4 }( f3 U: Y8 {9 S
: B. J- s) n3 C* v4 t/ k <qty>10</qty>
: n6 I; n( C! m& g- L$ C: l' n" J3 E2 d3 h% I& [
</item>
8 c5 R) F" _% I' c6 \9 w( c. Y7 m, i* s: M8 v
</order>
+ s0 _! u( h- A8 S4 @7 q: A- R5 Q+ k
6 m: S+ j3 n0 a5 d/ \. g</orders>/ h! s3 ]) a) A6 C" |2 t7 q
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|