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

DOM的一些概念

3 G6 q0 f$ F  H6 a
开放分类: 互连网、网页制作、web技术8 Y$ y% Y* }9 {* ?& Y+ v
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。( e& w7 j3 U& n" O1 @" t5 ^

' f2 q+ f7 k/ x1 f, I) J9 F& V# t  QDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。' A( y1 ^9 d$ _4 ~, p  N

4 L" N7 ^, v7 t" ?0 t+ E- O- D对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
% ?; `0 {0 G% E, p" L' `SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
7 l5 {) {' Q9 F$ }7 S0 [  S0 |# k+ p, M9 O, c( |
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段- M8 D- [  ]2 C* j) f* M# O
( m5 a6 I0 c" e8 g+ S
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
, _/ g. c- f3 J3 n( ]! M6 O8 P9 {" ^0 p2 i; u  m! j1 P5 r6 A* X# k
作为 API 的 DOM+ h, B$ X7 }5 |$ E& K! l, `
6 ~9 [- B) R8 z3 |1 C- q
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
' q: Z, T& c3 |7 K  G; N/ x
# a7 g$ f% q$ LLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。  ?; l; k0 Q# [6 o$ _, \; S0 I" l
  H) L* C6 d9 K
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
* n* \# O, D- o" K9 i5 A7 z: c2 ^8 {! Y1 g, P' Y0 p, ]+ ]
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。' F8 W2 D# J, k/ c$ K4 z* i

* I4 c( c- X* w' i7 ]DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。% o. g5 p/ R% D7 d: L0 q) n# ^
. ^- K8 v+ G: ~+ T
确定特性可用性
  Z: _: d3 h, Q5 c' O
1 X" Q4 w% s+ S; JDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
- ^+ O7 \# u1 e* k$ [2 @6 \+ X  Y# P2 p; ]5 O& f7 t* i
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。" U& R3 I8 l* w
; z& [" S. S. R' c( F0 `
import javax.xml.parsers.DocumentBuilderFactory;
2 z- n0 y/ l0 R: A- S( r- g6 ^
9 \# c: [' O5 y1 zimport javax.xml.parsers.DocumentBuilder;
. `& }! g; m3 K6 V+ r9 |1 t! o, l2 M3 ^. A" {8 F) k, @2 u
import org.w3c.dom.DOMImplementation;( ^8 R' u3 s* v: y& L

5 f! t1 m5 X$ `1 K! c8 g1 ypublic class ShowDomImpl {5 L! q+ Q. c$ i1 s

# V8 S" g3 C/ i1 h+ d& P- epublic static void main (String args[]) {$ W7 a. @' m1 \7 m" _$ ~) I( z

4 e/ A7 c6 R$ r  @: d) U! H- C; Z  Gtry {
; C6 {9 y7 `' i7 \. o- ~7 V& v
: R8 B# D/ k1 g. fDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
: d) e& g1 {' k  \) U0 j. b+ `9 O+ X3 f) d
DocumentBuilder docb = dbf.newDocumentBuilder();: I: p2 S+ b  d+ T/ d
; Q* [$ n# L- K
DOMImplementation domImpl = docb.getDOMImplementation();
, O, c  L2 `& [; k0 g) K9 d# P* N9 J5 m& P: h+ g
if (domImpl.hasFeature("StyleSheets", "2.0")) {2 Z- _% x/ Q7 ~  C- o
+ @, {4 O! ]3 Z& T
System.out.println("Style Sheets are supported.");/ Q, s, O  n4 |2 {" v2 W) p6 h
8 r& B  J7 `- K2 X! P
} else {5 i, N: v# F$ r3 G% v

  G4 K+ P8 \( k6 |4 U0 r2 iSystem.out.println("Style Sheets are not supported.");
9 Z+ X) X& m+ m4 j% u1 @, F8 {) [( G+ R, f$ k) h
}
; w& y( t; z5 S4 V4 Z: T3 f
  `/ H) [8 Q+ @} catch (Exception e) {}( j% V0 T" K0 v: t( M: \

3 x, U; V6 x4 A$ V3 t}
9 Q9 _* N# t5 h+ \- a3 O
# U% ^' {! B% b% u" J# E}  u5 O+ f9 s* a5 h; }: V

2 r8 o0 F7 ?/ W$ Z(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)3 e+ _8 t% l; D( L, J( E9 B5 s! b
" [5 _. L: H2 @0 z
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
5 c+ U: s- }1 j) Z- ]  K4 E3 g; |: l4 d& l$ F
基本的 XML 文件
7 V, q( d! Z, `. Z! V* \1 u& B, R  a. {( j# r) W' j' \7 n
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:; Z# w4 J6 G1 K: G- I3 e5 d1 C% V" R4 k
& I: g  z. x2 n$ U8 Z
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。) w( |8 [% p2 P5 A( H; T, X

( B: g$ W7 q3 o0 F$ T: U+ k1 n/ DDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
" V3 H" n; b* g) r% @  n; N( ~& b
( l6 i9 x: p( @$ T5 I数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。3 |) V% m( k8 ~. J$ W

/ M) `0 z' b- w8 c6 D- S<?xml version="1.0" encoding="UTF-8"?>
8 I1 S: k1 W) d1 T& C6 }, S' t4 N0 o% e# Q% E
<!DOCTYPE ORDERS SYSTEM "orders.dtd">" v/ ?- [/ R* U7 w7 @

* C- u9 ?# ~6 k+ P4 p4 |<orders>; h+ ?" g8 r0 l  q

* X* C# a0 G  f/ M   <order>
: s5 G: \7 I% n3 j) N& w: [$ O% z" ]3 B) @
       <customerid limit="1000">12341</customerid>  x  E& I1 z+ Y
! F& V3 B) f4 p' v* s' @
       <status>pending</status># K( a# S. v7 f4 \/ O
& }4 t: \9 g$ x" k" Y0 J( C8 o
       <item instock="Y" itemid="SA15">- V6 y5 P0 ~1 x+ b
3 m& U% p+ O6 U! O
          <name>Silver Show Saddle, 16 inch</name>
+ K$ c: F/ b3 n9 W, l; @' R+ i" s" F; l1 ~2 u- _+ b! ^
          <price>825.00</price>
/ f9 l, }0 M2 H( ^) I0 C
9 a9 [, B/ D( y          <qty>1</qty>
4 U. l: d( B- N. z$ W' Z1 C
& w8 x' U. k7 `( ]% F) ~       </item>
% B  @9 ~& x/ [# P6 f, f/ o1 e. S
. h3 E' E# z" v       <item instock="N" itemid="C49">
" w  K3 k. n/ s  Q7 S- |  U8 E4 D4 N8 D( v
         <name>;Premium Cinch</name>8 \0 d% ~+ ?& `! {0 }

; }' C6 _+ [$ x3 j         <price>49.00</price>) w7 w1 o' b/ [+ F) j' G
  _) G2 O# C* E( C1 c$ X& F
         <qty>1</qty>; k7 F' D  e6 ^: h

" f. l# O) V7 J       </item>
$ T$ ?6 Y! F! S' q7 H; u: H0 r! q' N1 J$ ?1 c) T
  </order>
& A: k) ?% E4 d" \# ?2 P) c7 Z$ Q8 h- a, w! h; Q' m
<order>" l5 e. D+ S% `1 q6 `* x+ @

+ _$ g9 Y0 w: X, V$ @   <customerid limit="150">251222</customerid>
$ U0 l/ L& I+ F+ f& \
, r+ m9 c* E/ Q6 r6 u3 T   <status>pending</status>
: u! g* M3 W" R
! j$ g0 o/ v9 K- W4 ~  u2 s   <item instock="Y" itemid="WB78">
1 q' j- i2 g+ b" B' [" ~: D6 e. H7 \% T
     <name>Winter Blanket (78 inch)</name>* j2 R6 W! V( S$ |1 a; T) V% O: Y) _# s

1 R$ O% h8 j& L$ \     <price>20</price>. k, x' f6 E$ y3 p
, J) j9 o8 {. ]2 A6 E
     <qty>10</qty>" H. q+ C: j7 k) b

+ u/ M' D! y) x( G   </item>
# [" S8 N0 Y1 c+ i1 s3 [: j2 h
5 Q2 n1 g3 z) ^0 G% c; u</order>
& [0 }7 i' y! }+ A
; `/ z. s/ i( c- r1 w7 t9 C$ P</orders>. l7 h) x$ e, C$ V# v5 ^" G
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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