  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
: s: p9 ^% L1 l0 q8 O; }7 u ]% w+ A开放分类: 互连网、网页制作、web技术, D0 n, c8 {( R; D
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
0 @* ~$ A, m) ]" |* H/ Z6 \; A
/ |4 D* O I8 x' f* G" ~. TDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。$ W* T; j1 M8 Z/ p( Z1 ?
' F8 e5 G1 U: ^! u. s
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。6 h' e6 O$ i, h/ @
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。8 P$ a3 z; N7 Z# f
) q8 r, W- J5 ]6 V
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
# x/ J# {: R9 \& j, X- \- E
; a5 e# M @% m1 k$ N解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
3 N0 R8 o& B9 ~" J# V, i4 l: {$ z, d% J. @# r
作为 API 的 DOM
3 ]. K' O. X3 W3 s) w, D* X' q- B. @4 T& A9 d
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。5 t4 ^* U8 w: ?- ]$ h2 `& H
' F u: S$ M$ W3 H+ |6 vLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
, A1 D5 ~- o! [- s9 V* K" ^+ ?/ Q/ x2 X2 N' r: A/ q) [
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
7 u+ `5 o* L, o: P# f9 J% _ h! n6 B8 u" H# c1 h8 [( V D) w
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。4 d5 O, e+ [& r" Q4 U: \
4 n1 j; X4 {5 wDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
+ C/ b+ o8 f% ^
8 b1 Q6 Q0 J9 ~$ m7 ~# G! E确定特性可用性0 f9 B& p% ~: H' w. p- d% w0 q' p
$ w! d& Z8 Q2 ^1 P( G A( hDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。$ }3 X0 Z- z! b5 n# {7 N8 j
( T+ b, U# x5 i; c7 ]9 @6 aDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
( I& f) u! U/ r( z# F
U0 n' u% G8 q: ^" _& nimport javax.xml.parsers.DocumentBuilderFactory;
3 H3 g) B- A3 S; S3 g/ V% n% l# B& S/ V9 N! U3 k0 j. `
import javax.xml.parsers.DocumentBuilder;
i9 ?' w B. a9 Z/ W
4 L' o- _7 J! l4 _% Q Q- Uimport org.w3c.dom.DOMImplementation;" b5 M, [1 b2 Q- j. \( v! M7 ]/ j# A6 Z
5 ^. ]3 v# a8 W" jpublic class ShowDomImpl {
. c: s4 k" f# ^' Z- J5 W5 P' {8 R2 d$ x! Z
public static void main (String args[]) {! {+ ^& p; O0 f$ k' W# [$ S
: v! s9 Z( O6 k
try {
5 [- c/ S) r/ b$ H* g, v& i3 O% d, H9 l' ?3 i/ B
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();1 u5 M* Y7 n3 t, F( L4 I) G
4 t2 [$ U% j! ^: u: X2 Z
DocumentBuilder docb = dbf.newDocumentBuilder();
0 ~$ m d6 e9 N, W! z. ]5 h
& X+ c! g$ ]0 p0 i( W- RDOMImplementation domImpl = docb.getDOMImplementation();
3 p9 ] z9 I7 M" x6 ? p) f5 N
' X8 ]/ m/ G% }: {if (domImpl.hasFeature("StyleSheets", "2.0")) {7 c# E1 H! I w7 [: X2 ^
( u0 N1 C; L( q7 X& _# {; rSystem.out.println("Style Sheets are supported.");* _% Q) s. @. x
9 Y3 d/ X- [+ K$ h9 h} else {- G: G$ l! D; y' i0 r( O5 ?: {8 K
% }. g9 E! U: t. D, t; G8 aSystem.out.println("Style Sheets are not supported.");5 v9 G7 R3 e7 [( J1 U3 \ R) [
* Z% W+ {* O4 u. i& t}+ c3 h- ~. x/ k. l1 g5 O, B) {, d, S
' m) R, _5 S! i9 f3 F1 }/ j+ b# d9 N
} catch (Exception e) {} F; m$ m: E5 I `
' w$ _6 m$ S# ~! E1 A1 ^
}8 H: K, N; Z. A: ~3 r! [
( Y4 u/ i8 l$ L7 j}
& K# s2 M/ D: w+ r9 ?4 e1 @: _, i. }8 I! |* Y
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)7 ?# D( x2 G/ N( P/ s" i
! e4 |; r3 A" c本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
% h, B7 y( w E) Y; L1 o, b0 K8 X
基本的 XML 文件, u# A5 z, i$ q0 Y3 P( k
9 t6 @' S& ?9 e7 r本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
+ b' u8 } F: S, |. L5 ]: M
2 e# L( i: k) S+ l$ f# ZXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
- G/ O w! Q6 Q$ T2 f
6 J! ~+ c3 j& _# E2 @+ sDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
9 n# u. C9 e: N
; j0 M2 p, |0 E3 u) e- z) g数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。6 H9 E; u& a$ W# u! R5 t
. K/ G: F @' v+ [* \
<?xml version="1.0" encoding="UTF-8"?>1 H/ D4 O$ y6 T( x; B
# @, f2 g3 m* l5 |6 ?& `% z<!DOCTYPE ORDERS SYSTEM "orders.dtd">
/ I4 A M0 z7 B. x Z- g
$ X: c( \: r7 D3 m& I' v+ p% ]<orders>+ r( Z. |$ f$ a5 ]; E5 x% L
# M# ?) I% A; x' A, I <order>
2 |9 n: R2 V- m' v2 O; y" S- P: G. h1 B
<customerid limit="1000">12341</customerid>
. {6 C/ B, f- n, R: [" p0 S& y: e
. U7 `( y: \ n. S <status>pending</status>
/ O$ \$ C. e u1 ~- d
, ?4 r# c, J4 G! |8 l0 X$ _ <item instock="Y" itemid="SA15">
; ?8 E8 H6 u. M
" V8 O( S, y2 p/ Y <name>Silver Show Saddle, 16 inch</name>
& p- H$ z e( {4 \; ?4 w1 Y. K( o6 E) }
<price>825.00</price>
0 p! i6 b# X: W7 v' Q4 \( U
& L5 t0 b8 i& i+ N c: m5 m8 i <qty>1</qty>
n5 k4 p$ e9 [/ s
2 v1 k1 E# i9 p/ n, e+ {6 X </item>4 _5 } t- P7 M! O6 p
: S7 e- F$ B) `! `& R- o" S8 R <item instock="N" itemid="C49">
/ n. c h# q# ?" m d' N/ U! M# H. Z0 Z4 G x4 t# m
<name>;Premium Cinch</name>0 |0 v4 H* N8 k
% F- H" D7 b, R/ n7 B6 {
<price>49.00</price>
" \& j, h5 e6 x9 r+ L: g
. N+ g: k1 U { <qty>1</qty>- p0 E1 J, E4 d( K3 c% B \
! m% ~" h5 ], ?& d: p( Y, O5 Q- c
</item>
; k% c2 O( Y# w8 f6 K; u2 I. l4 B3 u$ Z0 n
</order>( c$ {1 z- `2 A9 e0 u5 u
2 Y; T/ M A- T& F0 Q9 z8 }<order>
" V: {' V9 j! S2 I( C* h, P( R, m# ^0 ]2 B& j" p: N1 {
<customerid limit="150">251222</customerid>
5 x$ S7 z( k) Q5 _, \8 M3 z( D, k& L+ H* D9 L
<status>pending</status>
3 K! l! J0 H9 C" H- c" a
/ B1 s+ y7 l3 X- e. V6 \4 p <item instock="Y" itemid="WB78">
3 x5 a1 q4 _: S* s2 G, B
9 P) E8 Q3 r1 P; P <name>Winter Blanket (78 inch)</name>! S9 ~/ v, A* K1 L' j3 |
+ q9 `0 ]1 U; C7 `0 U; o5 l
<price>20</price>
' c' w) C& ~2 Y- [/ c+ a) P; x
$ j0 c6 ^9 |9 H: p& A. x) j9 p3 X <qty>10</qty>4 }* ^# J" E& D) `0 K: x7 c
: a, @3 K* |# T </item>
1 l4 e" V/ P- {3 o1 L* w; r. `- c) \2 h" A l/ [
</order>$ U/ ?* I& i' O9 G& Q6 ]! I, C
: S8 f- j4 R( l% K
</orders>2 T: F0 T- Y5 l: I, A
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。
|
|