返回列表 发帖

DOM的一些概念


; `' F; M# i- R. F3 \6 O) H开放分类: 互连网、网页制作、web技术
: k' i  x- U" Y+ a: a% sDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
( A& U' K) Z# _/ ~, c
) J" O  N4 P* _% d( o7 WDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
' v& O4 s7 P2 E/ P4 y4 v8 w3 W1 T+ r$ y5 u) p& q6 ~' S  t# u8 M
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。1 |2 G' S1 X. F! d% J
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。0 \/ V( h1 v4 c9 n

" c7 g+ H. k5 S另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
+ f' B9 ]6 j1 E0 U# ?3 x
) m9 s2 R5 @5 }1 |) l* `4 N解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。! U( [' g) p# v; ^
- c7 R+ l# y) m- A3 D5 Z( L, G
作为 API 的 DOM
4 k0 r" h% c  B: n
6 f/ m5 T# O) X9 H" i: q' S* w, U从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
/ _6 X7 Z! x6 V9 U1 M, u3 n  b" ]- o& {
1 ]8 |0 L7 D8 {+ h9 Y! x, XLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。" G/ B( r. [1 W9 P5 O3 a
* m9 V2 ?  y& e/ b  [1 U/ m/ w& F
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
0 ^  S* h' j* {$ W* b- X2 J$ W% J/ @4 n6 Q" Y: F
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。  z+ N7 h' A$ e3 g' m" X) @

$ f' G5 S1 a' D5 ?% YDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。. P# v8 \7 C, H1 h! U( J$ ?
; B; i5 O/ K+ N) e. f8 W5 y8 T
确定特性可用性
4 S/ U' {) Y; W# c3 N  ~8 Z! x- y" M& S3 p% A- h) F) c0 D
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
. Z8 o* p$ R8 r5 r0 a. W) y1 f. F. i# f0 h; u, G8 x; P4 b2 g& B$ k
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
+ A5 [" q. \* ?$ T  Z4 e8 h$ ~
" \2 V- R" W5 f0 D1 K) Mimport javax.xml.parsers.DocumentBuilderFactory;
& v+ v1 @$ k( t2 Q5 W& ?  t3 f# O# y, S7 s; n, e# S) x
import javax.xml.parsers.DocumentBuilder;  r1 k0 O5 Q5 }
4 D3 U, r. k! e& ^9 \& j. c9 [6 p
import org.w3c.dom.DOMImplementation;! O; ?4 N- D8 ^/ z
8 j5 q* B' L+ U. y
public class ShowDomImpl {0 c5 ~  a8 J1 k3 `

$ T5 O3 z* c9 ^' n2 Bpublic static void main (String args[]) {9 |3 J% T5 O6 y+ p( s$ \/ ]

9 i  t& |, w: _$ z; Atry {
1 D# O' m9 ]/ j" Z$ S' c
8 W  G6 x$ @  Z! n7 l3 j7 Y6 JDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
: h4 f# T6 Y# I( R# u0 I/ c
- D! ?1 u+ v9 h, t4 ODocumentBuilder docb = dbf.newDocumentBuilder();
5 m1 @2 {+ Z) _, u  W% |7 r* r; _- A$ O6 h. w& ~* D/ d# B' v
DOMImplementation domImpl = docb.getDOMImplementation();
- h% J9 U( R% L! V  E8 @' k8 v) r( ~! k0 n+ H  y
if (domImpl.hasFeature("StyleSheets", "2.0")) {6 H3 |8 \. K! N6 p5 b: r# i4 k
4 ?# O' ?6 S3 Y& m
System.out.println("Style Sheets are supported.");9 I: E' {7 o% u& Z* P. O; A) i: _/ Q+ `! Z
( t' B% M) Q2 v5 L& V  Q
} else {
' _, j- n: ~- {9 o& N% n' z" |1 @% ]/ N1 S3 s  }% F
System.out.println("Style Sheets are not supported.");# {& s8 F7 Y4 l$ c

# L2 k; K! l" U9 b}
& G! O! j# d( _' ^8 W( Z( h7 ?3 A' M+ L) c" O6 b' v5 B5 F- P
} catch (Exception e) {}
$ r% o' o# w3 {  W% }1 L8 U
8 }% y0 ^0 q5 B" {}* l% D  G- V/ v- A9 ]; D

! M& e: [* S" ^- L, Q}3 j# s1 p/ Y4 x5 y/ O# @# R6 O4 @4 ~

1 B& V( K: R: n% I(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
! X* K' x8 @$ P1 j% j0 U8 G
% E. \/ ^- Y2 u+ h5 ?9 P本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。+ d) Z& M  m+ Y" I5 L
. T/ I& r8 G( l, d
基本的 XML 文件
  K. j( {# s$ P6 {1 m3 S, @; G* M* T" A
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
6 n$ H0 H  U3 u+ [: v! S3 ^
; T% S6 h) X! c" @XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。3 j& a$ v8 r6 E) O5 y% u- ~
3 V  P2 S1 Z/ V* X: z  ^9 |% K2 V
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。/ D1 Q8 n! V( o
6 B. x! e: U. N+ I$ `2 y4 Q9 ^
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
' [1 g2 n+ j" s* H' G6 I* ]4 o) I  i2 b* u# F
<?xml version="1.0" encoding="UTF-8"?>: {9 i) a7 s0 f( R# D) _
* f* j& b+ M8 c* J: f6 }  Y$ w
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
4 j  f0 q0 T" g2 R! v* `( j' D$ z. |' L
<orders>
. a8 u' x& H. Q  P% |2 g
- {! {0 x. S! H! |4 Q   <order>% d" G5 x' w# ?* I
+ J4 I8 Q  r+ S
       <customerid limit="1000">12341</customerid>0 L0 S9 e/ m! w) A* r# n
1 T8 `) q3 ]5 |+ x8 M5 \9 o
       <status>pending</status>* X8 M3 C$ i, t" g) A

: V3 V0 Y+ z% A       <item instock="Y" itemid="SA15">
2 y" f% \; T, Q4 M  M' @, M
0 s( O+ N6 R- N5 ?+ i+ B          <name>Silver Show Saddle, 16 inch</name>
7 U! B$ f: U  ^
  |  V' r' [+ v+ G          <price>825.00</price>6 H0 j% {' d+ X1 E' v

% _* M* n7 o4 f6 I+ o. M3 \          <qty>1</qty>
9 O+ `/ R# C& \
" |8 q  \5 U1 T9 F       </item>
, g' ?5 ?. [0 z8 J* }2 y8 E2 W: X. H; m- a1 @
       <item instock="N" itemid="C49">2 O  ?4 Q8 `* E. x: u% j# C
& c) u0 T8 A, r
         <name>;Premium Cinch</name>
9 D. D' g/ a5 g, g" D9 Q4 D8 V9 G" @$ k2 ]' o
         <price>49.00</price>
( e& m0 M2 p0 j- u1 T; X
" u/ z/ \* U2 x) m2 D         <qty>1</qty>
+ L" I7 m7 g0 g1 i
: E. t2 H0 h7 I0 l' Q       </item>
3 q  T4 m, O9 Z* P  L5 L8 F  F$ O/ ]( k
  </order>, p' M* E. W3 F/ g8 u  S: c6 U

$ D! g4 `: P# L<order>% E0 r7 e, p$ L; p& g9 \" Z

& [3 @( z# [3 X) T4 \   <customerid limit="150">251222</customerid>
5 e. o4 @6 r4 Y% |8 x' X( n
% g2 Q. A5 F# x; s: l; |2 U5 T   <status>pending</status>
7 R8 a8 W4 c* s# ?& }# E0 C) S) |/ o' b& D6 l( b" ~5 A
   <item instock="Y" itemid="WB78">
3 B+ _: J  m% e
# X1 `0 N( m7 U# Z+ Y" n/ G     <name>Winter Blanket (78 inch)</name>" a# l+ }* _' \1 w, i# E. q
- Q7 E" _* d+ d* I+ N7 `7 n
     <price>20</price>+ G9 G) a8 u: e$ Q" G

) d9 z+ r' A* q3 M7 v/ D9 K     <qty>10</qty>
( w% Z) z4 j& k# D5 `! m% Q& u0 d( o: `
   </item>
8 Y0 S( x; F' ^: b$ O8 O8 {0 a/ c( L0 W/ k( V0 P( X( h- T1 z
</order>
7 |0 R! J: Z5 J  E6 d
: i: O8 l7 p- M5 _! i# @</orders>; q- o  C1 O! y9 H9 @
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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