返回列表 发帖

DOM的一些概念

4 d2 a5 ^  V, J6 S, {
开放分类: 互连网、网页制作、web技术
' g8 M; Q3 O( w7 V5 qDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。+ O" R2 |# @, F6 Z

8 a- d- _! q; U* \DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
* Q  E" T" {; g, o
6 ], k+ }/ _; [( T2 }$ O对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。( s- @* ~5 f' Z/ C' o
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
% G# T4 d1 v# P# v: P5 |6 S
, s3 ?8 m# f# I  B+ w另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段8 d4 W: N5 E, f9 u% C- f6 {
- S: N; q6 D$ H; L8 Y5 l  \
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
1 s8 n5 Q  j  g& |$ Q, A
7 S' h1 k, \. t. q作为 API 的 DOM
- ]) A* R; ]) a( E! V) X7 V$ J. V- V, `# |5 x8 _* `; }* V
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。' Q0 C' q, }0 q- s) U; u. B5 s5 G+ Q$ _

5 I% ~. u: w, m* D- C5 M9 aLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
0 [7 `. {- |) \( u$ M- b) U! L# P7 e: ?6 }4 C+ F. `0 I) h
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
( x2 G: S. d) J' x9 V# ]- N% w9 [3 }7 t7 w8 h) T6 v
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。; Z; O' D: E, J0 b" i0 O* t- ]

- b& ]! E% q: w* c) LDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
- ?( \4 C$ z) Z- d; ?1 o, t$ S) c& ], ]; i: B$ w' n
确定特性可用性
  o& f8 u3 \, i
$ C2 m* W: ^$ tDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
) N) g% k5 p  h* o  X8 J
1 p9 p: K* }: d* y2 VDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
8 O9 ~8 Z- i  e, L6 Z, O* s" ^/ B% J
import javax.xml.parsers.DocumentBuilderFactory;8 J! a/ t6 N% X6 F& A+ c: n
# x5 k3 b7 Y7 `  I# O! P& \
import javax.xml.parsers.DocumentBuilder;
  W$ ?2 {! [8 V
" u( u; z  T/ ?import org.w3c.dom.DOMImplementation;
1 Y0 ?. p. z/ i6 d& N! _" ~9 m, `
3 J3 a5 h+ V# x: y) l$ \9 n, Spublic class ShowDomImpl {$ I5 P; i5 L' k8 `7 b, \
$ {" f. d6 Z8 D" ?
public static void main (String args[]) {
+ K$ d4 b0 q9 J, X4 c
# N% n' f8 J& V2 ptry {* q. h3 S! M6 |; F! S8 E

# H! ^  j3 o0 k; vDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();$ n8 C5 o" ]- d* e. l1 }! @* {, S
+ A. C2 H& _, \3 r* a# Y
DocumentBuilder docb = dbf.newDocumentBuilder();
, Y" W0 p- |4 U& Y6 X) a* e  S+ i) R) x$ |  b
DOMImplementation domImpl = docb.getDOMImplementation();2 {1 ^) [% W4 Q0 f1 R) l6 s

: C# x$ P. o" s* R! }& Mif (domImpl.hasFeature("StyleSheets", "2.0")) {7 U9 O! n7 a- T% H* G

9 A- t  c7 u" m9 ZSystem.out.println("Style Sheets are supported.");. r, |9 s" J0 k5 p- y

9 P% K% D) m# R( I4 D* z8 F} else {2 f5 N. w( t# ]- @

  l  r2 Z, G* ~8 DSystem.out.println("Style Sheets are not supported.");. P6 L0 w  ^2 B' @& T$ I7 v2 i
9 {( X1 E9 l0 ]$ J- n; `' z
}
" O; x8 w% V- |, f# z$ [: Q6 {) v
} catch (Exception e) {}
4 m2 |1 ]- ]8 [7 T' v4 w; G, |$ K
2 M' j# T+ U2 T9 k0 S6 f}
9 ]! A) Z9 Z( _9 z8 t( C( I, a  @# ?3 Y/ V# r$ c5 k' t  r
}1 B3 b  q) A7 m9 ]$ ~

! V. d9 ~& J( k9 g& r! L% H(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)! x% I5 k: u; n2 A) _( N+ q3 U. R

' i% H3 G( Z8 U5 h6 p" \本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
# g. D1 z/ w6 s5 s
; y- o9 m8 {1 ^# a3 `基本的 XML 文件
# c2 v# T+ {9 z5 e; ^- O; f. Q2 G+ X- t7 L
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
2 M) a& @" {% J4 {' X% z0 e
3 H& o% e8 \5 E# H% _XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。. h9 g# z5 ~+ o+ y' _% i
8 u# j& A1 m, L1 `& E) q: i
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
: Z% o4 r5 @  p: X8 w
7 p. q9 o7 _. L( ~: j数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
5 R4 L" t2 p0 f$ @7 J) E5 p& b( N$ b$ X$ E- C: G
<?xml version="1.0" encoding="UTF-8"?>
7 P7 k/ W: z4 g% R! k# c1 i2 b  ?7 O: ^+ b4 U
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
7 z+ T# s, t& Q, q) w7 Q8 v3 L7 c4 R+ p* L# @7 Q3 w
<orders>
" j& |/ u7 P* c0 b& P$ S% G0 h/ [
0 [, y' ^' i) X   <order>
3 ~7 \' A/ Y( ?3 p1 b3 b. H/ B$ _$ T& ~: C1 G8 V% h2 ^- Y' x; Q  |. \
       <customerid limit="1000">12341</customerid>9 n, M- R2 Y) t: U

0 l$ p+ d+ @1 W$ o4 L  T. ^' b# v. m       <status>pending</status>
: p. A* K' N. m+ I+ F; |! b' S2 [/ M- T3 f
       <item instock="Y" itemid="SA15">4 z: x1 c2 B7 c" S

9 f! w5 k8 g7 X1 h9 H% ~  U- ~5 [9 c          <name>Silver Show Saddle, 16 inch</name>
- V, Y/ z, B8 l! E
/ U5 y8 g8 G3 D7 o- `7 d          <price>825.00</price>
3 w# g, x( |, e8 s+ G
6 B/ K( c) K& G1 {6 p$ r& p          <qty>1</qty>; S' p0 t# c1 a4 T9 J6 R

, B) U6 F+ J4 n% L) z' I       </item>
) M6 o! v- |! c- S# l& w* q; d. M8 _( y. @
       <item instock="N" itemid="C49">7 `4 z$ a) L4 ~8 m
. @. s) k4 {3 z2 a1 \3 h  c8 k
         <name>;Premium Cinch</name>2 f: A8 _5 D# s  \1 L

/ H6 N0 |+ W; a1 |' B         <price>49.00</price>% F6 M; _) S/ C8 U+ j# l
, [7 T4 W1 e0 G% L. _5 x
         <qty>1</qty>3 Y4 l" P' C( T+ ^6 n0 W- G4 M+ ~0 y8 Y
+ X2 k' r! u/ E. `* E
       </item>  `4 r2 S  b' ?, E; C- \
$ Q6 H( C! h  F: h' I* l* V* q( |% [
  </order>
: f% A- E9 D8 D0 n* ~. T/ ]
" W  E0 J! Q0 T" M3 _* k3 M<order>1 S* ~0 |& R; u/ ]0 ^/ {9 U1 o

  Z9 S- X" }: j+ J   <customerid limit="150">251222</customerid>, B3 c; f+ t3 K) H8 f9 Y' m
0 U0 |' C' T- G4 p& R
   <status>pending</status>6 r) Z, {1 P2 w& y3 ^1 o4 z# _9 ~
9 ]' w# F8 H7 f; r
   <item instock="Y" itemid="WB78">9 v% i  f' E0 n) V- `+ @. E. q2 z

# b, f/ t/ W% T' L2 a: Z- M, W) ]/ ~     <name>Winter Blanket (78 inch)</name>' O8 G# _4 U% D8 S4 W3 b: D
# i) p+ w1 s( Z/ l3 ~
     <price>20</price>
0 _* x4 ]8 M# s! u. r3 p  l5 ~1 L- K; ]% V  v0 @
     <qty>10</qty>
# w! i( T' a% q+ [9 h4 z" F$ e
   </item>
* u9 u% a, K6 e8 Y. n- H/ w- o: Q9 t1 B" b/ `: F
</order>
1 r- ~2 k$ U9 u4 ?4 H+ m! q; O4 R" v
</orders>
1 R$ q4 Y# x3 b) X* a; s9 k在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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