返回列表 发帖

DOM的一些概念

: A# p8 E( D; }( m( R5 H
开放分类: 互连网、网页制作、web技术
* p6 n) f& w: a! h5 Z* n! E0 gDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
0 X2 Z& f5 ?: a7 a( g' K* }" K) k; R# ^+ R5 }8 ]
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
/ C" |( R0 |% p3 M: L
; z0 S* ?) W! Z+ l% d/ [对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
* V6 [. y4 @3 r, A* `  QSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。. d; V, M0 e/ Q0 t9 _- @, d5 W- U

1 ?, k1 U5 N5 ]7 I  F) r* B另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
" x* |  y* @' v4 G2 |9 q5 V" J1 y( |0 g" f0 @
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
' ^7 q) o; i2 O1 B* J4 N! M( S3 q
, |2 o# J; Q8 \# s( R作为 API 的 DOM9 v5 x" t& ~& r8 L: Q% c
( V' u2 K" E" i
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
2 b5 l  r8 {8 ^0 R; e$ s5 {+ `- m, ^: B& S+ R
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
# s4 t* ^1 b5 o0 @8 |' @/ v
3 R8 q9 t/ z, M4 z" hDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
4 B- e- c) i4 X7 A1 h& k  P- C: C+ X+ y3 C! k0 V5 |
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。8 z4 L; C: Z) Q& ~7 i) O+ e+ Y! V
8 z% z& C/ \2 K6 i0 {% g
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。0 O5 P/ l5 E* {, G; g: r8 r. H
% a# k& E2 v  X# o0 v) Q% ]: ^3 j' m, I
确定特性可用性
: B8 V9 Q  J* f2 t/ ~1 ?5 G) ^' ?; W2 K! C, F
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
* {: _7 e: x' k0 x8 e$ J. v3 C( a9 G. H. z% G
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。( l6 J7 l. c4 ?) R; g* c  }

# y% p% A' B/ _, t' Zimport javax.xml.parsers.DocumentBuilderFactory;4 p) k; H) l) n% a- X
/ _( Z) g# N8 _" B- A8 R2 q* N# z0 J
import javax.xml.parsers.DocumentBuilder;
3 }$ t7 s! X; Y/ \; e6 R  }& [
' f" |8 Y9 p- s5 Pimport org.w3c.dom.DOMImplementation;
8 r% F+ `) ~9 x' L2 Z* {& b8 _6 |: F( c( J2 ~5 L9 u/ l
public class ShowDomImpl {
6 m; ]1 y: b' o& p
+ g+ |4 i) v, r9 w$ N& Q* jpublic static void main (String args[]) {
1 x) n8 C3 R+ t# k$ R6 t( N; F0 P, M
try {
$ p; S" A# L5 P+ D) x$ c4 S# E: W  i6 |# H8 \) w1 `+ a
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- N' v. R# V4 _7 h. {" d! f0 V- l+ K% m, `& J
DocumentBuilder docb = dbf.newDocumentBuilder();
/ F0 R7 o) h7 |0 F, Y8 ?
0 h4 A, V- I5 T8 \/ x7 iDOMImplementation domImpl = docb.getDOMImplementation();7 l1 @# `: x- P/ ~* z1 m4 |

6 B% f8 T1 U# F/ J- y2 ], Oif (domImpl.hasFeature("StyleSheets", "2.0")) {4 a0 E3 {8 B) D! {3 V/ _; |: N

/ B# n4 l; y9 k6 WSystem.out.println("Style Sheets are supported.");
( S( ?% V' o- i4 Q
& p2 R& H, n5 u- M8 `+ r0 I4 `} else {4 w$ v/ U7 x8 L$ e9 E0 l
8 t; B' s6 o3 ~) q7 |5 G+ m& e
System.out.println("Style Sheets are not supported.");) Z+ Q7 G3 t* i9 E

, B4 U- |! C! k}- L  F, ?% f, i  m4 `' U
3 I& M& ?2 ^" J9 _1 V2 S+ w: l6 T, S( A
} catch (Exception e) {}
! \+ m5 C/ W; E, @
  I* y/ o, S  p# F2 }4 ~0 [5 f/ q}; Z! N! c2 s8 ^
' `9 D- H, n# `- z2 e
}, \* i. Q2 V# }

& H1 E; @+ n7 s, m4 W6 }2 P* \: b(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
- J* D3 p8 ?+ E8 N1 D( H! l+ O) v$ n5 G. ~- }  s# ?  m& k) a
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
6 A: m* `# Q8 e  Q; L. \) v+ B
: B) [3 n, M; D5 ~" A1 U- c基本的 XML 文件
0 B  g7 V- b& j, D$ D
# W3 A9 H2 ^* k3 X) J/ B本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
$ x' v- c1 U" F2 L& V% `5 n& d8 R
- @: a; j$ A% x+ MXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
) ~; U% \. n! V! `/ L  j! `. |$ i/ }5 U
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
/ I% c( n) b2 Z% y0 z
; z. U( }: g: c' F数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。  I) ^3 p0 B- _7 M8 ^, W
3 x. Y) t2 `4 q# R! w8 t0 O" s0 M
<?xml version="1.0" encoding="UTF-8"?>
9 K' p" ?5 s  F! b2 O/ T5 w8 |/ b6 Y. H# _# d  S/ Q$ C) W) ~
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
2 ]! _. |) P: A" ~0 J/ i. y3 j9 \6 W
" D  i: t. D, C# b0 @9 s<orders>* Z5 U5 p+ Q* f

1 J- v* w5 [1 H- U* `0 q7 i   <order>
% r0 u4 G7 h6 }7 W2 r7 V  F5 K& t7 j
       <customerid limit="1000">12341</customerid>3 s1 {- M4 X# l1 @: i

9 Y: }* ~" c! n       <status>pending</status>
8 w+ r$ w6 U) l+ \0 Q- [
. o/ L* W: B) c, H- u) {+ A       <item instock="Y" itemid="SA15">
/ Q! T* L1 V# M. |* s/ N' r+ h- S  e# X
          <name>Silver Show Saddle, 16 inch</name>
) B$ M; ^% n1 X) Q2 u+ o' p0 }
% ^9 O) r6 F; c7 ]% a% M          <price>825.00</price>
0 ?# R1 G$ X* q5 h! B% ^
4 ?: i# p0 A6 E6 Q* E/ y          <qty>1</qty>
& e. h" X) R" r/ ?& I& D7 }2 k! u' V6 e: }5 u
       </item>& ~2 G# r; s& F- p$ o) N6 c
& \  W' z  i2 W! }# M7 i! v; D6 ]
       <item instock="N" itemid="C49">
) M( E4 Q, U, ~9 K- ?! W0 [2 x- J: s% K4 w7 }
         <name>;Premium Cinch</name>
6 B% p, [" Y/ [0 A' G6 Z+ q1 Z! k! n7 R+ u/ E- Q7 v' l0 A& L- w: s! q
         <price>49.00</price>
4 ]- o; i/ G4 B$ u
" L$ f# s7 M* ^2 [' u% I         <qty>1</qty>: z$ a" N$ k) j3 E' c

( E3 ~( l" L, ^       </item>
% n9 {5 `4 v( j3 a
6 t5 P/ p  G7 D) v3 x3 F8 p1 b! }  </order>
; S' k$ c9 Z; M# ~5 c: f! O/ G* W3 v4 G5 E3 |! Z
<order>
( ^5 M  l0 u+ A' c  ?0 [
# N0 f. l, f" }( x2 X& R   <customerid limit="150">251222</customerid>0 V+ j0 a) X  ~) s0 m  T/ M- P5 x
& w5 r' x% `$ f# c
   <status>pending</status>
# U4 t8 S3 z* S' ]7 x
/ ~0 }$ E! v; e$ v  Z6 h) W   <item instock="Y" itemid="WB78">( ?* u+ ~) I: T+ |4 w8 j* b
) h% _, u9 m/ p
     <name>Winter Blanket (78 inch)</name>
8 m; S! u; }$ Y7 e- N( [9 O5 A( @& x, I% v) g. Y
     <price>20</price>
/ X+ ]' a5 c! a$ c9 `
1 T& g% Q, r& v$ d" k     <qty>10</qty>
1 {, J) u7 j/ g9 q3 d/ d3 W% |) x" r% X, a; M& I5 `4 S" [
   </item>1 g; [) g. t% r: B/ y

/ ^5 a  W; d  e+ J' N, K# g6 v, [</order>
- L$ C0 Q) L. i* f9 I2 c3 R, h! r4 Y8 M, ]5 g8 P6 R
</orders>
" S) M2 t3 p. V' q, z9 a在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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