获得本站免费赞助空间请点这里
返回列表 发帖

DOM的一些概念


/ \: h4 }7 p- E* P& J. \开放分类: 互连网、网页制作、web技术0 k, |# X# G# h( N
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。9 V* `! O6 h$ s2 L5 ?- T0 [# C
1 D% \# T0 b+ e" w' D. Z
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。  a; d/ R! l: D. y
# ~' B) k' k. Z: q2 z/ k# \
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。( N! H3 M# x( S
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。7 K$ U. t8 k9 i
3 h. X/ Q1 V2 g; E2 |
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段& A! V/ i% S' ~  i5 g' f6 ^

4 H9 ^2 ]) D# A6 B$ R解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。, Z: E( D% f9 f' q# X2 f
9 b; @' u3 u4 `5 @
作为 API 的 DOM7 C: D6 y/ J" P7 L4 r

# x! F9 a8 x  Y" c# P从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
" X# z$ @" J2 E
& k1 W7 h8 f  h6 N8 k) E. }1 PLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
2 _4 x, L1 l/ v5 t; w2 k& a9 i/ [2 S2 ~0 ^* P
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。7 b5 _3 N0 g8 s2 X* J* W

. L: z% w) _0 M/ n当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。3 p/ J( H% K' u# r- d. Q

, X6 l" {. h% n4 L2 ADOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
- m! O" z  ~6 H* I2 I; C2 @
" m: k  d6 t) ?, P* b确定特性可用性9 h& @  v! q2 B" ?0 w4 _- o) J

; L. r8 z- s# A# DDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。; j$ P. R/ |+ _' C6 h' k

8 m( g- F8 R3 xDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
. _7 |# ^/ n* {4 g
. ~+ p2 s7 j6 Q! m7 e3 g) n, A7 q# rimport javax.xml.parsers.DocumentBuilderFactory;$ c( N5 n5 k/ `& W. I3 N
8 t; O2 E" G% R
import javax.xml.parsers.DocumentBuilder;
+ B- w" z( h4 ~1 ^0 j6 D9 K0 U* W& W9 r+ A3 S
import org.w3c.dom.DOMImplementation;8 Q* d+ I6 u' E! k

0 A4 w2 z7 G" h& Kpublic class ShowDomImpl {" f3 {& ~4 {) h& o* w& [( @
; k* A* t2 v9 J* S$ I! S
public static void main (String args[]) {
1 X. u- E: o' j8 ]
, B- f2 |3 ]* C" htry {! ]( e" z4 D  S1 B5 u
6 V4 _* q( z1 r$ e' U
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();* J+ f3 W9 @' K7 }* s/ w
" b- ?7 X3 t, t
DocumentBuilder docb = dbf.newDocumentBuilder();- t& K- g/ W, H- ?& T
$ e4 A7 v  p5 h: @& P
DOMImplementation domImpl = docb.getDOMImplementation();
1 S) V2 G4 H0 w3 f4 o, K4 N7 p( b& W" c; j" C2 n4 b6 p" k% Y
if (domImpl.hasFeature("StyleSheets", "2.0")) {
; |. n1 B6 D! \3 K& I3 G* v
/ K3 E: f# _; Y$ M4 f. F* a$ z" WSystem.out.println("Style Sheets are supported.");" `4 E4 W% z% x: b- X8 J, O- e6 T  F

) U, K$ q4 B: V" x) I7 A& E} else {& c' q: z" ~2 S" n4 a- z

) L9 K$ \- j0 W" [3 t0 C2 Z2 Q, A6 z) V$ ESystem.out.println("Style Sheets are not supported.");: s2 J' `+ a& U% K& _6 Q% L

8 j+ [$ r' h% S3 ]}3 D* r2 e  O0 [7 m* |
5 ~; T2 r: M6 R0 R1 h7 d
} catch (Exception e) {}
+ V7 K9 h- {% A
( P! P0 S- e  a) P7 }}; K: X. U- z: @% @! _; q" R
. V3 N3 T  ~' G! i6 p; d0 `: _7 ?
}
# D; p) }! m9 o' @) f7 {4 |6 L8 j& }
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
; ~& O$ z0 b& H* h. m4 I: d% e4 O- q7 ?  v$ R
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。+ a5 k% d9 ^8 O6 a8 V! f9 }  L& I

6 o1 K9 o$ ]' s* [基本的 XML 文件6 {- b9 s0 {( |" z: C
$ ?' @9 \% k9 J
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:( ?8 o  W; d0 b5 V  v$ C6 w8 x

# H  |+ t8 T1 Y# I5 TXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。$ Y! i0 l; X# h$ j' o0 B7 C% ?1 V  A

9 z# Q/ U; ^* g; J: B4 g* ~7 yDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。2 a) A: \5 i! X2 V& W

& ~( @3 k. f, s8 r+ L% g9 E/ [数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。3 f( x' q5 \" [! S

+ ?- a: W9 j' G<?xml version="1.0" encoding="UTF-8"?>8 U, f9 G2 R* a( ?  x; [

1 T7 O/ i: q" w1 ~+ `' ?  S<!DOCTYPE ORDERS SYSTEM "orders.dtd">  ?8 \: O8 N9 C7 C/ q

, ^, m# e. l! ]. v<orders>
3 n# }1 V$ W( B8 ~/ _
1 N8 {. q% ~7 |! V' S8 w   <order>2 g6 o2 l- A6 ^5 e0 d

* T( P. N$ V; ?9 t" v2 s       <customerid limit="1000">12341</customerid>
( |$ r% M6 Z2 f. I" P! L3 _2 r% X: \; i8 O5 V( I( l
       <status>pending</status>5 H. A8 E+ z3 R4 v8 M  N7 E( p

6 M2 h$ w2 B- J8 e# B2 k3 Y- a       <item instock="Y" itemid="SA15">- n# n- ^  R# x/ o7 M

" F' ?  {, ^& |" F! W- Q          <name>Silver Show Saddle, 16 inch</name>
' f& E* M9 ^" A& G7 ^0 I5 ~$ [8 v( B) E7 \, x4 k% e; P
          <price>825.00</price>, y/ d! i5 l+ v% c: o; v* q  J  R

- b$ t( n2 @, A6 }' N9 o! b6 R          <qty>1</qty>& P  s" ^+ d6 @: E
! M4 Q1 _7 o6 z  i; N
       </item>! o# |; T5 C6 g$ v* }5 \  f

& b: o) g0 T0 P0 q       <item instock="N" itemid="C49">
, Q. h$ H! U* e( k! n$ O( K5 e4 r9 r8 X6 Y1 S" a6 a/ `+ }
         <name>;Premium Cinch</name>
  o7 v  ~+ ]9 s, s" \  B4 R- F
, J+ g5 P2 K! q/ j# @! U         <price>49.00</price>
, p4 u) E' q# X' ^. P# g  @
. w" ~1 m! {+ w7 C) D         <qty>1</qty>
0 a+ q5 F% h6 u. ^7 a& C5 g3 m* ^- W: v) a
       </item>
# m5 {, t3 o# b" w& x
0 {/ R  C; Q/ p. h! c  Y  </order>
0 |6 v1 S, S0 B6 U
# `4 s# }( w+ v- W& G$ f/ H0 U; D<order>* _9 C6 `1 o0 M3 g6 o# q

0 X- `. I0 Q- K# N8 K$ A   <customerid limit="150">251222</customerid>8 C% w: w0 H- G5 o$ v/ q

9 M0 V& {, l$ J4 d, J1 j   <status>pending</status># J1 R2 C9 l  A+ D  s9 Z2 j( Y

. ^( h  G+ V! F6 Y5 \+ v3 O! E" |   <item instock="Y" itemid="WB78">5 N' Y# A/ g$ T6 T

, C+ s$ H& X% G8 \1 f- u     <name>Winter Blanket (78 inch)</name>" W, p" e6 ]+ G+ Q" V

* ?. C. U( C  J$ S     <price>20</price>
# `; s! w9 B4 y( o. K0 Y, a: q
) {# j1 O0 d4 [+ r& n     <qty>10</qty>
  a) K1 ], G" Q  k8 i
9 F7 c. y' j' y! W" ?$ d. i( a* n   </item>/ l* B6 s: I* w. X9 \  R$ V0 p2 l
& [$ E0 r5 |/ n
</order>
, G' ?; P& o7 F& o% g
$ O  O/ P0 n; p/ L7 H4 x# U  z</orders>. _# u  R0 u# P: H6 c5 v8 K) L
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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