|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
- `7 J3 q. L* x# b! l
开放分类: 互连网、网页制作、web技术
2 E, k1 q) y Q' lDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。1 D/ `: ^% O/ T% Z2 V" W& g
9 @7 _8 D, x/ D+ z& ^% cDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
( l$ b; v% v1 l9 ~9 p: P' w
7 l8 J$ Z6 t; {7 {$ g对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。 H* [) Z2 x, H- ]7 r
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
. N* N: J1 q2 p3 e& t
5 \& Z' L5 @7 m另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段% K& W4 b" g- i1 k) E
3 S# T, {; i/ d; r3 z$ w2 ~
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
+ z2 i2 w/ z6 c+ [) ~$ \
9 M9 l9 Y1 y0 u1 p8 K- k作为 API 的 DOM
: n" I3 g# @. O9 p: H; W4 s% V; k+ S5 V2 J" P `6 }+ t. O7 r6 b% ^
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。" Q! C! e) r1 z' `
$ ~$ i1 ^2 q9 b6 D6 E3 J0 d- eLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
0 t) A3 j' N8 k( b: m
7 l3 l& M/ ?. E3 e0 V7 YDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。7 s7 c' z: s* m) E& N" }0 P1 D6 A& E
( j9 l7 {8 `! o! C
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。6 Q: H& i' g9 i7 g
" e; g; f& n8 P' Q* m. |3 T5 BDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。% ~) g7 O, V# p! a9 u# H7 d
# _, M1 c* @8 Y( r确定特性可用性+ F" [* q( k$ Q! Y. @4 f- x& P
" |+ F' Y! m' t6 \0 F0 D& V
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
7 r" N; n, p& b, b1 N9 a7 k) F( p, s% F
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
! |7 s; v! m5 j8 y
7 H& Z) L2 Z, z0 @import javax.xml.parsers.DocumentBuilderFactory;
9 \4 z, h; n1 y* @+ V
' n5 {8 r3 a8 B' x% A- u! R6 w+ \import javax.xml.parsers.DocumentBuilder;
& y! y* M" c* J* R- B3 m1 ?6 }2 ~5 N0 A0 u/ R2 r
import org.w3c.dom.DOMImplementation;3 ^& o' _8 R5 G9 [8 {, r
7 }! P% R0 }, Y7 P
public class ShowDomImpl {7 c U, r8 g# p
1 {4 x! s4 U. G
public static void main (String args[]) {5 y5 }% Q) o0 p( F9 I
) D! x8 K4 h/ S2 ~( z% P0 P$ Utry {# G# Q0 m* x, w* C, S' r, X' }
& ^' n' Y- o& x r) c
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();$ O0 [, P0 U3 I+ Q
6 ? v- B1 o4 m$ H: O6 d' W
DocumentBuilder docb = dbf.newDocumentBuilder();
2 y, j4 ?) d4 o1 M; b1 I# J, P) R) v: M
DOMImplementation domImpl = docb.getDOMImplementation();. |4 {- a4 g/ Y1 s( a
- Z0 {3 Z: r" H% I8 o8 b' rif (domImpl.hasFeature("StyleSheets", "2.0")) {; h }3 H4 p) y8 Y" k" a; L6 d J% a
' [* P* V- ^/ g/ P6 |% F
System.out.println("Style Sheets are supported.");. g, j' u7 K) t- F+ |7 v
( G0 C# g0 N/ B# S( D; B% w0 r
} else {) z* l" ?# u' |) k4 G) B1 b
: d) J1 {$ W0 M! u6 N$ \* i$ V& Q* a
System.out.println("Style Sheets are not supported.");
/ F, F1 ^9 ]7 h% X3 i: ?1 Z& m( V9 C5 K; q' \
}% e0 p( a6 R: K3 s
1 b8 u8 x ~9 v* P7 ?) g
} catch (Exception e) {}0 K7 G1 x7 l" v5 K
; p# @2 m: O3 P- C}$ J- [, w6 ?7 X) a: h
, w! l c. Q6 Y# Q# D Y' A6 {}9 [4 R9 h' C* A9 l1 }
! O6 k1 q. D. V% l(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)4 G3 u) A+ h+ j" F) ?
3 y% }+ d# L3 }# X8 s/ e本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
9 y( _5 r f ` Z0 F
3 ^. F; z5 G" {$ ^ W" a5 j4 H/ ~" Y基本的 XML 文件
% s4 F3 }) ^" m% Y0 J* j0 e% [# J4 I
& Y- G$ _- z) U7 j2 L+ }本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:3 D5 L8 j+ J- Z" L- K; O0 U7 X$ |
% y4 Z: y: X: x% d. lXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
/ Q: B9 t7 X) t. {) u5 \2 ~/ D
+ g9 S6 e! s+ r+ G& n K9 ?2 lDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。8 @3 r7 m+ n ?" L) F
& S6 F! V' M' o8 W8 {% u
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
1 t0 T' b: U1 v! w
% y, h" T o9 ^* i! ]4 e. \<?xml version="1.0" encoding="UTF-8"?>
6 ?$ q# a6 Z( n' R2 e1 t3 \6 m# \' D# a Y
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
) m+ C5 Q4 |- l% H7 u; |8 s% V6 v% ]* u
<orders>, L {$ C) `' K3 L! R) l5 S
! L9 l/ o. V9 M- S" [, L3 M2 a <order>3 ?: w+ g5 f6 b+ P
6 [+ V3 z8 Q, f" F <customerid limit="1000">12341</customerid>
/ X/ V0 w7 o: \& V- w5 `6 Y* I! E! C0 n0 V' {) `* N3 G
<status>pending</status>; L0 B f2 e- Z% g
( N6 O2 h! V9 H: s4 U. t2 n: o
<item instock="Y" itemid="SA15">
! p# i O! F- U! t1 i `
( Z5 K9 a5 j0 K9 e$ j2 c! p! J <name>Silver Show Saddle, 16 inch</name>7 h- m( u/ E/ J/ B# D
+ s5 Q7 U5 e( g, h! c <price>825.00</price> q0 z6 E& T+ ~+ _0 E
$ q& V' A; ? K* \4 H' o
<qty>1</qty>1 L+ X0 f! i7 A5 u% c% D
+ F+ V4 o! S5 n </item>
2 t7 f5 e d2 C6 J1 X6 X" [
+ S3 x" a$ H( [! O: P* {% u( i- q <item instock="N" itemid="C49">! A# ^9 z4 j5 z/ z5 q) }3 z! I
; ]1 E* w3 X9 C: n) G
<name>;Premium Cinch</name>
% C! [/ j, ^' j [
- b8 x: ~/ @% s8 ~* A <price>49.00</price> ?/ Y* w/ E6 e7 d6 S. i) o7 S2 s
! i# q2 |# w1 g' Z9 Y1 k2 Q
<qty>1</qty>* C. e/ @& Y+ C# W9 @
0 r: P; A V4 v L" p. N' z </item>
) D9 ]* X) G& {& X2 z% q$ H5 a$ ]& w G% ]- z/ d
</order>
, z% I$ S. |5 J6 ]% @6 b+ _2 L+ T. ?9 R( M
<order>5 A% S: X4 B1 P3 L9 t* `
, _$ W" I5 C% }, y2 J
<customerid limit="150">251222</customerid>
4 U# c2 }4 L5 j; B( ^; L9 c: D9 m8 l, B$ E d" E5 W
<status>pending</status>
( P) J% e# t! k8 p9 f5 n3 `( @) \5 o6 X5 ^' D- ^
<item instock="Y" itemid="WB78">: I' Q6 E) B1 h5 y8 {
$ S* d$ a" }, W: t+ j. L <name>Winter Blanket (78 inch)</name>( A: @8 ^4 j0 j* B
. O2 {, D) |( Y <price>20</price>
& w9 U+ j- w, \
( Y! R4 t* M$ u <qty>10</qty>
4 ^# F' Q/ o$ L" G8 h7 @8 {9 \
. ^7 B. `. o2 Z+ G </item>
3 c! P, x5 j( f( F7 |( Z4 b, b
+ y |0 r0 D& a3 l$ v) q</order>) V1 |" H1 H0 B! w
/ `# j% F0 [4 K! ?! Y/ C- U
</orders>+ ]" M& d- P4 X! |& r9 I- a/ [. [0 d
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|