返回列表 发帖

DOM的一些概念


& H$ U% Q2 u' x) w4 }( E开放分类: 互连网、网页制作、web技术* J* X; m# D, M* D
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。5 H% f: l  q! N! j0 q+ H6 }2 ~2 J5 _! a

6 C, e% S1 }8 hDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
  @, R' P1 L* `/ L
. T% s# E9 r: v7 T0 s. E5 f; k$ P对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。4 c$ w6 }( E/ G2 {, N, w
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
6 Q' O  g3 s( N, E
- }( t: x4 e+ C+ A- ]+ V1 X另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
' t( r1 W) J, P  v# ?, B+ T
& F( S# Z$ G$ j( z解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。/ ~+ A0 V0 U/ A3 m6 e
5 r' `8 S6 c9 E# v; a9 J7 i, Z+ s
作为 API 的 DOM+ e( ?0 ^# _+ F* }" _: Y5 s4 N
9 W9 h, A* m# `% X0 I3 S
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。# Y# S3 _9 |1 w0 W0 d# i
4 n9 E+ t* n! ~$ M& c0 n1 Q
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
+ O4 d  U% ?/ D" a8 H6 L. [& V3 e. M) c# h9 b1 L
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
( y! V, B5 ~$ f# w: ?& p$ Y
% E( Z2 Q! U& u# x4 }0 q当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。* N0 m7 L1 T/ ?! |( R7 D

* k" r- ?" q# R# F- H$ NDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
2 j- n) ^( Y. }* M" p# u2 O/ M- D
确定特性可用性
1 {* y$ \; {! g# u5 `( r& |7 n/ }, @. g! x& d
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。! F& R9 T! V9 r& ]5 k

+ B2 R0 v" W5 J! uDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。7 ?; v4 u& v3 f5 L( T

, }1 T* j, B! W$ v9 _! rimport javax.xml.parsers.DocumentBuilderFactory;/ `. I' {) q/ C% D5 R# v5 ^

& ]( G+ W/ |, ]! {7 Ximport javax.xml.parsers.DocumentBuilder;
0 |9 H6 B" j* R9 f. s+ I: a* E( `7 b" b
import org.w3c.dom.DOMImplementation;
# e2 a$ b0 z0 Z. J5 \7 m8 K. z- b, L2 L; A! V
public class ShowDomImpl {
( a: x( f# T) h5 t" l
4 q- V( _% G* A. h, D" Spublic static void main (String args[]) {
6 o- f% F) ~5 \6 N6 ~- A7 M
5 ^% s3 [) {  o0 P1 xtry {2 ~0 C9 m# ^+ j2 d

0 ?$ W  J6 j) P" n% I5 u0 q% U9 |* ADocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();9 \7 v9 `2 F4 m7 }

1 Y# S8 U  C6 E+ m+ H2 R# N" DDocumentBuilder docb = dbf.newDocumentBuilder();
% R7 i# q7 g6 Y9 V/ N, d  a6 Q4 @) j5 G2 q
DOMImplementation domImpl = docb.getDOMImplementation();
/ l& p' n! Y" B0 \$ ]8 d" j2 C4 L7 I) ~
if (domImpl.hasFeature("StyleSheets", "2.0")) {7 w+ i% C8 m) d$ S
6 ~9 B7 T1 l$ b& D
System.out.println("Style Sheets are supported.");
7 {- R5 ^& _0 a7 u# _8 ^$ f/ ?9 a* ]4 P
} else {8 e% {' ~- z" ?. d" L% P& O; `9 W

0 x) c' T5 ~, g$ ?( G: OSystem.out.println("Style Sheets are not supported.");! C) i  S$ l3 ^$ |" G" [
6 E9 {" J/ X& j9 S7 H" o! h: B7 h
}
' }+ ~5 C2 }% f) P0 J2 u
2 e) m3 B* b( n; ~* {0 n} catch (Exception e) {}/ s/ @) l' Y7 v3 L# [) j9 f

8 f* n) h: n6 |/ J# N}/ t3 [8 \+ {4 z2 B! |7 a& Y

& ]* z" {: f+ G. O$ ?) @# i}4 M2 k3 o! f. J; J/ S$ K

! r0 H) e/ X1 ?0 ~% W(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)7 |* I# X7 k# E5 H' g; D  o; t4 k* V; I

. Y/ l5 r+ ~# L5 G  o7 q4 Q. m" N本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
( ~# v2 a$ z5 c2 ~  C) b1 a% F
' b. f; I# ]- g基本的 XML 文件
7 G2 d9 M9 F  n. d/ ?" L6 k5 b7 T( D  B; n
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:* b" A9 _. y: I
$ L7 E7 D% o1 }5 z9 p& |/ O0 [
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。) C: h3 L0 Q( @/ @1 U* D! @8 T

4 e) m! H3 U2 l% N; IDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。4 B. I  \( Y, U1 a% F
- w2 b( r2 P( z, n* f( C! ^2 O
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
5 N( R1 d, V5 ^0 H& N# t# b2 O8 _' q. E# c0 h% G9 V
<?xml version="1.0" encoding="UTF-8"?>
: Y/ D/ x2 T7 f. H8 M* X% Q7 H* Y" X5 C
<!DOCTYPE ORDERS SYSTEM "orders.dtd">' C4 `  v. F8 o& X& J
; |: @0 s- i0 x; D" E% _' W! h7 m
<orders>1 R8 y- p) c) z1 {) G1 J
! G$ I$ n+ c, l5 q. q+ b
   <order>
5 B; I1 K0 P& f4 r
% G0 W  ?2 T9 \  p; p- Y# Z' c       <customerid limit="1000">12341</customerid>; y: ]- l4 k) c

* O# k5 X% d: V' f. |0 f$ R       <status>pending</status>
8 [1 w' A1 w( W
" m& W& M, {6 K! e9 P       <item instock="Y" itemid="SA15">" D0 [+ ~6 x7 c* \3 P2 ^7 g) }

8 U6 ~+ O! M* I3 E          <name>Silver Show Saddle, 16 inch</name>
- x4 F/ R+ i  w6 O# {+ T1 u  ^; t
' y1 J4 k8 B+ ~# g/ P          <price>825.00</price>/ _- L$ S' x9 [! f

" V3 x1 w1 V3 o9 n( z3 x9 D. r          <qty>1</qty>  [2 R6 G0 |( j  U; M) `8 M

! Q+ e2 x. s4 B, D% N$ ^       </item>
; l2 `# V' ~/ {" W* K
$ C* H4 f, T2 p! p$ v8 u- c       <item instock="N" itemid="C49">. J9 m- D5 h+ U6 f. c/ O0 M
% w' G9 n7 O% n0 F% f1 s
         <name>;Premium Cinch</name>8 F  q' z+ v0 z( v3 Y) J; O7 m& V
6 w* m8 e& v- {3 ?
         <price>49.00</price>
3 p" v4 h, T1 i
" Q6 U6 D" i- T  U! q: b         <qty>1</qty>
$ l9 ?% I; ~6 s- q+ }' i$ l( d* Q, }& i- t2 Q# ~0 [0 v, ?* K
       </item>" V( i* r3 r2 |+ w( A5 j) [

+ G. K! y- G( a  w  </order>5 g% q5 T1 [$ c7 y

- ?8 `: }, r5 o1 h) m- \<order>1 P! F2 l- j; F4 a

1 \, b& e! b% H: A2 Y( y( _   <customerid limit="150">251222</customerid>( W0 Q4 B+ r; f5 I+ P% [$ r) t; }

4 n1 \0 ^& i1 c' a4 k" d% G! J0 ^   <status>pending</status>+ z, |1 P/ `2 L& s/ y& x8 u6 \
( c4 K. Z; f8 {6 X& S$ ?. h* J
   <item instock="Y" itemid="WB78">
+ a8 E: i% ]+ z- e  n* l6 F9 p, W: ]; I) y$ x, C- p
     <name>Winter Blanket (78 inch)</name>5 C0 G* n+ z1 ~  d6 U
4 `3 O9 n; z( M9 G
     <price>20</price>9 R( O7 k4 h: u3 m& I( N6 h0 h0 A

  U+ ?) F* E& B$ [+ F- W     <qty>10</qty>
9 H; l1 \6 s# d. O4 l6 _8 W3 N8 l* S: R
   </item>0 c: G5 s" ~4 l% `6 _
4 l% l9 T7 Q& }9 \9 t6 D/ h
</order>
( H2 }) E4 V  {7 s
$ ]5 \9 A/ T* P</orders>( F) v+ ^/ ?8 K
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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