  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
) j2 b% Z, ]6 W3 j开放分类: 互连网、网页制作、web技术
' c1 Q( H2 F$ | Q. X4 J, P/ {DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
8 j# i; F% W7 s1 X- x! O: o9 R" |; D5 V' D! \4 @- d0 P2 X
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
0 _( f' |2 T% X' ]! O+ W3 g2 ]3 b2 S: H% S, B- m7 u0 N# I
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
$ {- t. X( \% i! B: c' q2 bSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
% u: `( J6 e. n
. I$ u' D! y% a- n1 R7 W" j另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
* S# o7 `0 F2 a3 d; `. y( g
\! X+ ?- g) u0 G8 F: F# d解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
9 D `1 D+ [" `1 ~/ `$ D
1 \1 q" a; g, w! m! x8 \1 N% e) B作为 API 的 DOM
* p) d2 t! R9 D7 y# Q$ E; F
8 t1 W: p4 o6 L$ k3 n从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。2 t7 B2 `, r7 V
" D/ C8 R& t* s1 P( n8 v
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
/ w5 c9 @4 t6 r" o: H q3 ?8 Y2 m, [$ G/ J
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
% S1 M' [5 m4 d$ G9 b& t) }) m9 h4 d" q( T( ]7 ?
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
5 P$ }! K: H1 z; U, O& Q( A7 D! R$ x& a' h+ ~6 N. U
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
3 U2 l6 Q8 @" y$ \& l6 q" t1 @4 B2 B# U8 H9 L/ l
确定特性可用性* L& f0 _' i. q. T. B2 i
- Q' L, y$ w: i, g- |% L, TDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。; X+ ?6 O1 C% Y% v
$ `) \! f0 r* \DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。0 z) u1 j# s8 B ~! }& }8 \' `
0 G0 `+ ~. r9 `4 {2 M0 [" B0 G1 {import javax.xml.parsers.DocumentBuilderFactory;
# }- t2 `, u1 Q A. ], R
2 f# y6 d. O* T+ _import javax.xml.parsers.DocumentBuilder;
* T9 N: ?5 W& W* @/ o0 g" ^
8 {% a% H5 a. C6 B/ vimport org.w3c.dom.DOMImplementation;
) `7 i0 i. p+ s7 p/ J
. ~( S+ i6 i3 y: d) K7 w! gpublic class ShowDomImpl {
8 V8 e+ @: q* r3 y2 c, k6 A% x& G' e2 Y+ g% q
public static void main (String args[]) { r4 d/ M7 o9 I0 D( k
+ l; s a% J6 ]% Ttry {3 H& p, o- p3 f4 s
( Z P+ v$ ~ ?+ }2 S, ?% HDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();/ d4 b4 t* d1 y* }5 o7 a) @
( T2 J, X+ i, c8 U2 m
DocumentBuilder docb = dbf.newDocumentBuilder();1 @& h% y; I$ C- M3 n
2 _ l: x0 s* X9 l4 O: Q6 |
DOMImplementation domImpl = docb.getDOMImplementation();% B( C: ?2 K/ T+ e- b
z' A8 T0 @$ eif (domImpl.hasFeature("StyleSheets", "2.0")) { Z6 y; S! {9 X! l- w
. n6 r' y' U' I/ o: _System.out.println("Style Sheets are supported.");
5 H" u6 Z1 [% J" `) N* k* x3 N, k, G' a6 o4 r9 K
} else {
( |; O" V4 e7 H! V% z" n
: Z, I8 f% {# N; \/ o, U- dSystem.out.println("Style Sheets are not supported.");
1 v" P$ X7 P, k" t; M5 X+ t1 k
! W1 n$ |8 `! f( j4 p}
1 j2 D* B4 h3 V. V7 Y
3 R- V8 \; ~) e/ X% P} catch (Exception e) {}; z9 W/ [! H4 M# d& `% u
4 V; H- V8 n" I% \4 N4 ]( u
}( l4 l; _! q% V2 @( z+ ~% F
( z4 R: o7 w6 ~
}
7 \9 D7 x8 h* w# P4 x" C |4 P) b# }" s" y
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
4 e# q( p. J" x/ Z& n
! M I! m- \* F. [本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
* }# ]1 d6 ?# P8 ~ Z j% _0 a9 ?. ?! b/ y: f* y1 t, \
基本的 XML 文件
! o2 ]8 b3 a5 ]5 _$ H; s0 ]) M, @& M# ^; Z
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
$ S" ]3 G9 k/ v+ ^- Q
; \ C9 M- F$ Q% Q4 i( fXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。* K7 `- a/ w$ X' A8 l) _/ N! v
, \! W9 w. x6 r2 X1 Y2 R: u8 p
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
' a2 w! n v( E2 }
+ t# D+ r/ T# H3 }/ l7 w) w数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。) v" M' b; }; j
* S, Q g7 r# A5 V* b
<?xml version="1.0" encoding="UTF-8"?>$ r( ^* H6 b6 [4 f) X! z$ m8 X
6 F$ j8 N* Q7 W/ k<!DOCTYPE ORDERS SYSTEM "orders.dtd">& [! m3 q' {: Y( y8 G& M9 t c/ |
0 p- J0 q9 [1 p<orders>
- E6 E8 c2 q# p5 G4 I F( w7 H: x% u) |7 p) M& z3 `
<order>8 P. X+ m' X2 Q. }( Q4 O5 i
# I2 |% X5 J5 e
<customerid limit="1000">12341</customerid>/ C# l0 e4 C- R$ z @, }
3 O9 e+ F' c/ l* \8 a
<status>pending</status>
' x; M8 M5 ?( }/ N* [. A, z4 V5 _3 J8 o0 F6 i8 [9 g% _/ D! o
<item instock="Y" itemid="SA15">
6 T$ p6 [ q9 n g1 ^6 G7 X" j2 W7 g+ @! M: \
<name>Silver Show Saddle, 16 inch</name>& C( _# m E2 \+ K9 A4 _
9 g* {, \1 G5 Z9 h <price>825.00</price>4 t7 O. A: D; s9 t& ~* V0 _
. {* s% t8 i0 ]" x: S7 d7 N <qty>1</qty>* y w% m' v9 p1 ^
, q: y) u% i8 D# \% U. P! o. a
</item>
4 ^1 u- ~: ?' |% |# p: x1 O! \) z8 o- E/ ?) o3 x1 b
<item instock="N" itemid="C49">
T/ r2 R7 F8 F% v9 I5 q6 {! Q1 u5 V2 O9 a8 i
<name>;Premium Cinch</name>
) u+ W" D, j( s* c: a, y1 ]3 v1 ^1 S9 _% G6 | Z
<price>49.00</price>7 e9 {8 \, u+ G* N
% X4 V$ ?7 [7 t* t& x) _% c1 j
<qty>1</qty>( Q/ {- v7 I$ N) q) F l
% h. @+ K! h$ H5 j" d
</item>
0 Q4 x% J$ S" O7 n& c2 {/ a
3 `0 @! S, V3 z9 h& K( Y </order>
4 J# [+ y) n! A3 B3 T( R1 z: v% ^: b9 c0 V7 v
<order>$ b) |1 G7 p g+ N F1 k# x9 i
! c, A! h8 r: L) v, b2 [' ?5 ?
<customerid limit="150">251222</customerid>
- X( ^4 k% ] r6 O' L8 F" ^/ _& J
' ~" I2 [+ ~$ `5 a' ^0 d <status>pending</status>
0 w8 |) b- x% v* d0 T) B0 p( x8 Q* \ D# E# e
<item instock="Y" itemid="WB78">* z4 V6 N0 @. C6 b$ L# r7 P9 p
2 D& b% O: N* ?
<name>Winter Blanket (78 inch)</name>% v+ W5 U/ O, e
) [& T+ |9 }1 _ B' Q: C
<price>20</price>
0 c. I# y' C9 Q$ H; M; A$ O
. a2 R' { g% e <qty>10</qty>; B6 M7 _, z0 Q
8 |3 ?7 q% k- ?3 A. d7 ]# L </item># W1 u4 _- Y7 k+ @! P
5 L. ]! A. c; G8 G7 [</order>+ F5 U/ ~' x+ k2 F% e4 L J9 r
) ` G2 u. i( C! A! p, s
</orders>
8 c* ]# ^/ \& T# ]在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|