获得本站免费赞助空间请点这里
返回列表 发帖

DOM的一些概念


! `; R* e8 V0 U9 T9 k* b+ ?- {开放分类: 互连网、网页制作、web技术
3 F: M( M3 r* O( nDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
, b1 F! I! }5 Y% `) R$ R  m8 y5 v) R
; K+ D* Y8 W+ E, E' iDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。! l; [5 @- p) Y8 u- F, T9 t; l
$ G5 u3 w5 `" u; m
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。8 q1 {2 G8 G- f  \/ Z, n
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。7 ]' y+ f# _, R7 d6 X7 \
3 G. u' Q+ j" y) z# O3 n* ~
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段: w% N7 T2 G/ g. P

) {# b$ `2 v/ F! n: i. q" `% f+ r' k3 S解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。: f2 f5 Y) ^0 r$ T+ o
4 N/ F. C, f" R- A+ M- f
作为 API 的 DOM
7 H+ W' K% [  B1 f+ u
+ p6 f) I  w& O. T; P从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。) X3 ?9 k. X/ Y4 z7 c  u& I) f& L( G
, S" O- h5 R7 x4 H+ S
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
3 O6 o: w+ j7 b  k2 j, g" E
" p, v+ J7 N& w% D/ F6 CDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。( q2 P1 E$ [3 v

" g, r) ^! @, S" S7 U( A/ Z* ?当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。7 q! X0 e& o$ f9 U4 _! S8 ~: i
  W( p" n1 H* y# X$ C
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。1 L1 H- B6 p8 M+ W* I

% k+ V) P0 z4 I& R8 C确定特性可用性
* ]' L; [; w" |/ Z% M- q! s! t. x/ ^; S$ e" @* q
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。* C5 q+ j! [; I" z9 h& @) n

& Y+ v/ p( t. H2 B4 c( lDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
/ b) I5 E) l6 J6 b) H: r  C/ }. `6 [
import javax.xml.parsers.DocumentBuilderFactory;
( D7 {5 c+ L# C- @, l: z
0 m- ~' o+ u- ^% f* e0 w8 _, h, fimport javax.xml.parsers.DocumentBuilder;
7 C  }$ |1 l: b5 B8 D( l( @1 U1 {- ^2 w. o  a: j8 y* T, f1 j
import org.w3c.dom.DOMImplementation;( z( V7 I7 K$ f- S
% Q- R7 P! c5 k- F
public class ShowDomImpl {
' }" b! Z' f8 {4 \7 ]+ ^( k; \, S' h$ j% U1 ]  S& p( \
public static void main (String args[]) {, w5 k' G1 n: `5 W" B: @6 V) o

/ x9 A8 o0 Q5 E2 B. X0 H, Btry {# \4 G* H# |7 v  r) V

. X: L# d. d9 U4 ~/ S- c  T' MDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
* i  `7 T' B& ]5 h- L( y+ R. P( @' y4 Z  P" V* c6 h: w
DocumentBuilder docb = dbf.newDocumentBuilder();
7 @: T" a% R/ M
6 z$ t5 }2 c$ Z$ y& _1 zDOMImplementation domImpl = docb.getDOMImplementation();
8 O2 Q7 g4 H+ l6 F, Y# A- C: A+ M3 P, o1 C4 g" W; y1 W! {: Z- |: e. B' s
if (domImpl.hasFeature("StyleSheets", "2.0")) {/ d7 J$ X4 b. q7 P% N

3 ?& R% [. K$ g, ySystem.out.println("Style Sheets are supported.");1 ~8 A& X& }. z8 k/ v
7 R5 Q* D; }2 f: H. q# q
} else {
8 h' _0 s* u) ~5 G
  ]0 _/ o: M- _! H4 y+ eSystem.out.println("Style Sheets are not supported.");
9 a; @/ x$ \' w- d& u6 C5 V7 _/ s& g# ]7 g% m
}% [2 |$ d) `' F* R- F4 o
5 _' _+ |' G3 I7 W! m3 n
} catch (Exception e) {}1 y: C& @: F9 d+ h
8 Y. {4 f2 H/ q+ C  B8 p) k$ q
}
& ^; k9 U! E1 {. a# W3 U
0 `$ \" F) ?, n" o5 R$ n* o7 E2 p- {}) H8 J/ A+ I0 V- b: R

2 T' n1 f) f, X# Z4 I0 V; ?(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
- g7 M2 P) P7 Y- l- Q2 D1 H* @- I% {& k
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。; U( A7 Y1 v5 V0 P

$ q! s' f+ D( @# L% g3 _( Y基本的 XML 文件6 m0 ^6 M' J6 k7 E% ?* k
! \1 x7 n( W! b% R
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
# l8 N- C' N' f2 P5 P
$ E6 x% J; n; m( w" C6 B) _" u; WXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
; K$ J0 k2 s: u7 m* }2 P1 Y  H4 }# I% d9 t
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。- B' A' s" o% V

0 s/ T! Y6 X- a2 r数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。( k: [" k' f& L3 t: E8 @: _

, D7 s! {( V7 `$ Y7 j1 C<?xml version="1.0" encoding="UTF-8"?>: L  X9 ]  t/ q! K$ k4 ]+ @! W2 x* Q- V6 g
1 ^& H* d6 N. x
<!DOCTYPE ORDERS SYSTEM "orders.dtd">( V3 ^2 ]* F6 Q. Y
& d3 v6 K2 P) A1 q, o
<orders>9 H% e6 Q  C/ v( a4 R: P
* X8 j; \, Z1 [8 c! s3 N" L: j
   <order>
# [% h' d1 ]6 a  U: s6 R+ D2 T& l" f' a5 [
       <customerid limit="1000">12341</customerid>7 G) b, i: \6 K$ ?) g) C
; v$ R5 E8 z. Z) |1 D) A+ z% ?
       <status>pending</status>
$ d- @/ A$ `) a: T
& P* Y. c$ W% y. q7 t       <item instock="Y" itemid="SA15">9 r3 c7 K7 A3 m0 k/ p
8 v/ H+ m7 E% c
          <name>Silver Show Saddle, 16 inch</name>+ `' G0 \( }! d) V
* q$ [* @! P+ ~0 Y
          <price>825.00</price>  i& ?$ V$ y, u/ Q8 p

+ x8 x, ?( B8 p          <qty>1</qty>8 ^. m6 {/ R* l; A8 i1 V, v( p! h
, b9 g2 p, {1 u. Z9 i2 z' k& a
       </item>
2 N! ?+ F+ }- e, v" Z* ~0 v  [- ?4 s/ F# F% h. |: G- r
       <item instock="N" itemid="C49">
5 }6 y% O: ]% x3 z) e1 K8 z' A0 Z. A8 s- l
         <name>;Premium Cinch</name>) o2 l' P1 [2 d3 s9 H

3 H6 |1 a" a) d         <price>49.00</price>7 n' Y+ A& Y6 ?; d0 s# Y1 R, Q% R

) |7 D: ^# |' p( P, ~         <qty>1</qty>6 C7 `5 w: N, S9 v+ ~% N
. a3 n% h' W8 s  N
       </item>
0 |. H' `  W4 V, M+ ^1 O) d
* ~# n$ s" s( I. d9 h  </order>
4 |1 b) g7 g" }9 C* I3 d
9 P4 u- X8 n7 c: t+ V5 v<order>1 l8 R8 z3 E  f) ?! h( u! ]) t8 p. o
) Z( K, G' v' q' o9 F# N* y
   <customerid limit="150">251222</customerid>
4 x2 `( N4 d1 V2 ~- L- V
9 D, Y) H: D+ q   <status>pending</status>
0 f6 S9 |: ?4 W, z, Y
$ x. @# _7 _2 i8 D9 b3 ?6 H   <item instock="Y" itemid="WB78">: \9 E# f6 g6 ~5 I2 [* h2 b& w

8 u& ?# T" \/ @1 l+ e+ A: A" h/ O  D     <name>Winter Blanket (78 inch)</name>
: M, ^/ L' T- Y1 V. [& _& M
0 J, I2 h6 ^/ X& l- I" L  _. a     <price>20</price>
% _. c& G( \+ V8 C( K- k+ l
  M! X+ Q$ F  C* @! ?     <qty>10</qty>7 M/ m+ \) |5 ~1 E

0 \! G9 z, I8 c3 D+ J   </item>7 v7 x* `8 D" C, p4 W# G9 U- _
. X# y9 _/ |) K* U) _" j6 a0 P* k
</order>
3 y3 k6 ?+ M0 D' [# Q( ^% [: T' |9 u5 [8 N
</orders>
% b" u) N/ f0 p* V: e% y在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

返回列表
【捌玖网络】已经运行: