返回列表 发帖

DOM的一些概念

+ o' D2 B6 ]5 P% g2 F+ G5 }1 d1 S
开放分类: 互连网、网页制作、web技术+ k$ G$ L9 U) j
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。" q0 ^' i- O( L! g* ?6 u* n# V) f
1 G* L  @. P1 F8 B  l! c% Q
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
& _/ v$ S3 q8 E& n1 l4 a0 p( V1 |9 `# D! c' o
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。, t$ f7 _( G, x
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。( W( U3 ]2 C+ O! A

5 L0 @( F/ e% o# J- K0 B另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
* G  J5 f6 c* w- ?. K( ]& @! d8 S; R
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
9 H5 C7 p* @5 U) x5 R8 u
' U  f4 w  \; L  P7 c# F0 D作为 API 的 DOM$ @9 }# r1 B3 P+ m2 v( t9 ~+ N  Q

! j5 ^5 S; T7 b( d从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。. x5 j; L( C, a0 t5 d0 O

( Q6 i+ _1 _0 w. @1 ~6 Y" E: Q+ cLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。. {" R( _- x2 m
: v8 D3 P' y4 T
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
' b3 r$ a) N; @$ c9 I* S# d  m$ [5 k1 ^# Y# N
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。* f: N7 }/ U& r# b# d/ F

8 X! p; t$ C  y! hDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。' g$ ?$ G# ]! X) ]# z

/ c0 z" \; A/ E; p8 r3 E确定特性可用性7 Y" @' e6 p8 n. |
/ N7 B) @0 O' J# ~* }' [- _: V  _
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。0 z; {" G6 D% V* U1 Q8 \- i8 S

& C- s4 u% w" L4 A0 H# q3 b% d# wDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
. P* \# M2 h! v% \+ A1 ^
7 r! V+ k. o- `9 Iimport javax.xml.parsers.DocumentBuilderFactory;
, K) B! ~. P1 |* e) u# A& |& H3 k/ C+ O9 e8 ]6 s" j
import javax.xml.parsers.DocumentBuilder;8 e* }  I+ U) a3 S

4 A" _$ F& h5 m" j' }. Ximport org.w3c.dom.DOMImplementation;
" {8 R7 j. t! l. S" I5 ~( v2 f  ]( \
public class ShowDomImpl {9 J* p7 |8 b% k# F8 H) y

7 T4 }5 S* V) Lpublic static void main (String args[]) {
6 V3 u3 \; h& s4 g9 h! p8 l/ m$ }5 W! e
try {
* n* C' s9 g, R& c) X! r1 O4 F5 r9 ?
4 b4 s  f# y# ~+ d% KDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
7 s% K7 Q1 v" H% q. @# U+ b/ R& S% h$ Z0 x0 _3 c% Y- [
DocumentBuilder docb = dbf.newDocumentBuilder();
+ `/ m  A' @9 Y
5 H1 K# |5 E! m+ y. `4 `DOMImplementation domImpl = docb.getDOMImplementation();6 L6 B) D/ v+ @; t# t- A. J$ i% d
* q1 Y6 }( e3 [$ e- @
if (domImpl.hasFeature("StyleSheets", "2.0")) {5 l; z( G$ x( s
2 k& M$ s# s0 C) I- X$ Z
System.out.println("Style Sheets are supported.");' q9 W/ \. y. O; y
7 B$ `; s( K! Q. R5 G' L
} else {
# ?3 v6 _0 ?/ Z$ m( w; Q+ P$ F0 t9 I7 t7 \% _* Y% ]6 ]
System.out.println("Style Sheets are not supported.");' V& U1 S0 s! U$ g2 B, |
1 y: J( p; {* n
}; L% n' o" Y* F# |/ _) w4 G
7 U: ^  c5 g0 k8 I1 E8 f6 H1 Q
} catch (Exception e) {}( U( C7 T0 ^5 D( J' i# i$ f4 }
: H+ l. j0 v: F6 ]8 Z- X5 C* ?: R2 ]
}
- m, Y- p: |8 h) x7 Z' T" n5 N; \' P7 k" A- A( Q  a9 S
}  z; K  w: j: c
0 @# o2 ]$ z# ~2 y7 ?* D* f
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
4 y9 Q: c. z6 }5 ~# y4 l5 l
' Q4 R% ^5 A' ]0 \6 h本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。5 b' J) E' n$ |8 ~& ]' ~" J

0 ?( N, o4 H% x基本的 XML 文件
0 c5 ]- ]  l* U9 j
/ _. Z5 n" m1 a! ], i本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
- ~5 `) v' m3 n9 a  e6 n* k. `: k/ W5 F& O! s5 ]4 Z
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。2 g9 F3 r$ M# o) k" S6 Y, _/ u8 S
7 J; @: \9 J$ @3 E5 \+ Z+ u
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
$ O6 Y9 e6 x; c- j1 k
, R6 g, J, X5 S' ^; }) ]2 \数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。6 A  e9 X+ ~+ s

8 r/ i% J: b- J, t5 J7 L7 r& G- [<?xml version="1.0" encoding="UTF-8"?>8 @: X& L( F( T6 K: j* ~9 x
% [# j7 G/ z2 k- S
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
2 p/ y& _/ _' q7 ~) |) R0 k5 N
- ]$ P( j, Y: G+ r<orders>* }# Y2 O! [6 X7 H' C2 t0 X

4 \  E# R4 B& W7 X/ z( Z' |   <order>, m, \8 ^: @* p% j( h1 C5 a

1 f; @! i" o1 L, Y       <customerid limit="1000">12341</customerid>& H- i$ L, V: S2 {

% \6 ^6 y1 k) [) y* q       <status>pending</status>
* s2 E- W, x2 C2 S1 ?7 x  r! ~7 J" d0 A2 z/ _( j
       <item instock="Y" itemid="SA15"># P  _; @9 a$ u, _* R2 e) N! p
% @4 S" h1 c7 o: }! Y7 T- F
          <name>Silver Show Saddle, 16 inch</name># f9 N1 L' t# C* O) p

3 S5 G( V: h+ t% w& c5 W) q; {          <price>825.00</price>. `$ O- Z% a' ]- C* o

7 R, p6 }. P9 k6 N) O3 [7 E          <qty>1</qty>4 R7 x# ]1 P. ]9 y

2 {5 C1 M3 H/ U       </item>
- ^6 _5 [, V  c4 {. r
* V! s8 k/ F# W# T- W) S2 \       <item instock="N" itemid="C49">; `! o& D9 ]  y) D9 O7 F+ H

! |0 p( P2 q( ~+ m         <name>;Premium Cinch</name>3 B& a1 e# d, W- ^
% u2 }4 v; n5 Y: Y$ A2 v: j6 W
         <price>49.00</price>
1 ]8 m  \# |) Y( }0 O9 w0 L
; h( q- P9 M! T9 ]         <qty>1</qty>& k- _/ K0 p) V6 x) A
! J) e- w0 M7 b
       </item>
4 R& V2 y' Z9 t( _; r+ ?/ \$ d& I1 N( \1 V7 ~& E+ I4 w, f9 C: w
  </order>
: W5 H0 P/ a0 K; h6 l& K2 h9 u) J+ w
<order>
* E7 f3 H0 Y6 `! @6 z1 Z9 Q0 x
, C+ B- c! a( S   <customerid limit="150">251222</customerid>1 \# F' F* \, N2 z* @  [
$ K/ Y9 x$ s: Y# a9 _) a4 C
   <status>pending</status>
% }+ ^- v" V% Y$ w
, I  E- w) M/ P   <item instock="Y" itemid="WB78">0 s2 Y% R3 I: g6 O: q

, g6 K' j/ z& l0 K2 a# J     <name>Winter Blanket (78 inch)</name>
4 Y9 P( j9 e  V& D: w" a
6 \1 b" C7 _' k/ b1 M% G: q     <price>20</price>8 o8 ?5 W3 o* d8 @' q' i% _$ e
. p) a( z+ k* N) `9 p" T9 U' E
     <qty>10</qty>
% W5 f3 ?) x8 W" j) |8 e
0 L( R. N! q" a8 G   </item>3 P# w: L. W$ E

! ~! x0 J0 w9 i% u0 o</order>
# [6 f! ]; C5 x) n8 F3 D- @
! X( N: T2 x6 W7 V" U& m( S4 X</orders>3 w: {( G7 L0 H+ A: x- ~8 B
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

返回列表
【捌玖网络】已经运行: