返回列表 发帖

DOM的一些概念


0 m2 D5 t' s8 L+ U, }$ c! _) S0 B; @开放分类: 互连网、网页制作、web技术! Y. v( U! R5 u% P4 n
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。' G1 Q' ]& K0 g6 |, d
$ K* }4 E) ]; y6 c1 C* [  g
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。# p9 w* W: U8 a; }. I" ?* }7 F
7 ~8 I3 C; ^' l8 n
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。8 I6 Z# ]( W: h. g, M# F
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
6 i0 p. p+ \+ X/ M& K# S* [% e2 B1 ^& S0 M5 y3 |) L
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段) X" U( D, ~, [( T2 \, S
4 s, d9 l) g+ W! B" x: [* i
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
) [' u3 q; p9 N; ?: p
1 ]% x0 I) q2 I. M4 Y( _* Z% \作为 API 的 DOM% G" G8 g4 B* t3 B- o
* {- E1 Z6 |2 D- F
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
' Y5 m3 c5 ~  V8 h8 H5 ?6 ~+ G9 K1 `
2 P# _% O9 d( wLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。; j2 _1 P: D6 g1 E& ^
4 U& G" W2 ~2 h) A
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
, D+ e+ F/ o- H0 [7 I& c& H1 @4 X0 `" o3 @6 O
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。' k% A& h! T2 L' ?/ J

+ }3 Q0 P( {& i* O# qDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。1 r5 ?, |+ _+ w/ G0 K) q
$ z, x1 U1 e- m
确定特性可用性3 Z0 U0 h$ w. G1 [; j
0 Q5 Z8 u1 C, d8 j- V, B
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
1 g$ s! C% q/ `! _; ~0 }9 p" a2 r2 s% {8 k0 X. V7 T
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。6 \) _3 ~) m# n4 J+ Q  K
5 ?# c3 b& R% \- }, r2 l
import javax.xml.parsers.DocumentBuilderFactory;
- Z: J- [/ E5 V& u- J, j( A
9 F$ t+ r1 `8 K" ]import javax.xml.parsers.DocumentBuilder;
& K; Q" G3 H) P5 k" a* z
6 W' `. w. \) B% \/ M2 d" Timport org.w3c.dom.DOMImplementation;
( X0 \5 j# _: D6 ^# P9 Y; X5 M/ {$ j/ ^1 j: Z
public class ShowDomImpl {8 q* }5 f  Z7 ~: d5 v
) g+ m6 R4 u) A. g# h8 a! A% g
public static void main (String args[]) {- k' c+ s+ J" b% x# M5 K

/ G5 e; h2 P, N/ s+ G2 Ctry {( e! A  o" A2 |/ x# Z
1 W0 l% i" _1 s$ p
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1 Q- k9 {, d- L
# {% ?, ~3 ~7 p6 n  k: lDocumentBuilder docb = dbf.newDocumentBuilder();/ ~. r" ?& j3 }2 y: L
+ G& q" F! V' h: e
DOMImplementation domImpl = docb.getDOMImplementation();
" v0 a( @, B; a; \! k" y4 Z+ c) x& G6 v5 T& f$ ~
if (domImpl.hasFeature("StyleSheets", "2.0")) {
$ w' `+ R# S; V5 j- \% j
. C( Z4 I. {* d+ O4 o4 sSystem.out.println("Style Sheets are supported.");# k* o0 C# E! y1 C- d

; a, U; d4 B1 |$ B% v} else {
: k! a+ F  R; J2 j6 W& p  R6 z/ b4 R
System.out.println("Style Sheets are not supported.");/ n7 C8 E6 R* S7 h; y7 U% y

+ `6 {: I: U( e: V* ?, I/ M& y}
* W. \" j3 v4 {& A- d: u4 v
: e/ l! J2 Y* g, _} catch (Exception e) {}
/ D1 a$ m/ Z: d# t2 d% _# G2 o0 V" O  Z% M& t+ O9 l. @
}# L; H5 E, R. U; C
" Q: A  t: @3 J
}  n: j( O7 a6 \) i% v) z* q

1 J7 ^8 a- z! B% H(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
5 u( h: P) B! U/ c. V( [5 y2 g2 K% Q$ G: f
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。# J* a9 I" p) r! V6 }: }! m

$ l0 ^+ |# ]9 S* r7 v4 f" D基本的 XML 文件* K3 `5 d$ V  f

4 \: V6 D6 ~$ X3 x; B本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:# u. n; F* m3 q
$ Y) S. ]* E- n" ]3 B: n2 T7 u
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
* K2 t* j; F6 v
: [  n0 p% @: IDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。! A8 [2 l- f0 ]: Q7 s( R! ~4 r
  B9 J2 s! m8 n' t5 }% F
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
6 |1 U! \" ^& }$ \, T1 s. w: b! k7 c+ F, B5 K  ~1 S0 F) B6 G, ]
<?xml version="1.0" encoding="UTF-8"?>9 i3 ^  Z9 d1 x# J* o1 G* q

3 I" |/ P' [9 A) c/ n<!DOCTYPE ORDERS SYSTEM "orders.dtd">
6 i7 q; U3 a- l) [0 k( t  {/ J, V( E: `# ^# {
<orders>
  n& C* m  h2 q( L) B1 u* Q) v
' K# v- M7 \) d2 X3 f) ~2 S   <order>$ J$ e" S+ {. i2 M: _
- V2 O. |' B5 ]9 P2 G; r
       <customerid limit="1000">12341</customerid>
+ \9 {* o; \! ~7 A1 k
. r2 G+ L6 [3 E2 o8 s6 I  u% s* x       <status>pending</status>
+ Z$ ^% ^% q, x0 D+ |) M8 _. K! \% g2 `3 }! T
       <item instock="Y" itemid="SA15">0 B& B; U9 i: @' P
& a. f! _7 h) L3 P6 b
          <name>Silver Show Saddle, 16 inch</name># g0 S1 V! S5 r/ y

' r& }9 f  ?) J/ ~- z1 j3 k+ J          <price>825.00</price>4 m1 |6 O) p: A& v2 L& @* ?

8 {% w$ u  L% f3 |' a3 w          <qty>1</qty>* c) N3 N' M6 c& N" ?6 G5 d  M
8 M0 p% I4 S. B6 ]/ f
       </item>
) W! M2 K) j3 u& S8 X6 f$ ^8 |; |' y! S0 D1 P* p1 m
       <item instock="N" itemid="C49">
! S- ?3 L$ I" [, d' x- o: |/ W5 ^4 T: R  V: e
         <name>;Premium Cinch</name>; m  h: o$ V3 P; r; ~6 b
, H$ J/ m! Q1 H
         <price>49.00</price>% U/ s* {% Z# ?! ^2 z
( [0 V( P; R* W" ~
         <qty>1</qty>) r7 h9 o# }6 \( |$ P
9 X( d8 O- W1 Z, r5 Y
       </item>4 Z( _; ^; C7 n6 f) ^

& ?5 \  k+ u$ p! ~$ s+ s3 ?  </order>  l4 S$ D9 ?$ p+ O# Z+ B

. A$ {$ |; {* |" l- M1 }  s<order>
2 E9 U7 Y) p! J; _" K
/ x# w( b8 M! v3 D' v; L' J   <customerid limit="150">251222</customerid>: Y: ^, g+ X$ q: t0 z

' J& e8 @1 n, o3 Q4 U' i) c+ A+ p! w   <status>pending</status>
8 i: a: L5 M4 O; V& ]. N% d7 [8 d
8 n" o8 e& S/ @' y$ ?! k   <item instock="Y" itemid="WB78">, P+ e& N1 [6 c

4 D3 }* D! d7 v5 V     <name>Winter Blanket (78 inch)</name>
0 w7 a( y7 i5 {8 I9 b3 l  ~% _# e5 T* W* m9 \) @( U  i1 b
     <price>20</price>1 L3 r6 ?- K+ B

0 X2 N; B, o7 J* H: D2 e. j     <qty>10</qty>
% Y9 h: m& O6 {3 N+ R5 Z: K8 k  l+ V, V% c0 H7 ?( m8 p
   </item>4 ~' j+ b, E0 D9 R1 V: D3 Y

; D" }7 F9 C2 i* _, r' Q  k; q</order>
6 h. I# k8 r' Z& b3 g0 S! q# @7 w. w/ g0 Q5 n; ^, {; u' f
</orders>7 r9 Z* D* A3 k7 D, S" Z, v) R
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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