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

DOM的一些概念


4 r/ d% B$ O5 e, {开放分类: 互连网、网页制作、web技术/ t! L2 l* q+ b5 l" z2 u: X
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。/ M4 ^! P5 j/ f3 e$ [+ `  o/ O

$ |$ |& Y9 x$ P3 T6 bDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
4 `% R& j" Y5 s: J5 u
2 ]# N) ^. \1 L0 g& J; B对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
! ~6 X8 A4 D. K4 l$ L& i  w- c# n9 r- dSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。8 |& [  k8 y/ J4 d# K. Z9 C/ W

. [5 ?; T7 u' K* c+ R" z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段' B$ K; m$ W9 e" N8 s
; w8 C3 D7 x$ t
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
+ H7 u/ r+ A3 }0 z+ _- u- A5 R: ~1 G$ v( Q. n; @# \
作为 API 的 DOM/ W6 ^! Z, F% ]% A% r7 N* ~

0 K! R  ~7 s. E) U6 H! S从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。8 w3 h- |$ T% n9 }  k1 q' f

- {) y: V* P- t) B0 ELevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。: d& A9 g! }) v$ ^9 J3 O

  j1 Q# t1 u4 C/ m/ }* YDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
0 a3 h4 m6 c3 r% o; ?
6 R' I) m( E& w当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。# F1 Q- @9 Z9 d6 d; \, Y

2 P# X! G) K1 KDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
% G+ ~1 c! e  j& ]% B% M
$ Q" l& |# h; E, a7 z% n$ c确定特性可用性* W! N0 \. g% y6 k
: |, {4 P; t. g8 j6 x! V7 l7 ?
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
2 J  u* @  ]4 F5 Z5 Q! `2 y8 b; X7 I" d' y, r) K8 A
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。6 Q' |1 p4 g: F# M; {  M1 r, _
& D: l1 w# U* }# o, v4 r
import javax.xml.parsers.DocumentBuilderFactory;6 }) D2 r4 Q" M  V/ s* p
' i& L2 A+ v; d) z6 b
import javax.xml.parsers.DocumentBuilder;8 O0 c( I/ h6 u. e

/ \9 d0 @* X/ E, \import org.w3c.dom.DOMImplementation;
. c" h& t- Q8 b5 r; L5 g& E
! n- r- ^8 `# Apublic class ShowDomImpl {0 R( z$ _' {4 m5 C
" M0 @0 q# w! ]- Z
public static void main (String args[]) {/ r# D+ {2 r& l

- ?4 w/ X/ R$ h0 a3 p  Y. V- ctry {, E' c, _- S" {
7 l2 w: X! z  b% n! C' V
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
' x  g1 P: f3 {2 W, }
4 X) a; O, w. J. s6 o* e* n% ?  H8 VDocumentBuilder docb = dbf.newDocumentBuilder();5 t* J6 |" h: q

; S2 r- h6 d9 j( P: G. ?DOMImplementation domImpl = docb.getDOMImplementation();
) f/ D! N( m  o+ R" F
  C/ v& M' Z8 Rif (domImpl.hasFeature("StyleSheets", "2.0")) {2 T9 H. n( J; ]/ ?) P; i) _

2 n# W5 O! B8 ]& ESystem.out.println("Style Sheets are supported.");
* y  s$ e0 ]; L! H/ o9 ^8 q! `9 H# W% A
} else {! h7 [/ E! h/ U# Q/ I2 I
: O0 d) g, G! `; p
System.out.println("Style Sheets are not supported.");" Z: A+ R+ M) l
% G4 f2 C7 k/ X8 [7 G
}
2 \3 g/ M" A* o) v" v' s2 s
& B9 Y# U6 }+ r* G- L$ }0 X} catch (Exception e) {}# P. C+ w9 o7 a# g6 e. C5 B3 A
+ {7 T: ]* V9 u5 t2 Q4 Z, U" Y
}
2 @/ c3 `2 N1 P9 u% C, q" M/ ]5 g4 U7 R+ \( z0 `+ }& R
}
+ a% z$ s0 I& Z+ Q, a8 y7 E0 b' U
; w) t# I8 ^8 K2 n6 F+ d, O' N(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)3 ~) e; g. m# e2 |' Y5 B

! W# [0 C6 N5 w8 U6 k$ l$ O本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。5 B6 K7 p2 @3 g$ N& R4 q
7 n) Z- x' A$ E7 \4 c# G4 Z
基本的 XML 文件
4 ^% C# Q" }7 _* ]. J7 W5 g, w- u# N0 h7 ?$ \( ~3 p6 @" w1 h! p! d0 ]
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
/ K# K; Q( i6 x; [  t" B, _( f+ E; y+ Y7 O+ S2 J" k7 }
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
' d' Y' b; g4 H* b
5 X0 S; a2 f2 V( GDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。* V% `) O% a( ^5 h# p

. e: K* r8 {+ ]; P' ?9 K数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。- ]: F/ m  h+ I+ R

5 y4 {6 [1 K4 s& _) g<?xml version="1.0" encoding="UTF-8"?>
  C5 |6 p* u% x# }: a7 [* S5 ]1 q7 ~- y" c( M
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
' ~  r/ G. z+ N' C+ r/ U$ g7 B: e! b% @. T
<orders>
0 N$ u) h6 q) O
7 {) ~& M/ v. ~) r0 R# Y   <order>" H8 I4 `+ w! m; S' ?1 D$ O/ E

- {& f" b5 ~* Q+ p9 y2 h       <customerid limit="1000">12341</customerid>
6 R% i( D# r1 @9 e- \6 v9 |; j
       <status>pending</status>9 H8 n$ t  W0 d: i0 p0 g; @& \' K6 ]! J

" h/ W9 }" F0 e' S       <item instock="Y" itemid="SA15">
  ^, \* c; r' F$ [7 Z( P2 Q. r$ V' H% s# l3 Q- N! N
          <name>Silver Show Saddle, 16 inch</name>. B$ I' C) `/ R1 C

+ A+ S7 `/ c; U" o8 @8 R+ Y          <price>825.00</price>
, t0 n3 {) p7 u, {
; O' c1 v0 J1 @# y+ t          <qty>1</qty>
0 ^; N; I# u! E/ ~
) r  H4 Z8 p+ T4 `; y* K       </item>& R1 D) w' u& E0 r, w9 m

( u8 H/ y- V# Q8 j       <item instock="N" itemid="C49">
4 V  H( q* ^+ x2 o- ?" v6 p# X' L+ K
$ d6 Z, |0 v: x  j         <name>;Premium Cinch</name>8 @9 i' @' V$ I- X; J2 O: I' U

3 b3 n) i9 l4 L% {         <price>49.00</price>
! e( G( \1 p7 J- Q1 h/ i. b+ }
1 |( g$ ?( j# p5 g( B8 m         <qty>1</qty>4 k: V% ~9 l6 a7 g( p% m! t1 s) `+ A
0 p* H$ S+ n& H
       </item>  X2 A# j5 u+ Q& j7 [

# A8 c! ?1 q5 [% E5 y& {  </order>
+ i1 h: E- q  k- X2 G: x- i/ E/ w4 R8 n7 v; O; e4 m8 ]
<order>5 q* U7 V2 ]: _! |' a

$ W4 Q+ Z5 `3 F0 A3 X   <customerid limit="150">251222</customerid>
& T/ `7 r6 R. L* E
. y- I# ]" p2 {" [1 S8 o8 X   <status>pending</status>
$ V# U: L0 m/ _8 @6 M7 W, D
, L! O$ t, L- V, v7 q( P) f) f   <item instock="Y" itemid="WB78">
9 i$ B/ b* D+ R# @4 H3 Q( J9 y' p4 R) z- U; H
     <name>Winter Blanket (78 inch)</name>3 k4 o  E9 B6 `  P- `
/ P$ U6 C" r4 a, D9 J
     <price>20</price>7 k% L; v' A& w- I6 s% V+ \
$ {% ]" A) a' |, E! C; T
     <qty>10</qty>0 a# n+ g1 a5 }

- @! p4 Z# i  r6 g+ Y0 G/ w   </item>/ V/ v/ }, ~8 {2 T
5 A. {, C9 P6 B' C5 G0 q7 y
</order>$ Q* ]7 \, c  j8 M! \+ C9 r7 |

5 _  A- Y8 p0 b- V) c* W0 A5 K</orders>
) A. d7 a  ^. b. F2 ~在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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