返回列表 发帖

DOM的一些概念

# v5 \- q, l7 k0 F( r7 z! B, k
开放分类: 互连网、网页制作、web技术( U9 X3 m# s: K6 N! R% N% O* v
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
$ |' z* c3 P! N# M/ }0 Y! K8 _( M0 L1 k
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。/ _! `7 r! ~4 C  u

4 v8 t0 S  j+ C# k& R对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
9 [- y) v1 o. g* OSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。" P+ u; [4 X& i4 Z  D
1 X2 P/ K5 b+ f* V0 E. F" r
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段+ l: j8 X, V3 ]8 a6 w

  F2 H$ h6 @- {! w+ R解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。$ @& C2 z2 ?! V. c- b
, k9 v" s; C9 r1 W
作为 API 的 DOM3 O+ s8 K% l& d. m
/ |! ^& y2 y6 ]+ q' Q$ H9 B! b5 o9 Y
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
. }( f4 ^$ h8 t! M
0 ?$ g% V: ~. A3 z* TLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
1 i- U2 ^( ^+ w( [! Y" c! O5 K
, I/ m" q; j' E# c( hDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
. Y  e: X* n3 R& O% n0 M$ B: `
2 P( w* m2 Z9 i0 j当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。/ V3 m3 d1 ^+ N6 f

% i6 t7 F7 M7 z2 P4 Q# vDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。$ _6 K" P8 v+ V4 @8 Q* u0 i3 j
) M' z2 G" f0 n
确定特性可用性
% l# v; z+ J' V* x4 Y
/ I9 j  m# I; n- q" QDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。# E0 U  }. R; _8 Z

/ ^1 Y2 m% s+ B4 q4 gDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。1 p" ]5 i& ]# s1 z

- t$ O3 E$ q- Y9 ^3 W) Jimport javax.xml.parsers.DocumentBuilderFactory;
3 b4 O* f; ^0 e7 `' q' U! z0 m, y
3 M2 y7 w* ^7 c- o! G4 nimport javax.xml.parsers.DocumentBuilder;0 n, G  O+ x- {% T5 [0 T

4 }; ^) C1 J/ m7 I% G: E* Yimport org.w3c.dom.DOMImplementation;$ {9 X2 \, @4 Z+ O" u

2 L3 \, R, g5 }1 L0 J# Vpublic class ShowDomImpl {
7 x" d4 M& w& h! V% z
: d! r& N% a. C$ Hpublic static void main (String args[]) {
  W. R: G6 j0 D$ }$ b4 i( N# S6 ?2 b* d: l7 ]; I
try {
$ t! ]% T9 s& M+ `& X( f
* \) D2 f+ |8 C7 |8 \- T" vDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  G% s* G; y  I  Q" v4 r: U0 ]) ^& C) l6 n
/ T7 q* @+ e9 `2 w8 X" DDocumentBuilder docb = dbf.newDocumentBuilder();) U# k) `0 k3 s, r6 E+ s6 n
. j3 u: S3 s. }$ Z) b. W: j; H# s0 S
DOMImplementation domImpl = docb.getDOMImplementation();% U' P# D, @1 }. D* {4 ?$ w% S

4 B% L2 c5 V/ i% `4 M$ B5 Bif (domImpl.hasFeature("StyleSheets", "2.0")) {
" x( L  o# ^3 H" I* n' ?& ]8 M8 u4 u
System.out.println("Style Sheets are supported.");) z; V" D/ K1 W; ~. i5 h( M
( `- ?1 M4 o% ~
} else {: ]8 s% H4 w" Y/ @1 v3 v7 |

7 Q% y1 H6 T' o% fSystem.out.println("Style Sheets are not supported.");
4 m; c2 j- v! Q8 I' o6 c( x/ x/ v6 f4 y7 h, r
}
3 y$ ]6 q! G3 s  G" r  q: `/ ]4 o; C3 `" ?* k$ `% K
} catch (Exception e) {}
  Z% f! c" D! P& @$ t! _, w" i1 d5 \) _8 F
}
2 m+ W9 T# c+ Z+ j/ R) `( K
# E( t2 a1 j: d}
' o2 Q" m+ T: M  B, j( ]
) e: P+ x# h) h(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
5 A+ O. t5 w' F+ o+ A. m# y5 o4 h  q  D# l7 Z) @
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。) O5 j3 X: }' Y

7 v* R' r2 ~/ A$ h, \基本的 XML 文件+ ]& G% V2 l; v; y* |, Q, Q

7 O/ z# K* P' N* O本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
" ^: t$ J1 v/ Z6 c4 L# K" W8 S8 y$ Z9 k# m1 {
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
  h. W. _- |0 T! K, p# q. m5 `% g+ n, h5 w) Z
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
" c- n( u, C" j9 Z( z  b! D, ~( F7 U' ?; s0 [6 D4 r
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。$ F2 J/ b# R3 j6 f/ h" i
1 K# v( m5 n4 i8 O2 C1 J' \% _
<?xml version="1.0" encoding="UTF-8"?>
1 v# X. ^, I7 Q: T( ~5 [  _0 R2 P' |/ R' o2 V! B# A1 ~
<!DOCTYPE ORDERS SYSTEM "orders.dtd">5 O: Y- D: [/ M, G6 q
* w8 W8 ^; C. y7 Q; z
<orders>
( {2 z: U" [1 I; Z: H0 t
% P, Q7 u) `$ _+ J   <order>
2 e; l( t( T  ?  v! q3 U( O0 Z) D6 _4 D5 @% b
       <customerid limit="1000">12341</customerid>% U1 {* g6 z+ U, G! h6 F

1 g' G- j2 p9 x4 s  N/ b1 A* u& M       <status>pending</status>3 ?* ?4 w/ I9 ^7 Z; a8 D+ [' Q

9 M3 f  o( p3 f& B- z       <item instock="Y" itemid="SA15">6 z) ]$ \% p6 p( [& n. B; m, F* Y/ d# Z% f
# A+ w6 v/ k; b: L# h% o' P
          <name>Silver Show Saddle, 16 inch</name>
2 E4 y7 p7 \0 U4 `3 a
" r! r' m& n9 M, g7 ~, p          <price>825.00</price>
4 c! U2 D! K2 R: o
. @! M1 p6 S$ ], u; \          <qty>1</qty>
4 p& m, ]4 C1 p$ e4 f$ C* L+ Q& R5 u- ]; s
       </item>8 X  h! D, |3 E& |& h9 d

  c* y& `" o& {7 D( |' n$ m       <item instock="N" itemid="C49">
& X* B) J  r9 c
* d* C0 o# {4 e5 M: F         <name>;Premium Cinch</name>" x3 n" ^+ S% i& b8 g
" |! d8 v" q3 |" g4 i2 `1 ~
         <price>49.00</price>' t3 G6 `% I# }2 A( f  `
+ q8 _0 `) w/ }
         <qty>1</qty>
) @+ K+ @2 b9 f) y; [5 k. v. J, m7 }
       </item>
; z" R$ P7 E4 W) v* k+ U( O
  {+ f! b9 A1 m% ~2 e  </order>( r! Q3 e9 k7 k+ D2 ?: W

" W9 F5 g/ Y' S9 {. Y<order>6 o, x! `6 z, V& B4 a: [( @

- ?: a* v, |1 a6 Z% r   <customerid limit="150">251222</customerid>$ Y. h$ F% y  r* ~

$ T- J7 B# J9 ^, v* |   <status>pending</status>
8 D+ ?- B2 b! J3 a7 [( `5 |* ~' u" A0 y2 X4 B0 [' K
   <item instock="Y" itemid="WB78">9 l+ R  d5 ]5 u" U9 |0 V% m

1 u% [$ F9 d/ r% v     <name>Winter Blanket (78 inch)</name>- D% l7 d0 I: E- Q; s

# n' B- F3 t' x- e0 ?9 @5 f     <price>20</price>3 i; s1 W( ?( X+ x
5 p7 t4 @: o. |9 l# N4 k% F6 G
     <qty>10</qty>
$ b1 w6 V" ~$ k3 R
/ s( q' Y- `, p   </item>
) [* m! c3 I* a6 v3 W$ ^! y0 a& g) Q7 L, [! i5 M
</order>3 f- M- `! O7 D' e: `- i
7 i. R$ L) p, a) f9 w  \+ S
</orders>
2 J& k5 F3 R2 Q; e2 T在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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