Board logo

标题: DOM的一些概念 [打印本页]

作者: admin    时间: 2008-7-10 15:40     标题: DOM的一些概念


8 c% u' }% v2 R8 _9 @开放分类: 互连网、网页制作、web技术' Y7 ^& ~5 K, V$ ^: V( F* y9 m
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
; x7 a5 E* [8 H& A& N8 k+ B" o
  `8 x( q3 \% T7 S/ ]DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。  k5 v$ t, F) l

7 |, I9 B4 Y1 ^) }5 q对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。* Q/ H- ^, \5 \
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
* h! ?. H7 l' F9 H$ K/ ]/ p2 I" F! G* p" |3 ]( G6 n
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段7 l/ w$ W/ [2 y. B' j6 w  c5 y) m) ^
- N: [$ }8 h7 X0 u9 u: t
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
9 k* d( e5 {5 W0 T+ J: q- |. ]
; C, g, k6 b! Y$ C- X# }作为 API 的 DOM$ Y: n! U' \' p2 j1 o& W$ k/ g9 q
7 y, u) c& N6 }  J1 W4 z
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。5 C$ J2 V3 L' {

+ g7 U* Y& R6 h. Z) P! G3 ELevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
& L" I0 D- o( ~8 }' i8 g0 l& y- R5 M9 A, N, ?7 c* K6 }; a
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
! E, F) A. q+ e6 Z! o6 c* ?  s
& y* H+ x% Q# ^  z% B7 a* e# }. W3 e当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
* ?/ ~0 f0 x. ~" e' `. }/ s7 y! A+ @, g, o2 F5 D
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
3 ~4 q% Y+ u2 q" x7 _5 f
9 u; L5 x) R" C, b+ I# z$ b确定特性可用性
' V7 y  \7 ?# x2 L3 d" f
0 B6 Y2 v3 N* w: }DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
! ?( Q0 ?1 w7 d) ^  U' k7 i& g# V" }& j
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
1 g" Y5 s+ E& p' @' t' r7 m8 y( ]' m, _, g' K' I2 N9 ]! D1 s
import javax.xml.parsers.DocumentBuilderFactory;$ v0 H  p6 z5 ^9 k& F

4 m4 m- Z0 c( ^2 u* j, Limport javax.xml.parsers.DocumentBuilder;
' F% V. C  i3 v( b: K4 C8 |
6 ]& v) f8 G  F& oimport org.w3c.dom.DOMImplementation;; e! ]0 ^  w5 A% G& S

7 W* H) D4 y2 w% Q0 }* Hpublic class ShowDomImpl {5 s; K$ c1 K/ f1 s0 M
' b/ N. x+ C. i" u7 n7 ^4 p' \
public static void main (String args[]) {; G& I( S6 S% X( h) M

$ N( n- N. v! L0 z9 I2 O* gtry {
0 ^, F) ]4 s0 U; [: S$ r( L2 R
" R5 W) v) z% m4 s8 m1 \DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
* h. A8 U( I8 a: j3 b+ P
* q$ o, H8 d% A8 C; [DocumentBuilder docb = dbf.newDocumentBuilder();
1 e( ^7 T' k  P: ~/ d: R
1 x6 `8 k0 z% V" sDOMImplementation domImpl = docb.getDOMImplementation();
$ ^% z* @' a. @, T, O6 A6 @6 Z: H! c& @  W
if (domImpl.hasFeature("StyleSheets", "2.0")) {# T/ d1 v( Y( S9 ^
4 w( }' E/ _" E5 a" U! O
System.out.println("Style Sheets are supported.");4 o7 g* s5 {# q0 S+ n

5 E. a+ B% K+ w3 J} else {
* b0 u6 T8 X9 u3 D
6 j0 ]. p/ O& U  Z+ ZSystem.out.println("Style Sheets are not supported.");
9 `3 T. M  n( X* d
1 q# v5 \. P. j+ c/ i}
% I, t: I! y; U  u' U# d3 Z3 l" m1 z9 s8 X# Q
} catch (Exception e) {}# i) E0 s, b- d4 r9 C
! h8 L( c# A6 Z1 c+ {0 u5 y
}
$ r# K" o0 f( j7 h1 \
4 V  a! p( S7 z}$ r, p8 F) V; \: i

- Z: T' v8 R! G/ J" J8 R* g  j(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
9 ]7 C2 i5 H1 \0 t- i
! u# k( M4 e5 F本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
0 D# G" Y' u, K8 }5 G9 h+ H
6 ?% M+ j( @' `) b基本的 XML 文件
; A3 p0 r. K2 \8 s: N
; g4 }3 Z5 j8 b8 }: ]1 r本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
; h; M( V' q0 w4 O/ p" K& H$ r/ M! c! r  O. o$ j
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
% X0 k* ?+ F; q1 n4 `1 D+ ^$ P$ V2 U# p$ G7 I/ [
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。7 ]8 Y, j( i0 \" `

7 u8 E& d. L6 o数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
& u. I1 O8 v, w* t  A
# b; k0 e( {6 N, f: v6 u' X" ~<?xml version="1.0" encoding="UTF-8"?>
/ s$ b# _6 Q0 u# C( R; k  L8 @: E3 q" ?( [* B
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
% X( e; c: l% e0 t3 T
3 a* y/ q; i( z( ]" ~0 c<orders>
  L7 C8 \  c" s# U4 v0 R1 r; z
. ~, Y: d5 M1 J6 o- D7 J% x   <order>; _6 c5 D5 ]4 ~
) c" {6 [5 U' ~# }1 \
       <customerid limit="1000">12341</customerid>
  Q0 J) e7 k6 B$ ~% q& R* w0 i. Y3 U; _' j8 W0 k( b, I0 ~
       <status>pending</status>
) D; W! v6 Z4 S& R6 G7 P; n3 W6 e
       <item instock="Y" itemid="SA15">6 j4 H+ p! S6 d7 Q& q
& G, r, b' {8 m4 A& A- a
          <name>Silver Show Saddle, 16 inch</name>
# D# {$ ~. u7 r( @3 Q: y9 W. ]& {4 J+ h' b
          <price>825.00</price>
) D/ j9 r& Y+ q8 \2 K: r
1 Q# [0 n/ _$ _0 y7 [0 |2 y          <qty>1</qty>
) A5 [$ ~$ z( D6 h2 W. J8 V5 a; D( t
       </item>
/ l4 G3 ?6 Z1 o# x& f" j; t* r+ R0 [; q$ P; i) L2 P/ [
       <item instock="N" itemid="C49">
2 `2 }- H" C/ G& K" b1 [9 K
, j- d6 |2 g7 N: h         <name>;Premium Cinch</name>
0 O  T' @. [2 d  d; H- \
1 b4 S: U0 i  J6 E) P  n         <price>49.00</price>- s. A1 a" `( `

! E0 L/ s0 |3 }2 I" T         <qty>1</qty>) g: [( c& P6 n9 K
' [+ U! c1 X  e3 u' X2 g
       </item>
8 b. A2 w( Y! _& l# z
: ~- o6 d+ c+ X' x  </order>$ J6 ~. P( j( s7 [, |& r- u  P0 a: j( ^

' g& ^# Z9 Y% p" G; U/ m<order>  ]: S' V' [( b! U
' N. f4 r) Y: V0 C3 f. X: C3 b7 P
   <customerid limit="150">251222</customerid>5 a; C; V$ G5 V, B$ N; w
7 u$ y/ }& P& P0 G0 \6 z
   <status>pending</status># [" E& n: T) q0 u
) K; U3 f6 `& s* x5 K6 R. x
   <item instock="Y" itemid="WB78">
/ V" O, B2 I. y  J8 {
1 q) T8 Q# @; Y8 ?% {0 D     <name>Winter Blanket (78 inch)</name>) @. _7 t( b( R) C7 w% ]

; G% W8 t1 V& r. x# D1 D. L9 p     <price>20</price>! e9 G  X- Z  _$ L( K

5 G3 J3 b1 k; `     <qty>10</qty>
6 g) U/ L4 D8 P
0 U- }. T. v" e- g/ H   </item>+ F( ~8 @* R" o& \6 {2 P: q, N
2 g5 s0 M3 c* O! i; p4 G1 Q% M
</order>
7 J1 p5 M/ w; z5 o! a1 A6 G4 J. L/ m1 z) k
</orders>
7 c2 O5 h; o) l2 r6 ?在 DOM 中,使用 XML 信息意味着首先将它划分为节点。





欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2