  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
3 `9 \, m1 Y. d7 g, l+ Q, h
开放分类: 互连网、网页制作、web技术
% a1 d& d3 s" a- XDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。 q1 S/ |; v {& R
, r( _% @$ r5 b+ Y9 q; @8 r* tDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。! C, M+ ?; g5 [9 ~- w
g _, S( a) u! [对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
4 g8 y1 O" ~* k6 I0 `4 mSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
; m0 g3 l7 f) Z$ g6 A6 D
$ A- N$ z2 J5 s$ j另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段# \( U$ g/ X4 G {- D
M: e1 t, z' i( b: \
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。2 l0 \. T* \) Z) o6 P! H: g& G4 A
. C$ T3 b/ F" X: w作为 API 的 DOM
3 O; ?9 I$ ~+ Z" a& ~9 b' M4 F, u
" h) F) Z, p# c9 E2 q( T2 d从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
7 c, u5 y/ _. {- z$ L
$ m2 f' E/ `+ HLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
# \- @: }3 }7 a( p& P: h& ^3 C7 C$ P4 m7 B0 ^: I. I
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。0 M8 B) k: s3 p5 B1 H! q2 K+ y% A
5 m7 A' B$ a9 I! b
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。4 \7 f) o5 y- [7 d" b/ ]; e
# `9 t: }+ p3 f
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。' I! p# W2 q S1 I: C
/ H- r" [- d! S8 b3 |' }7 M
确定特性可用性2 f4 C9 l+ g" R M
* {: A' Y# b0 x: s! m% w9 XDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。: D4 v$ C4 P$ E6 D/ Y
1 d! O1 `* U& Y6 [0 z! TDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。9 ~! k" L$ y4 y# u! y3 R/ ~
p+ C5 I+ t/ W1 S" ~5 m! P
import javax.xml.parsers.DocumentBuilderFactory;9 |. [& \8 f* P7 y6 n
: i5 f) f# [( q* D& D$ M0 e" S) Kimport javax.xml.parsers.DocumentBuilder;9 L1 C8 x% n% c4 H) u
z- b: i$ k2 h7 J, R$ Z
import org.w3c.dom.DOMImplementation;
) E; D# J' M7 }4 Z9 G$ [) P2 F* D x5 V
public class ShowDomImpl {" Y; _9 X& \: A$ z: h
/ ? \! l/ {+ c# i& d
public static void main (String args[]) {9 a8 m9 ^9 V& J) c/ a# R
9 J: p0 J4 p h8 Gtry {. \' H5 u2 m/ O. |$ i# i) v
& h* A2 k* |2 Y
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
/ Z6 I) b9 [ T" O/ W7 y4 H0 C& I- Y" s. l
DocumentBuilder docb = dbf.newDocumentBuilder();
+ D9 }: e1 H( v( l# b |8 k
9 v( N- y5 I% B8 O/ g9 KDOMImplementation domImpl = docb.getDOMImplementation();
* d {8 O) p5 }& x; O9 {6 e; ^- f2 Z/ Q0 g+ a7 e
if (domImpl.hasFeature("StyleSheets", "2.0")) {4 l% s- I8 G" p) d% R% n" B
/ [5 x5 L& F; u4 t) QSystem.out.println("Style Sheets are supported.");
6 {0 K* ?, d& y- W' [+ S( P- R5 t; n; I- f& J Y
} else {
) w# R* A! _; O: p* p. `6 }1 q1 f m, k$ E# L1 g
System.out.println("Style Sheets are not supported.");# o$ C5 L7 [6 u+ m
8 N9 o# S9 |# R* A) @) q}
- o2 S+ z5 G' D( N
, B( A/ E- R+ p; P" q4 Z} catch (Exception e) {}
2 I) u" V' d$ _7 Q1 N0 L0 ^) l) \/ ]+ H% z. w
}
0 d; ~) ]2 r: U' {: a, b# K5 E% J
}2 o3 R0 ]1 j# N2 v- B: u
9 z; K ~4 Y6 W. f(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
" Z6 j- p& \2 y: g$ K2 |0 c
- m0 W& \! \# ]7 D$ \5 p+ h. L本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。* n" }7 `5 t3 C. {5 R0 w' [0 t1 l$ D: z
$ v5 ~0 N9 ^& I( R9 e( m基本的 XML 文件! ?' b9 [ t) z( }1 Y& b
( x( K7 ^; v5 }/ p F0 Q/ K$ Q% a本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
' K* {+ E0 W- |" _, r3 v) A1 T
# h( W* d1 V3 FXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
s% G! A3 U/ {6 n/ s
, `# t" z' J" \# |3 k% S! V3 GDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。 {5 o% h# o/ v- _0 \3 @1 K. X, y
: L0 f k) y5 \- z: F% K. C% x数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
1 ?% @9 f' i) Q9 d4 ^3 p _5 m+ X& O! y4 O
<?xml version="1.0" encoding="UTF-8"?>
6 h4 c- U# ^7 Y5 t' o6 L
+ U% z2 ~0 c1 w9 r# c( D<!DOCTYPE ORDERS SYSTEM "orders.dtd">* i. `7 u+ P) ?* V3 R! B1 K& B
# l0 L& j4 I& g3 Y) w% x5 n<orders>6 [; \; y' F: l8 W* o
, D0 X3 I% P) \1 o: P$ | <order>0 i5 @) u- W6 |% e. D
$ t% P& X# \4 J- _. e" i0 \6 d
<customerid limit="1000">12341</customerid>
& p- P* P" o* O8 r6 Y6 P
- X$ S2 R, Z) f [2 Q! _/ q <status>pending</status>: g0 |, b- [; @6 Y9 c& v
0 T9 h3 q" Z% [1 a5 y- F+ }
<item instock="Y" itemid="SA15">$ O9 q4 K( i# J$ |( X/ d
+ z- v& ?4 L; x: v }
<name>Silver Show Saddle, 16 inch</name>6 Q1 u- y# F. k7 W8 m7 Q- z0 ]& N
) ~/ V q Z0 y% D9 F O. q9 \! m9 W
<price>825.00</price>
! h4 l7 M9 `( R6 C% Z( s6 L; q _+ N; @* o5 y+ J5 ^
<qty>1</qty>
2 ~, L: K* v7 n/ k0 C( Z% X7 `2 T: V5 ~. `
</item>
, M3 ]" h0 d3 M# B/ W, n
, s: {) d4 a8 `6 }; u1 K/ `4 h <item instock="N" itemid="C49">
' h {* C. E B1 c3 E- x% X; \+ e0 n6 q" G Y3 V/ n
<name>;Premium Cinch</name>
: l; P0 h2 Q- Q7 F+ h" f1 t$ {$ M
0 ^- q* }- Z O <price>49.00</price>
: Y2 ~2 E3 {; K2 j+ @/ e4 ?5 C- V8 w j
<qty>1</qty>5 b ?/ S# L8 n [
N! H! }' _- f4 l1 D, ]/ A </item>2 w0 i' b( y L: g4 ]: k& A
& g; j/ H3 {/ k& K
</order>9 S+ a/ }( |; c: J" g6 a* [
* @4 Q2 s; j! @" F- ~( ?! B9 u
<order>9 z+ F" }) j9 \4 E, L, G9 ?
" Z( _. l5 d2 @: V% }, @
<customerid limit="150">251222</customerid>% \' v" z. u9 @# A& N4 \
: x& f; P& k% Y) t d9 A <status>pending</status>/ f: V! M4 O( Z) W0 k6 n
( `4 r* Z: X+ Z7 @6 `# F
<item instock="Y" itemid="WB78">
* i+ i& P5 N8 y! Q6 p0 p9 {3 [# v( Q) `
<name>Winter Blanket (78 inch)</name>8 S% x" U# ` r y5 r! S
8 @3 |& X- W% [* R <price>20</price>3 Z3 V% {) U. D0 j3 V
. H8 Z/ h. ]( r. b <qty>10</qty>( ?$ G5 R: H+ \! Z+ c& N
& b0 F9 Q" {7 z2 F, U- \" d </item>4 ~9 U4 _# ?- K! Z5 ~
# w) J4 d. u: j" W</order>4 D) o( Z& C% P
* X+ H; ? ~* N( l: m, e+ Z0 B
</orders>: K' f# k7 }4 d
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。 |
|