返回列表 发帖

DOM的一些概念


$ r3 c7 y* T( _5 l开放分类: 互连网、网页制作、web技术
/ S& q% m3 }$ U) C- K& eDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。" B& K% @( z1 Z# t
# J$ U5 L/ x# H$ @
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
$ K2 T' c3 f$ E/ k- p' n4 z* u7 _* a' R7 j9 A
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
, j7 E( _0 R! |0 [  X" n9 R: aSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
# n/ w' h. _9 @* A1 x% X- Q4 h+ X6 ]4 E* n
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
6 f' p) Z) g* a- \
6 y3 `+ Y  i* A% \. X解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。3 W; p8 c, Q. e7 k% v
% }; ~# H+ A1 f9 s
作为 API 的 DOM
* N# G; Q  u1 {$ P1 X
3 h( b2 b) b; B$ I% W, x从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
+ a6 Q6 B  r  G6 o4 w, |6 Z8 @8 s" _, @  ]$ u6 ]* s9 m
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。- v$ X6 X6 @- `% F# `
6 p& c; n  B. g) s* W" r9 v+ z) q
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
! C) e% W2 @1 I# s, A4 g7 k" v
' B% U# @. {9 F+ `3 y0 r当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。& a: F! I) q# Z1 R

1 _1 b' O' p! a: H+ N! @! O3 s0 mDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。* J* i+ V1 ?. Z
* d$ Y3 Q4 @! r2 X) t0 l- o
确定特性可用性4 w' X  c8 [* n1 H3 e
9 _) w7 _% Y) t1 f& U+ E
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。. i: D9 X% O- x/ B
& G+ P/ h5 @/ Q3 Y5 c
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
( [# q" z7 w; P/ K3 f; h! u2 z( U" G7 T0 s; w5 F: H
import javax.xml.parsers.DocumentBuilderFactory;6 ]$ G- A* |0 I; Y% g0 L' [$ L; q; ]

8 m9 Z+ z* d$ ^+ q% e' }( Zimport javax.xml.parsers.DocumentBuilder;0 r# J! |- A; T) r) x- U

8 t6 T* o& b* ]1 Bimport org.w3c.dom.DOMImplementation;' g5 j' w1 _4 O

( C3 s+ b- A/ ~4 ^/ s% W5 jpublic class ShowDomImpl {
. F  ~: T0 q( H2 y5 h1 M" y6 D5 Q" E
, X7 Q/ Q2 |  O! Z+ V* _- A# wpublic static void main (String args[]) {6 ]0 ~6 P* I9 E2 o3 _5 _8 t
! b3 }" r! m: l- L
try {( D/ H, @9 d( o+ d  B  N6 g0 ~
5 Q! l/ B  z# x1 j* Y5 g) G% x4 o
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();! @* U9 {) n( {! g# o) p( X) F
1 S7 ~# x( I; e) b
DocumentBuilder docb = dbf.newDocumentBuilder();7 x8 D+ z' ?: @7 ?
' a- g% I& l1 R6 t. L
DOMImplementation domImpl = docb.getDOMImplementation();
/ m( ^$ S6 h: {' e* k. Q$ d
; g; S/ S# w3 ~3 e+ z/ Mif (domImpl.hasFeature("StyleSheets", "2.0")) {% }* B( P3 o- E" Z5 O* e" U1 \* w8 m
: K6 j% i4 e9 _5 _3 M" x, ?
System.out.println("Style Sheets are supported.");
+ G) p0 s) G* c- W3 s$ o3 T4 m& K- f7 x/ p* Q
} else {0 f0 f( Z/ e7 l) T# b, w$ k
  k- Y% c8 }  S1 B
System.out.println("Style Sheets are not supported.");, U' M1 B& u; D7 D% J

4 B; n# _& u* F}
- M! B% `! J2 |# d9 ^) n. W4 b7 I- K- d' N6 e7 N' v
} catch (Exception e) {}
+ S4 c  C' F6 y. f5 U) R) y) o: C! O  T9 R9 R/ w
}
( s/ `* C* N) C3 T5 N9 t1 V7 {; M! W6 x: J4 j1 V4 i
}. ]6 ^3 M# L1 G8 b

! ?) |. e; P; k- d- t(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
( |* T3 T; m% ^0 y3 `
6 E# T4 L9 J1 Y; Y5 D6 Y3 g本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。% @- G( Z. m  s' |$ p1 J9 }" a4 n# W
# ^0 X5 ?0 m# D+ m9 Z
基本的 XML 文件4 F. Q& ?/ h: B" _: Q, p& N

$ D, e2 R8 D3 R$ b" q本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
' G! ]0 B# [, N5 F8 n1 G
# L# S- f6 D. g- F7 jXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
* N  o+ R* v0 R3 D+ j8 u- I3 k
/ \8 m4 v6 l$ }5 ^DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
8 m: [2 P' F: ~# J2 w+ m
, m$ @" ~0 A9 ^4 ^( R数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。$ X7 D# b' [+ Z( j

" W- Q0 q& `/ Y" N6 B<?xml version="1.0" encoding="UTF-8"?>
+ S  U3 D4 S0 [1 M1 k
) z. c0 }5 A+ Q<!DOCTYPE ORDERS SYSTEM "orders.dtd">
( F; ?( `& {2 X3 i% @
0 l$ J$ l' X$ L* @<orders>- M) G$ K9 W1 z& S# o
  C. ], o; B: C. D0 [. X6 d& x; G
   <order>
, i! M6 H+ D& X5 E& }4 q
, P) E1 E: z' P0 Q  S# y5 C       <customerid limit="1000">12341</customerid>
7 f# ~+ ~  r6 n" X' ?2 s4 C- @/ i* w# `, I9 i
       <status>pending</status>$ A# W# P* }& r5 C

. `  M' O" v/ O+ X       <item instock="Y" itemid="SA15">
' {* a: Y9 k$ W% y' s9 n7 P9 @/ q. |4 q
" r" H- ]5 ]0 N          <name>Silver Show Saddle, 16 inch</name>0 p) P7 k0 }6 T5 p
" z5 J, \6 r/ e, p, w; _$ ^' S2 C
          <price>825.00</price>& P( Z) _* X- z! ^/ d- S" \

* l$ a+ c! U# f! R8 u  M2 X( |          <qty>1</qty>
' z  W& a+ t5 D- _* C+ [, K: H& `4 g5 N" X% l
       </item>2 q% ]+ y- `% q% S; J

, y" b2 _. Z' v' ~       <item instock="N" itemid="C49">1 g( q8 o2 h4 j/ e) E, L( E9 Y

4 i. W% b$ y/ Y7 h. O. ?2 C# x         <name>;Premium Cinch</name>
" [+ n* n: B* I$ N' A9 D% G+ _' D6 }. I
         <price>49.00</price>1 j& j3 z3 B) n  l& L
+ j& H. }% X- ~  O9 d: X) w4 N
         <qty>1</qty>
: `) e. Q2 R- Y0 a& e" V
$ \4 D9 |  n1 W6 h! z% ]  l) t       </item>8 T( X7 u; [2 q7 k
( S9 g5 a5 |( {% v) i% O3 B' h! {
  </order>
: k1 f+ s. f  d9 E6 b6 K. k& Z) o( v5 C# M; R: j; d) V. T
<order>, u- w3 }" q) d8 J

# S; F' n- R9 p$ B+ C   <customerid limit="150">251222</customerid>- u! h  u" H8 K( g

: B, i* W1 f3 G! A& u& }0 |' K1 G6 h   <status>pending</status>0 `( b) r9 j# D. o+ O; G; |. v
! y0 Z1 y2 O& D0 I1 _; K( e, Z
   <item instock="Y" itemid="WB78">4 v+ }0 n( v$ ]+ H
! F; r0 R( O7 ]+ d% E
     <name>Winter Blanket (78 inch)</name>; B9 X' n3 W/ }5 d# a0 K3 W

% t& a; c2 u4 P5 ]% e/ [  x9 F     <price>20</price>
2 Q- V2 y  @& h  N, ?! h
/ Q: M8 [& i) r" Q     <qty>10</qty>5 P! Z( D% K8 a: r/ u
0 j% B& j5 Q; r" ^! t
   </item>
* C! q2 @. S$ T1 m/ C7 b4 X( _% _8 y. Z' I
</order>. Z3 z/ ]" a, D
' {5 q2 X; w# `6 X  a: M5 E
</orders>
# y* I/ n/ w, z5 y" o2 U在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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