|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
! J$ z. v+ f1 f1 t+ E7 ]8 e
开放分类: 互连网、网页制作、web技术
5 K5 w7 l3 j6 V) B! yDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
9 j* g" W' i$ ^- y( s: `" F+ b
' n1 @* N8 d% H6 FDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。* u: |$ {0 V; H' V
) _+ L( W1 j$ `5 r: t: m8 U
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。6 K; y( Y2 z2 D7 r
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
3 ?/ ]+ }9 y/ ~. f8 m/ ]8 C7 Y7 E% `4 E4 r' \7 t
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段* n: D! }7 n9 }
4 n& L4 \/ A3 T$ m2 e/ g解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
9 `# h0 `, R$ v7 l! q6 O$ h8 M6 b \3 {, [! y
作为 API 的 DOM% W4 I! z. P; a/ e8 B
/ D6 |+ q6 A3 Q7 g( S从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
3 J+ [' g: d" x( X5 J; p" Y" ^7 A( A% x
+ _ M3 c; S1 t* r, OLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
7 }* \ R4 I6 N) W9 `
9 O* b) e8 G: K* H6 U/ b# H PDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。! v7 W5 B! Z7 f7 ]7 Z* U
% A3 J# K% n1 N }. [ j' V当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。) T: H' O- J2 S9 }# c) c
4 _* I! }% O7 z9 z+ Q- \
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。* V: {7 W* U9 g4 `8 a& H& @; e
# v" {: `& E$ o, y$ q确定特性可用性8 c# S/ r: ~) M! b: z% O* U7 v
2 S2 H- b: b" b7 w, R( T' e3 UDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。( T; v! d( f' o; g
, Q& z: g& S. S& Z8 t9 `7 v& d
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。4 m- \% Q# l% ]3 F! S( j
" q3 o" C6 \ `& V2 B4 cimport javax.xml.parsers.DocumentBuilderFactory;
8 J$ ]- \4 Q4 r. {4 t2 \, o) @2 G! `) q
import javax.xml.parsers.DocumentBuilder;( c, S$ \9 w3 [8 u8 A! F2 Y* m
0 _4 r( v7 p# ]4 Q( _
import org.w3c.dom.DOMImplementation;
6 W! q( W; Z5 {$ t, {/ |) S* p9 N; B( ^7 H9 P/ \
public class ShowDomImpl {3 V, Z7 @3 `5 T9 s/ B2 U
) f; L! S/ l0 ]7 p
public static void main (String args[]) {
2 k/ T1 N5 h: r5 L/ W* g8 Q
1 m0 P4 A$ Q3 p4 [" U9 utry {$ l+ Z* t6 e9 x1 L2 q
3 ^ J! b5 `. K$ H2 z; h: UDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
0 W( _5 t. |1 t8 W6 d
* S' O0 e* K. @DocumentBuilder docb = dbf.newDocumentBuilder();- D y6 \4 d# x: u, n- Q+ t* D
. w3 R6 b+ {: h
DOMImplementation domImpl = docb.getDOMImplementation();
8 B/ |* L3 P7 r
: r; Z8 B! P+ @. b8 O: ~( p" p7 ^ Cif (domImpl.hasFeature("StyleSheets", "2.0")) {
# B- G2 u/ F0 i: K% Z
8 x' {! ^6 Y$ P: y; c1 _System.out.println("Style Sheets are supported.");
' M7 b+ M( C. z( A9 [0 s
d7 i( ^1 U9 s7 [. m0 u4 A} else {
# U& }, F: l# t9 A2 i5 e
6 a2 a) x2 R) l5 \7 C. F+ FSystem.out.println("Style Sheets are not supported.");
8 T8 h/ h* E$ Y0 b A
$ W4 P7 M# [& p' b+ v* T: c, K9 K}4 i$ q$ b! e1 n a
8 R0 m6 G2 n( t1 j
} catch (Exception e) {}
! e4 w7 M8 [& H; U# C0 c- v/ ?3 F2 H' i# X6 ? B6 A# X8 f# w
}; N* P4 C* C) q2 ^) O2 q6 a
7 i+ d0 o1 f3 s" ?
}
& F5 [3 J; e" S, p2 P. u4 o1 S4 a* A
$ w& Y$ G% o. ?6 X. Q0 q3 s(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。). d s% t: A9 i6 ~7 A* x$ h
# B+ H- ~& \. i2 ~$ J+ [3 L
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
6 ~8 j1 ^8 S: R$ A; w! p! T* w% O# i. T2 Y
基本的 XML 文件
1 w9 M8 |4 j3 _7 M8 h: R/ b
, j8 B5 @. d6 y本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
0 C& g: c p# ^' g( H7 A8 B; _* T6 P
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
, P' b" i& Y/ p' V" H' N! L
: l2 i9 u* q! t2 E* k0 Y& G6 lDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。. x1 | G) N$ h
3 ^4 A) N! M! \' @+ l9 V数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
W0 j0 _+ ` d+ j
% s# ?& D& G: L6 a<?xml version="1.0" encoding="UTF-8"?>
$ t" k5 t* g9 q
7 D: |- ^" Z7 S<!DOCTYPE ORDERS SYSTEM "orders.dtd">
# K% w5 l+ B+ w/ @( y
! r7 y: m' H6 d<orders>
( S2 s& y/ @* `# m8 _: l- X% a* D
<order>
2 ~$ b3 d& C' B/ Z \% T
2 o$ m4 U# k( L+ L' | <customerid limit="1000">12341</customerid>
; v W. F# f6 \" ]7 S
& Y0 u1 k$ D5 t6 J2 k$ D! b! V <status>pending</status>
. ?8 _$ o2 p% ]( D+ u9 |2 s; m
3 d( v5 T7 U% @- ~; Y <item instock="Y" itemid="SA15">6 S$ b* f) [! `% Z
* D/ |9 w! r2 Z6 l! N
<name>Silver Show Saddle, 16 inch</name>9 \7 P7 y- H8 M& @
- G" \: j- M! i O <price>825.00</price>: ~+ P: P: |2 m) W
" q& g" U7 z8 j1 d& y* j' T <qty>1</qty>: e$ \3 Q1 n' m# b
1 J* Q5 A% r& N, k. Q, e
</item>, G: f! ?6 \! s( h; O+ |8 Q, }- k" Q7 r
. k1 |) r. Z5 \" @6 R
<item instock="N" itemid="C49">
, E/ v. E. X( h! q' P+ U$ C7 o0 c
' m z3 U" s1 G6 j- L2 \) | <name>;Premium Cinch</name>
, g+ v; v# P) D' H7 g5 q, ~6 Z' z! [2 H" X0 O$ T7 W
<price>49.00</price>
4 Z5 Q$ L! \ y6 F' E) M$ o+ X6 }/ f( B2 p3 {
<qty>1</qty>
( t2 c9 d% k: |8 o8 ]9 l! m% F! |2 | r4 }
</item>
8 X8 ^ A R( c6 h# ^" h4 V
8 Z- q! r4 B# V$ W1 W- k </order>
* H* r5 h0 `: Y0 D
3 I! y/ x2 C9 N- n* R' F v<order>
% K+ W. y. G7 l5 i, y$ v# [ c7 I& E& p. J" m, r5 z3 s
<customerid limit="150">251222</customerid>
' D9 l1 L+ p' P/ k/ C2 q# Y8 G8 M" }5 U6 n, J+ N% F
<status>pending</status>
0 U: A8 O2 v4 [* l
1 ^5 W+ Y0 \$ ~$ _ <item instock="Y" itemid="WB78"> C2 A1 R+ Y) b, l. a8 I$ B$ t+ Q- y
* `" {1 G# s. c( g1 t6 Q <name>Winter Blanket (78 inch)</name>
' i8 o/ c- s8 N D, ^0 \6 \- F" E( j! I6 q( ]
<price>20</price>
* w% L2 x4 l$ f2 ^: k. H0 A9 M% o* d/ U, E: n& a* C9 L% s7 o3 f. F
<qty>10</qty>% G8 v+ B) r1 j, v* E6 Z" S
1 p- i# w4 F0 V6 e
</item>
7 Z# q6 c) Y* A0 |
J+ D5 a. M6 w7 n( u</order>
) S* x% w1 |9 E B6 A
3 `1 k: h3 Z$ g1 C6 b. S</orders>
% @2 N7 \) [# ^" w' Z+ m- {( A9 q在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|