  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
, A5 B! N) U$ D0 t. `4 n5 K开放分类: 互连网、网页制作、web技术$ m2 K8 F: e2 x/ [% x& o
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
- Y5 N$ s! U$ A
3 Y0 S9 T& m! D9 X0 xDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
" I- G' a8 A' [) M9 ^4 T5 v8 o% w# O$ w B% r: y( Z& r
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
. [7 u+ r% N' y6 _SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
5 D. R3 J- i7 B, A
# G- H# ]# g* T. a另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段, ?6 [- [0 h( u
3 `: @! M* R! L! Q1 u
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。# G# f+ \3 B( U
4 Q$ p9 j6 a8 @( n* d作为 API 的 DOM0 e* g9 Q( H. M2 I6 J- L# s
4 c+ }+ K* S1 v) G2 Q* P- y从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。, ?1 r( @+ F0 @, O
- o0 e& q$ y: V- HLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
: ]/ ?$ t1 \& ]5 X) e
- t9 Q6 F# f9 P& J" JDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。" J" c) V) B, I" x( x- j: O
& v) P& W/ l' x+ }$ Y
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。 u+ }/ x7 s. K. s8 Z8 I x1 f) z
5 N" ?% K. s& E1 l; y3 p
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。, J6 s! c; }# Q1 w5 L
! z- Q3 ?! T& C9 G% j确定特性可用性( T9 `# S3 [: f7 ~1 T7 Q
) R2 C$ u& Q" w
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
+ X( k; i# n- r2 J% e4 }
& L, p9 V, ^4 N( {9 M) x& WDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。: A% D7 Q/ w% u' K) G
& u7 p) }- a" V2 o3 c2 oimport javax.xml.parsers.DocumentBuilderFactory;
9 F) t! }, \( Q4 h5 _, \1 S( {$ ^; S8 q2 ]4 \; B
import javax.xml.parsers.DocumentBuilder;/ g- K5 [2 G3 G. b3 f( x2 T
M! j" R6 N6 Q/ j* U: [import org.w3c.dom.DOMImplementation;) I! }) p& L3 D- B
0 {- I" ?5 o' v2 q, B" mpublic class ShowDomImpl {6 b: w3 t, b' l2 N2 @
c! T3 T0 [% j2 h0 u$ w7 k
public static void main (String args[]) {& { [/ @* l' U+ r0 [% }0 g, a4 U r! F
8 _' @' j1 E# k( u
try {
0 j3 `1 E$ T3 Y+ r
4 q$ ^. b$ A+ f# xDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();0 _8 k' E% r; O! g7 t& q# f
# K \0 C+ M/ `; B$ ~
DocumentBuilder docb = dbf.newDocumentBuilder();- A6 q0 D' U" |/ S8 c
: e2 w$ Z6 [" g$ c% C% D
DOMImplementation domImpl = docb.getDOMImplementation();0 Z3 G x9 S: R' C% c$ B' D8 C" y
& I8 i8 \4 w- U! z' h! V1 M
if (domImpl.hasFeature("StyleSheets", "2.0")) {
2 s& _- w' r$ u7 l9 O% [% O2 ^' K7 I
4 e3 r2 {+ o( O) QSystem.out.println("Style Sheets are supported.");
: w; ]) n% H; C+ D6 K! I- z+ i' M( j U/ f* `+ }0 c* q" {2 V
} else {! X9 G; c# c' F' I# K e4 S
% L! H* e' e4 y6 @* Y8 m N1 f: p
System.out.println("Style Sheets are not supported.");
# Z/ ]+ f4 U4 C; P
1 m" G! O' x2 U7 O& g! a* s}
( m- a8 F6 o4 r( h( |% N# T$ X, Y
% w' m9 s, _8 H" u( t, M4 V} catch (Exception e) {}
& z' O) L# V$ c* M0 y8 V. j: o# ~! a7 X+ V7 F. n3 l2 N* d
}
/ o0 u8 ^7 v! r. Q, }+ z, ?8 J/ n3 a' W& m/ L8 j$ H' }
}
s+ c3 r2 l8 a5 `5 s% K
3 o' w9 \$ U" e- K" u(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)4 ?4 k/ i& n1 f5 k
3 Y n# y8 _! ~本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
+ e( {2 y F1 m# Q8 {! p4 B" W
4 M* l) C F) b5 b7 f3 D基本的 XML 文件
# }- ?. q+ Q! P: T( y" z9 q: q
1 g: M+ i" M# K3 a, K+ j本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
5 {0 j" J4 w+ u9 K% y
d' v; K0 _) k' x; tXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。+ m: I0 n# q: }* r- R1 ]
5 m. m% E2 h6 S, V! h
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
0 V' Y8 U+ s4 t' c) x# s) B& v( L7 E, m/ X% j! e
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。+ P+ u! ^# a* P- d* [2 F6 T' M3 a- w9 ?
p6 m f6 a; s4 @' z<?xml version="1.0" encoding="UTF-8"?>
7 Y4 h% z' M, K5 w' w% {" T% I# t% o
<!DOCTYPE ORDERS SYSTEM "orders.dtd">) G: b; u0 O+ O9 H
$ f/ }6 d, }* h1 N4 |% o
<orders>" r5 D' o2 I9 l( o5 X4 Q
/ E/ G( A3 y: N! C. L <order>$ s) l2 r, Y/ v4 z
! Q% |" O, e' i' o$ O <customerid limit="1000">12341</customerid>
2 Y9 |9 o- B' L/ ?* i% ]& ]$ y* v( q
<status>pending</status>! J( B0 }7 P& f4 M/ G
: }: ]" L% R3 S0 q K- ?
<item instock="Y" itemid="SA15">
7 U5 i& g2 H2 o# s3 x/ J) j
& q! c% {% D2 C; I, Q% Y <name>Silver Show Saddle, 16 inch</name>
! ], H/ G- _% d8 I' l3 R3 Q
) Y* w" \0 ^+ {4 n- D <price>825.00</price>
7 K8 G4 V/ M: D3 ~" k7 M
; u* i7 k R$ p1 G3 S1 | <qty>1</qty>
1 @. ~7 B% @# i2 D
1 T6 `0 J7 E0 g$ N: l' E </item>% E% |9 A% t; m" e7 |( ]9 _* w
0 T/ f6 R1 n" ?3 D! h% A6 g <item instock="N" itemid="C49">
# l- M( N' s/ l8 [
+ E, E: \* q. |+ Y' ^# T <name>;Premium Cinch</name>
' A0 k3 ]( {( W/ {! z, U4 C$ N
7 S7 j9 g I2 G& ` <price>49.00</price>' j+ }: Q4 n3 |
5 g" y G8 g O# U: P* R
<qty>1</qty>
7 T) h2 A2 \4 N
3 P1 t7 L+ h7 b/ _ </item>
/ a( G# U) T% r7 Z) l1 d7 i- U! S8 U& l4 G2 [+ b
</order>0 e' E S, T- Q% e
7 Q! D$ P: V2 s" L+ x# \7 _3 @
<order>8 r9 K8 v' ]9 O; \5 i
0 K8 y1 C* ]/ G {
<customerid limit="150">251222</customerid>3 f5 }' T2 Z% c7 q7 H3 T
1 [) e( B9 t. ^3 Y1 i
<status>pending</status>/ m) C( U' B' P- @: `( O' w0 r
& L% `% `$ X3 R4 C) L5 N7 I6 T, ?- R. M
<item instock="Y" itemid="WB78">
g7 k; q+ ]7 u* ^9 G Z. T. P/ U7 U- ?3 s( s g: c/ O0 f! @! s
<name>Winter Blanket (78 inch)</name>
, U4 P5 O9 q" l! H' B1 h4 R9 K- g
0 X0 e+ m3 y( F2 R <price>20</price>
/ C6 }- X# W% i. u$ q( B O8 @ w1 |8 a4 V% S% O
<qty>10</qty>" T b1 s, d6 s. `$ O; X: P. V
7 J# r' P+ j5 p4 X) j) ^% N </item>
- A* J$ P7 a5 z
1 v8 @( B! N# I8 E& W$ n</order>
% d$ ~$ ?. G+ Z) _) I6 R+ y, p9 L% V3 x/ E. E. j
</orders>
4 d5 P) `5 d) w+ m- r& Y在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|