|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
1 j; W4 D* [9 e) v5 q% V! f
开放分类: 互连网、网页制作、web技术$ R' T' m1 B* H% g
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。& X r, {" l+ {+ R6 ^' T; l" A* a
& l3 ^4 O0 M0 b2 U5 y1 U. x9 ZDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
- z# y( b" i0 G) d; H! l* g
6 V. _: A, X. j9 f" X对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。0 X( _6 _8 [9 O6 y/ r k/ u
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
% w9 p+ o- M1 x# T5 h1 O& r9 j2 v M* ^, J/ C) w
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段& g% n! d* F; V
: i' Y, U' w' X解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。4 i: ` V% l) J
1 ~) a! `8 u: B
作为 API 的 DOM
8 c W' B; Z5 q: w. r3 o
7 R$ g( k& ~) G; e% D' J1 H从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
/ W+ Y2 R% }9 y7 I/ ^* l6 p& A& p& o. c9 j* _! f( a
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
+ M$ s C* v( l% F1 w2 X. h$ _1 H
( |9 k4 _7 x7 G3 l' F1 SDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。$ X$ P2 x8 D! w, R' i* l
, D5 r1 i8 F1 | \; i
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。& F [7 P/ J/ @5 ]
) b s6 P0 c% N' L3 t
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。# L9 h& R& ^( L3 l
O( Y0 N% |# B
确定特性可用性; t; O# |; \% Q
! p5 Y q7 m" s$ j3 h
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
5 d4 _: A7 L+ B1 E. n: A( ` b+ N3 P6 n5 b$ F. i
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
7 w& X8 T3 O! g! e6 C% @
* o- p9 }' b7 Y! A3 j/ P/ |! Gimport javax.xml.parsers.DocumentBuilderFactory;0 q' `% T; w0 z5 d$ p
3 ^2 W) r6 g9 `; v
import javax.xml.parsers.DocumentBuilder;
+ r0 j2 Q+ a- |, c, a8 Y. @
2 h6 o ~8 ?; T1 L/ p* Eimport org.w3c.dom.DOMImplementation;; L# X: n6 r8 W* ~! c
b; `+ _- z. M3 ]% }
public class ShowDomImpl {
: Z- N w+ E7 ^# h7 H7 _% r% W2 m9 ~; a4 l8 i
public static void main (String args[]) {7 l3 w9 V5 P0 }4 b. t1 T: L
3 x" K8 ^ ?: A0 {- O% ?: |try {
* K4 H0 R% s2 E8 @" C$ G
9 g$ J: n: d) @ X9 YDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();7 A% c' s- m8 B% J) ?/ E
! M+ x0 R1 @6 e/ k% H8 z
DocumentBuilder docb = dbf.newDocumentBuilder();
+ G) U# |5 r( j! r
$ c$ w! |* O" b5 G$ ]4 h' |- rDOMImplementation domImpl = docb.getDOMImplementation();' H5 _/ h# H0 M* Q1 E+ [: B
8 i7 r+ E$ Z& e" I7 L5 V
if (domImpl.hasFeature("StyleSheets", "2.0")) {- n" \8 K w7 u# G9 N
! Y* p1 t! Q3 H3 S( {
System.out.println("Style Sheets are supported.");
% m6 V* V B Z- R+ u7 C: o1 }3 J% V' ?9 _5 F+ L: m; {
} else {
% X; f! _5 t7 ~" p
& S6 N! G+ Q3 `: p6 D2 t* qSystem.out.println("Style Sheets are not supported.");" C. V1 S( I" a0 Z, u; e6 W/ m
4 y6 `& Y" B1 y2 l( h}/ i$ S5 N; [2 M: V, q
6 y7 X+ f! F" |) `" I8 p6 n
} catch (Exception e) {}
2 b7 H" {8 P) c" W
" @) ^6 B/ I, I4 m% K}
! @* T% t& l& P& e7 o3 W
) a j1 @7 D7 F3 V s5 u, p}' b7 a" O7 j& z& [- V
! y" D6 m7 J( v! N2 K/ k+ x2 B(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
, m/ i0 a* u/ b: z% _; I8 x$ E/ J, N9 d
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
3 M3 Q H% a5 r! C% s. Z5 l" j
; U) Q3 q0 A, ^1 @, T! x4 L基本的 XML 文件
s! w- |9 u$ b
6 L& _& ^( F3 v* B1 y' } A! x本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:8 P, I% F+ a6 E1 J4 t: Z
# m0 }) G: p" i1 w- w. _, tXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。: T- J2 M8 c9 _- T; \
8 X% e7 I" j( R1 z9 k9 |! ~/ _
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。( {3 t5 P8 r0 B2 v+ n
; \+ b7 s0 \, Q8 U数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。; H+ W0 a) z) o. ^5 X
, o8 V( O. Q/ o; Z1 y6 a
<?xml version="1.0" encoding="UTF-8"?>
3 y, d8 y; t$ D* h' A0 n: [ u
2 Q- V1 f+ B4 ?" F<!DOCTYPE ORDERS SYSTEM "orders.dtd">) P& }7 x! O S& d# g( j6 e
" _3 N' E* v5 q1 h" F" |<orders>
7 I4 @) j5 g$ L7 U" t4 Y' [, ^+ v( D$ S- E, \7 T* p
<order>+ |' {* o9 K2 A1 B3 U1 d* h, r
. w5 _( t7 {6 I <customerid limit="1000">12341</customerid>2 w! `2 Q( Z; R$ z r
2 r6 }7 e8 c) \$ U5 C5 h
<status>pending</status>0 |' I9 q) d. E; r* w
/ [6 k7 _ k7 Q* \% S5 _ <item instock="Y" itemid="SA15">
1 G! |+ E- v3 ?: y8 \6 G& w0 ?, y
<name>Silver Show Saddle, 16 inch</name>3 {- r& @! m; z% m5 c
; D! E7 n; F! V+ Y <price>825.00</price>
5 @7 Y$ T0 w5 k& d% j8 S" C) v
9 L2 G9 o# q2 d <qty>1</qty>
7 m4 [8 X4 t9 Y S
& H& W2 ?5 S3 _. ^& z% F </item>$ H/ C4 l9 T. a2 f
$ c/ ? t/ k' _$ z: m/ \- D$ N1 y <item instock="N" itemid="C49">2 F" i+ C" Y% }- v4 s! D( H
, o, X. J1 y% }- E0 }( |9 |
<name>;Premium Cinch</name>4 F% t/ z1 _. Z* B2 ~( w" x) Y, l
) i; o' J3 m9 _
<price>49.00</price>
5 _6 X0 m& G I4 i. o( ?" s
2 {6 n- @8 \( E) q+ G: V <qty>1</qty>
9 }+ D8 o; f; z1 y& G7 a' }) o* O" R" V3 v6 U0 v
</item>3 p* u6 F3 G2 m4 ]2 H8 d1 h
7 o+ Y6 \- Q- U$ e9 j& K2 t0 G </order>3 b- \5 U5 a- `* \. T
2 t9 S }% f/ w7 c( G* B+ w1 t! K<order>4 z2 M5 n6 x M& W+ |
) ~) s) P1 ~8 x' N; |9 B. q
<customerid limit="150">251222</customerid>
- i6 n7 W% N6 P% j
- m: Z& z) ]7 C7 } <status>pending</status>
3 d! P, R m0 T8 z+ M
2 V- U8 W3 G+ ~1 Z( M, ?# a8 A <item instock="Y" itemid="WB78">
2 [5 G3 Z( K: D4 R+ k4 u# F- Y* |$ O; {2 _! f- H4 i" w" q d- D# S
<name>Winter Blanket (78 inch)</name>
( @2 ^- j8 @/ b* x0 y& V6 v) D7 L3 @; |8 P0 q1 k( y
<price>20</price>
! T# d) X0 t3 [
* z8 @2 ]6 n; c# v- d' ] <qty>10</qty>9 }6 k. @) d c# R8 g$ m
! [1 X3 \0 z7 b0 E' n0 n2 o* A! q </item>
5 |2 h9 O8 ?6 d7 F2 }: u A7 h: C6 Y3 A0 M8 i$ Y% k1 I
</order>% h% i7 L% o2 u0 u# V1 l
. M0 ], V; q; x4 h</orders>( P7 ~7 T6 L& m0 K* s- L* I
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|