|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
) {; }0 Q8 k9 R/ {1 _开放分类: 互连网、网页制作、web技术" m a7 {) T r) ~) t/ m4 k
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。0 D' E6 k. I1 `5 h
; z# B! Y3 O% @- X* NDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。, T+ A/ n' s5 i; Z# ?, z
' K: f& S7 G; }- e对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
' @. ]+ o# }- N; q5 y) W# USAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。: `6 H. V a. X0 a* x) N
) r& ^ A9 l3 _. V9 L: j* f; \另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段5 H5 B6 H; R6 X: W+ E
& ~4 l; p7 r: m0 F! H- A& z
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
8 g8 ]& S1 D$ N/ M8 F
8 T& i0 z/ d, u9 I8 r作为 API 的 DOM9 R5 H( ^$ t m8 g. K, t- G
9 ]% `+ i" i6 S: [
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。0 ^/ w& D M5 f* `6 X
5 L5 S8 P1 R& u
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
9 `# R, e: L: N, ^
" k! c) ~8 \/ T% TDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。$ V, ?5 B7 Z: \) N
. f/ \; c2 [0 d6 x
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。* B6 p4 d! T$ s' J
* |7 h" T0 w- ^! G% NDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
9 e. D; T( }9 T8 j
* c2 ]8 s; ?, u) R7 D. A确定特性可用性) _6 ^( i) c1 G& G& P
* p. c- P0 K- A( @
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
2 U2 b" _/ M7 V8 v I" @' V P
+ Z$ f, W* z3 S! Z' q" HDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
4 x- x6 |- T! K
; ~$ h N" P$ `% rimport javax.xml.parsers.DocumentBuilderFactory;- L( @" T7 ]& b' I$ E; o
2 |! u) F6 P' |; ~4 k& y
import javax.xml.parsers.DocumentBuilder;/ c3 l, d5 r1 K
/ S0 L; y2 W& |4 j' T3 k: m
import org.w3c.dom.DOMImplementation;
2 u# m9 T: o7 Z& J9 A
4 v: i- d" G* {8 X+ P8 t upublic class ShowDomImpl {5 W3 V" D) h* J+ c* ]5 b) Y; B L! y
* E4 t/ u) }% w- |) \; E" C' X- T
public static void main (String args[]) {9 @; R( \0 R& O
7 o% a" d( k1 p8 e9 a# B
try {
+ L/ s( W4 r- o( o8 c5 }
5 w, W2 [7 v; c1 _9 Y' S+ GDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
$ j b: X3 I% t3 N' l' B* c2 n% I( M: E4 p3 [
DocumentBuilder docb = dbf.newDocumentBuilder();0 N' F+ S3 @( f
# b8 x6 Y5 R6 d* V6 U6 U% n
DOMImplementation domImpl = docb.getDOMImplementation();" q \/ F, B& z% Y4 Z, i( p
( R! D: u- M/ @' {1 ]
if (domImpl.hasFeature("StyleSheets", "2.0")) {- t I6 \- ?* k! B
% M6 ^# @% H: ]: }) D
System.out.println("Style Sheets are supported.");
* n8 I+ G+ j# K2 \2 k
; u8 W8 ^, k: G; q& c% M} else {3 K' K2 [) [' d7 v
- w$ B/ G1 u. jSystem.out.println("Style Sheets are not supported.");
# k, \) z6 c% B" B% D$ t+ }
: ?! d" V8 \! o& r) ^7 d}
% J& B: [* h% ? w* T2 h$ {0 O! _. F# w+ J1 L' g: N; Y: e2 S
} catch (Exception e) {}4 w0 j3 {# l; }$ B, D `$ c& N8 y/ Z
2 ^4 |' w. S$ i# O! I
}7 ~1 x9 y c7 V: W' h
7 F* l- N1 n! f+ Z+ H" G
}% t* `! n7 v7 s6 J4 x
9 k! f) i( o. u
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
- @; e4 l5 I& A# I& p! q
" ^& `' a4 Y z; O# k9 o本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
2 s+ u# R$ \$ i1 C8 z, l* {
9 O- E, a, Z/ E/ O2 `5 x" P基本的 XML 文件* |8 Q: M5 g/ l6 h4 ?" ]$ `
, B, f+ W. R+ U1 i本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:) ?6 A1 S% M" o* g, Y9 X4 s
5 N: U+ T4 D) c& B
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
) Q- W: Y+ F% P# X, T( k6 }
' R; X4 C8 Z2 K! yDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。# N5 |% C0 n% Q$ z* C
6 D5 j4 b; T, ?1 e* I$ N) Q/ `3 c数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。3 e: D4 A1 f& ~, W
- z' z% y# g* [6 b! L<?xml version="1.0" encoding="UTF-8"?>
- g, P6 I( S1 L' R, D+ S
: l# U E4 G; H; J3 [<!DOCTYPE ORDERS SYSTEM "orders.dtd">2 z6 d5 h: L0 S/ r3 s
7 S# y; t1 W4 w& g6 s* `( g<orders>
# F- c6 B( Y( v: c0 p& ^) ~" s6 \. N' C. M/ D+ b
<order>, S5 x( V' }" w: k- B
# x! V8 a8 U8 T/ g1 D
<customerid limit="1000">12341</customerid>
0 c: |. B- V; p' n
( p2 m; B* J* [0 H8 D+ M6 w, t <status>pending</status>
+ T( D( R! }; j$ ]3 M
, D7 X" s& M' \; u* j- L <item instock="Y" itemid="SA15">
/ f/ `* |7 s4 I. L* A/ A( w7 S$ T% r4 h
<name>Silver Show Saddle, 16 inch</name>" ^7 B8 E+ D- j5 G
' _0 z& A4 G; g9 \5 E <price>825.00</price>
3 q/ e, J0 m# X) }, X M" w9 a% i" h! C1 X1 S+ W2 s
<qty>1</qty>! B# {+ K; ]! g
O3 ~7 [: j- U2 @
</item>" m6 B; _# C/ w6 r$ S, j- }: A
6 ~* a+ c) S9 x$ K L <item instock="N" itemid="C49">0 y/ {7 I- j+ [& O( H& v7 @3 c
7 w. {( ]6 t: e: {' i: W, O
<name>;Premium Cinch</name>9 x; j Q4 o7 ~" T. f0 i
4 R( g( y$ R! d8 l3 I: k! V- Q" @$ W <price>49.00</price>/ y9 v: N& m: c Q. N8 j
: w" @7 E. v5 u7 O* w. p1 r) M
<qty>1</qty>
& `0 ]" j9 |" O, j# q
" d4 m( i- a/ p" b* Y6 l Y </item>1 `- p8 C) Z, N: _1 v) N$ m
0 M- f! B% N" H </order>
+ ?" N9 Z, Q, ~7 Z4 c+ ?( S, [1 S2 ~4 U, g- Z- J4 ]+ b$ G
<order>( Z3 e; ]3 f8 h0 n9 ]# V. _
, ]1 u# F F- z6 m& x7 | e <customerid limit="150">251222</customerid>5 D" r. _. f. ]( U1 i. w5 y
, N1 v: ]9 M7 v& S. N, ] <status>pending</status>: M" [3 x& k2 @0 ~/ c2 L) u) T ?
' |5 U3 d! \, @9 L' M* L
<item instock="Y" itemid="WB78">) m, }, r, _0 l, v' _( K- s
( ^6 z3 e# {+ C. q" P3 [" n <name>Winter Blanket (78 inch)</name>$ }: `: x0 [6 {4 p
1 R: M9 ^2 f" r2 Z6 n7 {4 d% l0 j
<price>20</price> p; V- r3 I+ Q
2 e% P9 p# M' A% v& Z <qty>10</qty>2 A1 l" J! O. y* W* p% Y
: `2 g( V$ X. J' I7 j) B
</item>
0 a! D6 F( \5 Z
2 ]0 c; i; f# C3 ` f; i</order>* e1 ?2 B* _; n' `
i* w$ e. |" K. h# C) S( C</orders>. {* Z! @2 j+ _: a4 p& A
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|