|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
3 a# i4 s+ `* S0 |: f: R
开放分类: 互连网、网页制作、web技术
9 ~' _. V1 |. @5 V7 J, i8 j- fDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
' q; @, D% r; u C" q7 s/ h4 Q. H+ f1 J' _
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
% A# I. O; d) Q, W+ i# i, j, U0 I5 n+ u
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
& ?, W* D( U% Q3 Q& }2 oSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。2 j* A. O9 f8 V( T) @+ p* Y* K
z1 \: D H$ }) \! I" r( O9 q
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
. {& I0 ~! j+ |) o8 K5 _- f; e1 ?, z( x" x
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
' e7 T5 A. E$ T8 t$ N0 L3 w; w4 x0 {
" I( n( c+ I' }2 `, D3 F作为 API 的 DOM& H5 {7 H a0 L6 x. }
! e0 f( V5 n& A B; w2 x从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。& R- k u! J o
! R& l% `8 w4 k wLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。" ?/ p( h. t; f( v
5 y& h& \' ~: ~ R
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
. ^1 w' k1 A3 `- |: y5 K$ r# @6 U; c, x; q% C
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。# `# X) o2 X- k/ x
2 y7 p) Q# f1 W6 wDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
5 c6 i3 a; j/ W5 m! m& g
6 z! u' Q% R+ [6 T ]4 @5 p Y. n确定特性可用性
" Y+ [& z1 d8 Y% _
8 v& O, H( E( L# H7 w( O& \DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。7 K+ f( b$ u, G8 I4 }5 |
( A9 C2 K' q) j) r5 \) @, \
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。: o# ~3 U/ Z8 E3 y
% c- t% z4 H/ l7 |5 [import javax.xml.parsers.DocumentBuilderFactory;7 D8 M9 B4 G& X! C2 t: H% a
' E# W. c/ D( \* E9 X6 F/ {import javax.xml.parsers.DocumentBuilder;
R# j4 h5 t! Y6 Z
" t& P' g$ L7 U3 R! Eimport org.w3c.dom.DOMImplementation;& w, E. r# }/ V6 d1 j
1 O3 I$ C8 o3 V4 Zpublic class ShowDomImpl {
: n2 U p$ `+ X- S- S7 f$ J' @ J2 ` z* I
public static void main (String args[]) {+ D9 r( m6 _+ U- Y( ?
" D6 `7 {: L( m' |( stry {
4 f* ^# B [. A, j6 K0 r6 z5 q$ X) x6 p8 m0 J! `9 C3 @
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();/ o! j$ x0 M3 j! g, w
; \4 b( f- d1 O- CDocumentBuilder docb = dbf.newDocumentBuilder();) \5 ` t5 a( `( j& U6 N3 g8 v
: |0 {# `3 X1 S/ C
DOMImplementation domImpl = docb.getDOMImplementation(); e( w7 E8 i0 T! q
: h( s% V. a4 v- C1 O* o
if (domImpl.hasFeature("StyleSheets", "2.0")) {( p; [' F% e5 Z
; t, M, U) u8 D% c5 O2 J4 }
System.out.println("Style Sheets are supported.");
; \$ G. D Q5 f& e% r! j9 L' ]* o/ C2 x
} else {
9 {. ^; Z+ o$ ]+ C {. @+ t2 M3 t6 Z ~' r7 @* J- `
System.out.println("Style Sheets are not supported.");
+ u l. ]" q- P- l' K' |. _; Z( X$ Z6 [7 p. P
}% z. k) t& [% X4 Q, o4 p
/ v7 @! f. n- w! r$ i* E
} catch (Exception e) {}5 p, P3 z0 V ]$ r2 W/ W0 d* l
$ `( P! W# M2 _, S7 M, z}
% ]2 M' ~4 y, K( ^, n' S9 O w7 \' u6 j/ }
}
+ c4 J" l- `' A8 ~
, I- ~1 e f+ j& }& f7 M7 A(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
0 \7 D Z9 Y. |0 h
3 M1 o2 M" V: e本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。) w6 f6 w3 w: X* p# R3 |! \8 v
+ |/ s, i5 B' u: l/ l. \$ M- J
基本的 XML 文件
1 ?$ u/ G1 [2 U$ \0 h6 ]7 s3 ?& n/ ^( P/ f. J% Q, r, J
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
6 W2 g% Q: p+ ]3 e6 T, U
8 N" Q9 S8 ~2 l0 L. c+ yXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
; u X" A, I$ j8 _
8 u: x6 q' w, O( ]+ R) d' p eDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。# t' g1 ?' w) t
& p& Q, B+ \) ~' |& G% ^
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
& ]0 `4 N' T9 m/ B }5 F2 r$ w5 U7 }7 x
<?xml version="1.0" encoding="UTF-8"?>
- a% Q5 |% B+ u3 A: a* \6 \6 @" u/ F' O# X
<!DOCTYPE ORDERS SYSTEM "orders.dtd"># C3 r2 N* O. ]; c
! a8 C" M5 q& d D! ?
<orders>& }% y7 R, s0 r$ Y0 a9 H) J3 B, s
( [# ?3 f& m% M3 w! R
<order>
2 S; w! r1 f; V3 A6 n, o1 L; ]) v) L
<customerid limit="1000">12341</customerid>
% }1 k5 c0 C+ d) k! E) _' e0 C0 R3 P" m6 v
<status>pending</status>
# K v) m2 r4 }9 Q1 w5 O0 x7 e3 d
<item instock="Y" itemid="SA15">
" u) D2 w1 }# U5 A8 \: y7 f& X3 T2 ]2 n$ i; k: N( W
<name>Silver Show Saddle, 16 inch</name>; T' h I9 K! k9 k9 D
% D, z D9 x; G6 Q8 ]6 E <price>825.00</price>2 ~9 S2 ?* P" ]/ t5 a! z, J m
8 Z6 {9 ~) h/ g1 a
<qty>1</qty>
- R7 J9 ?4 r5 _6 n) F% R2 s; N0 G& O- G+ e1 c1 ^
</item>3 O+ v% p+ R& K: n1 X* }" v
4 [' s; q" u& i0 F. p
<item instock="N" itemid="C49">
0 j3 ]3 K+ A7 T7 D" ?2 u: ^ n7 F- B& O
<name>;Premium Cinch</name>$ @8 s$ Q- {) d2 r: c9 c' j
1 D' r1 Q: n) r6 a Z <price>49.00</price>
9 a- Q1 E, d0 Y' F4 H) g+ Z3 W$ o3 U5 n' F" @& q; v: Q+ Z8 T
<qty>1</qty>
* F& G& \0 p6 z6 Z5 G9 k9 h8 T. J6 S$ }/ {3 i2 N5 t$ M# T
</item>8 u r, v3 X- ^% g
: j$ g4 v9 g' ]5 N$ I9 X" q2 N6 {5 g </order>5 {" V) m8 Z0 Z4 P
1 C5 p6 i3 Q# s* d* s# t; f7 D
<order>
5 K0 y0 T# w8 a! N$ M/ S- e. `, w) L/ s3 e# a
<customerid limit="150">251222</customerid>4 q; W2 v- p- }
" _/ |$ T3 H+ ^1 v! z" J: U <status>pending</status>
, m% G. v& y, ~. R W
0 Z1 a/ R4 K9 H! j6 O; X3 P' ` <item instock="Y" itemid="WB78">1 y1 u1 O) y6 c$ p" t* T
+ N4 v' J% o! y, W4 [ <name>Winter Blanket (78 inch)</name>, g1 \' P! a& w( W
! T/ X4 m0 `5 A <price>20</price>
' ~1 |) D( _ P4 x3 w. v- U+ _( r& I( w4 B/ C$ Y* s& o N# l
<qty>10</qty>
* m8 S; i J, o+ C7 j
* X6 v3 G9 ^* s5 w- W: Q+ e# Y7 H l+ h7 M# H </item>* x |( b, @) N! s& i- `
; v8 @4 d2 _/ `4 T* w4 M</order>
3 o, A' ~) p# H7 m) ]
4 k( G( M* M0 }5 L ^' W- j</orders>
* L7 M7 _( ?* }; A5 t N% X在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|