|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
9 b* D2 ^# n- ?0 C/ W开放分类: 互连网、网页制作、web技术0 Q: b. S0 V2 s! J
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。5 K) D' l* _+ H. r, a4 V
7 b! M0 Z& n1 e& J# d0 B5 v( A' wDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。& Y% Z1 j; ?! V$ Y3 g, t. _; V
2 V* a) [" t% T( r) P$ c8 v对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
! ^; f, Y! u4 h5 c/ ]SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
/ ?/ C2 z" a$ c+ E- V1 D+ _, d
* z; A/ \+ |; P/ x$ b+ I+ b/ [# {+ ~' h7 w另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段3 J- T3 r* j0 x1 |1 p- x
4 p) c5 `# e7 d) n" c/ @5 n+ o7 P
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。. c, N! D5 L1 i- e5 q
4 t# ~- i2 e8 y+ l作为 API 的 DOM& }8 {, o1 S3 j) L; p* l/ J0 x
9 W3 d+ h6 |9 x8 m' I" B- ~3 C# O
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
0 j8 w/ e# x [- X7 g$ [& o) C" Q1 g, h; X6 ? C
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
5 I; [+ h+ d* S
2 \: ^& a) D# b! f) @ ~ F) x% GDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
~5 ]- o- ]7 }8 \7 D0 E4 I
1 v" y0 E# ~+ |- G当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。7 Y' w9 d- V1 J
, D% [4 p8 e: K3 `+ L1 sDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
1 |+ W; Y6 b5 E
' Z5 y! i% x: x% Q7 F确定特性可用性
' s$ m+ G4 G. ]) E( j
7 e Q( }1 W0 HDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。- p+ M% l6 U; K/ a% I- a
8 h* u( l* L4 w# VDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。7 l6 X5 H9 M2 I4 `* R5 p+ K
- \6 C& S$ {6 Y& J7 |) S7 timport javax.xml.parsers.DocumentBuilderFactory;" s/ l6 b, o `0 N7 O5 t
$ a0 m5 q U8 b
import javax.xml.parsers.DocumentBuilder;
. A0 s8 E& Q: c! _' B9 c- f$ F; P' R: N2 M
import org.w3c.dom.DOMImplementation;
* F" |2 v5 R- Q3 A6 ~ n3 q1 s
2 S/ `+ ^% j# O& ^- dpublic class ShowDomImpl {
2 q# k$ Y/ ]/ _2 X
4 p. M4 Q; v9 y' Epublic static void main (String args[]) {3 j* K) n; R' y
6 F' o6 L9 S9 wtry {
/ x; A8 x: f) S# W1 t4 t: Y" J8 d& c) a5 p
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
8 [$ s# F3 \. e V0 h- X, }3 J5 V. E) L5 F( [) A3 {
DocumentBuilder docb = dbf.newDocumentBuilder();
/ K# t- j+ z# N# Q8 a. j% F
0 W- G& Y7 K2 f- V- E V6 D# eDOMImplementation domImpl = docb.getDOMImplementation();
+ ]5 O7 V4 ~$ ~# X( Q- G3 N. a& I" F, R4 X; w; Z: {9 c
if (domImpl.hasFeature("StyleSheets", "2.0")) {7 U; D3 X+ Y. Z9 v! w2 `( }
( r8 a! w, c0 m) c
System.out.println("Style Sheets are supported.");
8 s% a9 E- u3 t% _/ g% P5 E$ g( I7 y( F! K( b! t. i
} else {
) b8 A4 y2 G. o
) A$ A2 c7 z9 p& p6 T$ l9 @System.out.println("Style Sheets are not supported.");& k' |8 K; x9 c* v1 `1 O
8 Z: `6 t' |" z. g) o' b1 l4 }}6 u) }4 y+ t4 x- ?2 V9 Y
$ c7 s0 `5 Y0 E8 ]0 p# Q: A s4 \4 \. a} catch (Exception e) {}
; n; I& t& s& ^& \' D3 H
. p( f* k* l Q) x" l& n}
( x* T& | |* N, S, S: t
6 A' a2 k3 j/ | d1 t. }9 Z5 ^+ S1 ^}7 J$ U0 G& d1 O
: P; U$ ^4 v4 t) u1 c& }" I, z& U(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
4 t# a3 e) w" J( d
0 s3 A- r- p* y6 i$ _* [. x# I) Z本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
( o& u/ D9 v1 ^, D
) g) s8 i& g2 r6 h! Q, C, g基本的 XML 文件
_ j8 I! w7 Y; j* d) Y' V6 w' N) M. y5 v" e0 g1 O* x
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:# ^6 j6 P8 N+ w# [
2 r0 s* s7 s: ?) R9 ]
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
! d% A- @" U2 o3 i. g; V
& ~! r& k$ m9 r) d% ^1 D( j. lDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
& w/ S' |2 L- D5 S7 B. d" A/ E! ~% _
, C; I7 o5 j# D$ R! W: T& o数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。) S* C" w' W* G1 k c' @
0 h" s8 S% K7 Z9 }$ H
<?xml version="1.0" encoding="UTF-8"?>6 b2 Y( ~ I+ I7 o G6 a$ y& s- `
+ q h) @0 h# z! ~& N
<!DOCTYPE ORDERS SYSTEM "orders.dtd"> b. o! `: |) ~; S b" a5 x
% n1 B& m: {6 t; L+ ]/ |( E, m<orders>
: {& v) E3 \( C2 Z6 R1 |# [9 b/ o; W: }& {( l' R& J/ J
<order>% o1 w4 q4 J3 R) E: J
% [+ V: E7 v! W4 V6 }, b/ E! @
<customerid limit="1000">12341</customerid>" K* `: ^) S" {0 O r/ z
6 z& m9 x$ U* c' z* f, I l0 H
<status>pending</status>
8 R* N/ O1 h! m; \+ r- s
! S" h/ h7 `$ O+ X6 _0 ? <item instock="Y" itemid="SA15">
1 Z8 J" D2 _* Y4 m' ]/ J0 r x+ W0 `4 ?, @/ g4 V
<name>Silver Show Saddle, 16 inch</name>
3 ]1 c) u9 R: I4 \+ p3 x \; k! B: e& P5 ^2 K+ z
<price>825.00</price>. {5 M3 F( Q/ K
" b+ K8 N" E8 h9 ` <qty>1</qty>
2 f: k) T5 @' D5 a
# s! s4 g; g' D </item>6 b- S7 C& w H, U3 O
2 w. y* l/ A: R$ c' P <item instock="N" itemid="C49">4 }6 }- T0 z0 ]" U
# O4 V1 x+ o1 j- j <name>;Premium Cinch</name>
7 d$ J% G* H9 R0 p7 o' s# {* [5 Y2 Y1 C
<price>49.00</price>8 x1 S& Q7 C0 a1 d/ q3 h
3 q) h1 p; \9 ~ a& e% t <qty>1</qty>" X |' N6 Q }5 q; o2 \+ I; k
. l5 D& C7 X; H' I* r( l0 a% K5 j: E
</item>5 v/ D" `8 V, c6 p4 t+ H
# h( a8 h3 b$ T
</order>
^* b- `( s3 U. t8 R% t6 o1 k1 m! P0 S+ X% h
<order>2 n* C" H" |! H; u) ~
' f, x3 t- r' g$ ~ <customerid limit="150">251222</customerid>! \2 Y7 N5 I6 \& y- r- i* n
' y' m' J# w7 i
<status>pending</status>
/ c0 c8 b/ ]# F0 T1 @! Z9 d9 V9 h4 w# [6 I. _4 I5 J6 d
<item instock="Y" itemid="WB78">, h7 y! r+ d6 B, h5 Z4 S* M
: u2 i, i0 U X# }; O
<name>Winter Blanket (78 inch)</name>
# T: A4 x& v" q! o
6 w! J$ \+ A8 g6 L" L <price>20</price>: @7 P6 b& l5 ?) L
# @+ \: v/ w/ q, h& e- w <qty>10</qty>
' I* j$ b6 {0 e& k- a' h A0 n s! ?9 k9 o$ w
</item>
6 K0 d2 P8 e; q: c4 c2 }$ h+ z$ z
</order>
' T7 H6 C5 `( |/ z7 D
9 H, p$ y$ s9 L Y- J+ H</orders>7 H% u) W$ M' X
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|