返回列表 发帖

DOM的一些概念

: j; \  G; h/ t; C
开放分类: 互连网、网页制作、web技术% y! d7 [' i5 x1 k+ I! m6 ~& b! X
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。5 z, S- Q3 {6 L! v$ e# H
# b$ G1 q) b; P
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。/ V  ~% r' ^( R# o

- j0 J) X+ t* ^& G0 Y对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。9 h3 `/ y+ ~/ d' k
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
0 U7 ~& D3 A$ b& N0 ]: K1 R0 q5 k% K( }8 ^) e0 l- g7 `
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段8 X$ B; N* [8 R6 G* Z" R

5 [9 f! ?2 a+ {% f" n4 T# b解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。" r2 g8 K' ]4 z& r# u0 h

6 y0 y" u( Z/ X# \4 P  g作为 API 的 DOM
9 q/ @3 }9 l6 I# N& o3 [4 f1 _
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。9 d) w& p! Z6 r! c5 o& n
' H) q1 a' D% s% b8 R) T: h4 z
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
( p# F1 B7 V# A9 @& n; G
! Y& d; D, |7 v9 XDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
& m$ g+ K7 _; K! v! a5 T2 I9 X
. l: Y+ D- f- O3 N当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。4 A: o' j3 T# @2 f1 M- Q

/ S2 ]  h7 S0 RDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。2 ]9 g, G6 m* d- h

0 H0 i7 d0 T' j0 L( f2 T: H% |1 a确定特性可用性
9 Z5 y8 e* L' [7 ~& J
/ w% L% g! d0 gDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。# r& }0 _, ]% H. B. A1 L. r. j
6 ?- ~# {; z& M- U3 W1 n
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。2 W5 K. V; \" N/ u
3 e: K/ A( {3 t6 U. ]) s3 v9 x" Z/ {
import javax.xml.parsers.DocumentBuilderFactory;1 p, c- `# Y+ S, j
  G1 q8 g4 U' e
import javax.xml.parsers.DocumentBuilder;7 M% x, f( L' [* p8 w
( ~9 K& _; }# P- r- T  g/ ~
import org.w3c.dom.DOMImplementation;# T% z# B- c. k  O/ N- `3 A

7 W9 \& h  P* A( l. |7 b! c8 Y( ppublic class ShowDomImpl {
# x7 ?! i8 W$ Z$ D* x0 p9 u" k3 r; o6 ?- N8 t" F! R& @
public static void main (String args[]) {
+ W& b/ |8 O( d" U9 i6 v) z9 y9 r# {$ p" i6 Y5 T0 V$ O
try {% O9 L) t9 z! \$ Y+ }" l

; u  P, A3 r' {; m) w- v3 U) NDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
" E& N  v5 L: ?7 O
8 o" [+ m+ ?& n1 UDocumentBuilder docb = dbf.newDocumentBuilder();
; b9 N" d% B! @$ I- g
  F, v/ c% F( b* }# x8 TDOMImplementation domImpl = docb.getDOMImplementation();
* p6 x: j' z2 I( W" B. }. l1 V5 G  V3 g1 h( U8 k/ C
if (domImpl.hasFeature("StyleSheets", "2.0")) {4 f1 h4 T9 ?0 ]/ v

% Q# u$ L" W2 E0 \& ]System.out.println("Style Sheets are supported.");& c) |, `+ f( W
3 o1 N) Z3 A  n2 _+ v: M4 v+ H
} else {
  A% u% v. n6 T& ~) h: @% }0 e$ `
$ t* L9 e3 K% V9 USystem.out.println("Style Sheets are not supported.");2 W1 P- i: Y& ?
- v  q+ _1 \8 }7 |- I$ [, ]+ s5 v
}
$ L& r& M9 l. {3 g) s' B) h4 e1 c$ U' D# h+ b- D+ K
} catch (Exception e) {}; E$ z" U3 J* {: A; j1 D

8 b) f( Z; X! Q9 Z}
. k* A9 a$ w* z. V! u2 D) \- l! q$ y
8 f" N4 a& @- E5 k- O9 N! J}
* r" m3 M* l! m: \1 h
1 n/ r7 L% C! f/ ]# D& b1 ^) f(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)2 ^6 k/ ~$ K# g6 m- G
: F! q" f, V8 B' o
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
; }& b7 n" z/ z! J) X
! D( @) F- B0 ~; w基本的 XML 文件9 x* u* g3 r' o$ X) B- d
9 c" t/ q/ @$ G# B
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
. q7 ?0 E; V, @% E. V* {0 z: |$ D) S0 W
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
5 l; \+ _" S9 n1 Q) {6 h' d. c9 J5 B( J# y1 N! f; g. V1 {/ r# s
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
0 X% s1 k2 ^0 G. C4 U0 Q9 G1 n! P( t6 K2 F* M2 ^% c$ M
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。/ P1 G( ~/ O, m& g( l

; t  U' H) a' t& o<?xml version="1.0" encoding="UTF-8"?>
  D  Q  [9 V, S: P8 E4 ^; l
& j8 i6 w8 y. h0 F! U<!DOCTYPE ORDERS SYSTEM "orders.dtd">
2 N! ]! z. O" r6 n. K& U3 W& h6 q  b, I: ?4 g! u  R
<orders>
( R9 Z2 H; e' U0 [- x7 j, |- r3 h! Z8 u
   <order>( Q- ~. W* I- u3 i8 d# ~) r4 _/ w
; e( Z5 z6 U7 ?/ A7 K( x% ~) M
       <customerid limit="1000">12341</customerid>6 v  c' S% S9 v2 D

1 G/ u0 ^2 N0 B* W; ~2 ]       <status>pending</status>5 f0 D) p0 N  j) Z: ~' H) R' n5 c
! R8 R$ V5 V1 I( f) e
       <item instock="Y" itemid="SA15">6 v2 p8 C8 D/ m3 m

' `& U% g2 U1 I5 s; B: \* A          <name>Silver Show Saddle, 16 inch</name>  f# {( u1 `" y1 f' y+ M( ^; B$ U

; D8 o) V/ M/ U' w1 V          <price>825.00</price>
! z1 `& H" j0 E0 b6 P0 A( C+ |5 ]) _- T% b% b3 u) [5 q
          <qty>1</qty>
& I# a2 C* d5 {" h. \3 N! @
) I. {$ C% J# G/ [# a       </item>9 V( u8 s2 C- O6 k
! w& ~7 ?" W8 |. ]0 p5 A
       <item instock="N" itemid="C49">7 H! z/ H* _3 v- p
9 R- [7 _' y7 F8 w* N
         <name>;Premium Cinch</name>
# e1 o2 ?3 B7 t1 ?- Q
' \0 R9 }- }: K         <price>49.00</price>! b( B- ]9 d0 A4 B* h. W! Y
% i* \9 u. z1 Z- v; z9 u; z
         <qty>1</qty>2 ^, I9 o& Q: v5 x& d
3 Y+ M+ ~& _# R0 h
       </item>0 E( D( n! d3 O& A; w0 k

0 c$ y  J8 D0 G# z" O; A8 f+ P  </order>4 J6 x( G4 A% P/ {
0 H4 X- x" |& m5 v
<order>% p$ H% ~2 {5 s$ X4 f. j

! j# Z; Q) v& @0 z' \( b   <customerid limit="150">251222</customerid>- k/ ]  I1 [+ J& |. O  A
2 l# b$ c: e! h$ _% ^
   <status>pending</status>
4 ]. C* R1 v. b( E" k! z7 F- [' D6 y4 J" k5 g3 Z
   <item instock="Y" itemid="WB78">
8 ?4 r* w2 p8 o' b  K, p) @: j, ]/ U$ a, B. }
     <name>Winter Blanket (78 inch)</name>
; k5 {# v8 k  Y5 c: v. ?
# Z" ^* L' D' K0 _     <price>20</price>
( D8 P: B0 d5 m6 R
- K% g+ v* z; V( G  A     <qty>10</qty>' d+ O) `. g+ R( }! ^2 V6 f& d' H

& m; h( t5 ]" u. ~# N   </item>  y; q) v5 A' H5 P

. Y) }! |% D; l3 c/ M1 h1 p( b</order>" P( ?! Z1 ]6 j& D$ n' v
$ ^! Z6 D; T$ b5 s- E
</orders>
1 I2 Q, y% e: x2 T% l" O" s在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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