|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
: d# R" g$ l V8 k8 R/ @8 E
开放分类: 互连网、网页制作、web技术* L( b/ Q* A6 O) v- Q4 _: i
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
1 O- S( _0 r4 [7 w3 Z$ d9 g
5 s9 x3 G; w1 A; x5 }: jDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。' w8 z/ [1 c1 p) E! w3 N# S
/ x% {* g: k2 y5 H! H
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。; i% l' ^" t/ ^7 s6 S0 ?
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
+ m' u7 a) c& n7 E; F& z0 i5 o! _, u. ~* N; } E$ Z
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段( \$ S4 h$ g/ h0 P- y3 T1 R
+ _8 S" @$ U4 E o! C/ S+ z+ d
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。1 M8 [; J- r3 q. [6 L
& M# U8 w2 `( L作为 API 的 DOM' \& ?6 p1 L; i. K( F1 W
6 J% W- o2 @" N2 F/ M$ D* y1 ~从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。% O: A- I1 ~- I, q
% A8 o: h, T/ s: S R- N2 }, f
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
- @* N/ |2 M! U. N. i: s' p# L$ r$ _ } Z
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
7 e) I* e2 n5 q0 H: z2 j- y& p5 F# ~. h. X" M! b
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。; [/ B2 C0 S. U; u" D& p$ p
' C& G4 c5 I& a- [4 N3 \DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。, [' ]+ I: d! H$ h9 A7 n
6 h+ K3 W. l' i G确定特性可用性
o8 Q/ x2 `5 r' I3 E
$ h. x0 Z' \/ p% g+ cDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
8 e r6 _- V" b( k2 C( r3 N. N+ Q( I4 D; S! w
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。+ |+ i3 a- w& Y# L# U# U; a) M
1 |9 E- q' ^0 j! D: z
import javax.xml.parsers.DocumentBuilderFactory;3 W) Q) |0 a9 t3 [# G+ P
# y) J, a& w9 @+ v
import javax.xml.parsers.DocumentBuilder;
8 N8 m/ _5 {6 Q) O. g1 N
5 H, b/ |% t6 E) f' e9 x' |import org.w3c.dom.DOMImplementation;+ f, c" j8 ]; i2 z% l4 Z5 L& V4 r
9 Q% e, E1 G/ X3 n) B O1 M- `public class ShowDomImpl {
& M5 l! U) d9 z$ z1 V- C" ?- _; v3 B0 n3 f% k3 L! m, A
public static void main (String args[]) {
/ p* U. c) ]" F3 a( v7 |* N( W5 \
try {' D7 z% A! j) k& Z( k5 P' ?
" c9 N5 o3 T! \, ?3 D+ P% q3 xDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();' a( M$ K0 a* o5 r/ l- r0 M% v$ l6 e! V
! ?; m) C5 j$ f' m3 Y, J% \$ eDocumentBuilder docb = dbf.newDocumentBuilder();
`2 [8 A8 c7 G5 s* f& V
" [2 m: t% q/ `% @' p$ P* C3 l" }DOMImplementation domImpl = docb.getDOMImplementation();
; D" e% M: ^+ r# @$ I: I# @: G t# W' }7 E/ q
if (domImpl.hasFeature("StyleSheets", "2.0")) {
- D: ]) n; Y7 T* {4 N5 [* E
; E' k, c- j" l3 J8 q* c# vSystem.out.println("Style Sheets are supported.");
6 g$ C7 a2 n6 d! K) X) R+ k- v- u2 `3 O+ I* T9 @1 t( Q: z
} else {
& G- T. A* |2 Y8 c) x
/ r* W% t- E' i$ [) l& VSystem.out.println("Style Sheets are not supported.");; S* p' B; s7 o
: }' o/ N6 u! w n- r2 o1 x
}$ m3 G/ t5 o, p& q, u* E8 `
# k) F5 r) q, @6 ]3 S
} catch (Exception e) {}
. d( ^( F7 o& {* m* U6 P: K% N4 a" I& k; x( q$ l# L; _
}9 g- o/ R1 Z- N
& r1 G9 ]" ~2 {}
( ?" d5 O1 a& l$ W _2 a" d* p! l4 ^- ~7 `5 `- b
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
; h6 b$ I1 n0 B
/ [5 q; A6 ^0 m) ?4 B本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。! i b. L5 `8 F: W3 a5 C
) f! H& r' e3 ^1 D5 _6 W基本的 XML 文件
v! S. ]. B' b4 N- y; h# `+ W7 Y# k/ n2 o, C& M$ ~
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
8 b7 ~- K# V1 Y( ]% l. p+ Q+ R' |% r, d5 |
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
+ `, k N8 e9 s3 y$ A0 R6 |- A5 o5 T& K2 f+ |1 k- b% Q" F
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。- W( } ~1 _' W& Z9 d7 C4 d
9 {0 `4 u2 X) X: w8 C- x- C0 Y数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。+ I0 ?& p$ a! `/ \$ a3 W$ Q4 C A4 l
/ S) ]& \& {6 O
<?xml version="1.0" encoding="UTF-8"?>' P) Q* W; f9 B
3 y+ ]& R5 J1 M- y1 d& T<!DOCTYPE ORDERS SYSTEM "orders.dtd">
! b: Q- f, ^9 P% ~) |+ S) C3 x; M& n' N4 m5 Z8 V4 H2 O- y. ?
<orders>2 }- D# X6 N ~
5 R; q3 \$ J2 x# F! n* W; W
<order>! K o8 }1 {, X, }5 I/ L! R
2 f8 F/ Z* P- [$ ^" W7 ^% U" V- E; @
<customerid limit="1000">12341</customerid>
, T0 p, W3 G( T0 }2 w
( d6 B9 ^) W, H- `5 Q |; r <status>pending</status># l5 B) m1 V9 k; W0 b
$ ]; f9 s2 E0 F; G2 S0 G
<item instock="Y" itemid="SA15">
" m/ {- a6 u" N4 c0 M3 v1 t) s* A2 v6 O: O1 _
<name>Silver Show Saddle, 16 inch</name>
# z' n* h% `6 \1 F/ ?4 R' w
/ n: F: P9 q) v- S& B- v <price>825.00</price>
1 S; j& P! K& T" @2 x- |$ O7 M/ c- c# R/ G1 g3 e, }
<qty>1</qty>( J: v* L- P8 Y x5 I3 [' X2 \; n
E# ~- v' k# T l6 H6 s% u! {; C
</item>
. U, V- R& V2 L, B6 B6 y! U' {
' Y2 d" Q. a W% C& ^. M5 d: M <item instock="N" itemid="C49">
& `& {& Q* ]: U2 C; V: w l; k, x* S! w6 O
<name>;Premium Cinch</name>
* S( h5 K. [) A0 u' M
3 V; c t( h, Y9 b <price>49.00</price>
. G4 U( L# }2 v+ g+ v. f1 a$ h) V& y: K) j/ F3 p9 \6 U
<qty>1</qty>
" S) g) ?3 ]' O+ J z b# r# p( ]! y1 o9 q
</item>* f% c) W. [9 h" Z5 E; f* F2 X8 f
& a ?8 S) s) B9 K0 }) h
</order>
$ M. c$ y! C0 z H4 q8 r' n& b; l6 n. T
<order>9 p0 } `$ d& H
, Q9 ^+ B8 U- K, R% _$ U9 q+ c
<customerid limit="150">251222</customerid>3 j( M! Q; u! v/ I1 s7 j# l
0 u! u8 a; R* _6 r0 B* @ <status>pending</status>
# Q* ~; Z# V# y n B8 |0 |4 b
<item instock="Y" itemid="WB78">2 I. v' m: K4 C
" I6 b( q4 s T/ W0 a
<name>Winter Blanket (78 inch)</name>
' A: D: T/ \6 d% O, g3 x4 T+ U z& Q( A6 r t' p
<price>20</price>% P6 @% z: e! ~
/ g2 N4 Q( w* _) R& H
<qty>10</qty>8 W# ?, n7 K8 m& E/ h& Q
/ D1 ]/ S$ ~4 @" U1 O& T+ w. V
</item>
+ A' ]% @6 D4 R4 c/ ^" `
0 N$ K3 W+ ^( h$ h0 m</order>) v+ e: p( E, [# ]4 K. P! |; j* g5 n5 @
+ W f0 |1 a0 a7 ^+ E
</orders>
3 o$ A+ r" a$ b) h2 a6 s在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|