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

DOM的一些概念


- Q1 J5 O' K1 M开放分类: 互连网、网页制作、web技术6 z8 T' G% K- L. q& _$ S1 P
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。3 w; q. U; e; [4 f2 }
- q5 A' z# j/ b( r- N! ~
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。* K* T7 q$ Y( u# q7 H- z
( W  D  c+ _; d, ^- I; n" X
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。7 i: ]1 W) U; a: Q6 t; U+ @  P
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。7 x! \% m% Y) T' u( x4 @
9 W- F$ Q  F0 o9 y8 H! T
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
5 t2 q1 y' j0 k! {/ }$ ?
1 E% P$ P: y' A6 {: c解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。& N9 _9 q4 _, F+ K+ _8 u
& C; G  X, o" O
作为 API 的 DOM
' Q7 ]( `( |6 q. A+ v! V  `7 x% S7 z# r% A0 A+ u: ?
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
7 Z( S3 P( ^1 i
( p5 P* Y/ G6 f$ zLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
! \5 O% }. r2 O6 V0 S  u
2 i' b- \8 A: f+ ?/ p4 X0 KDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
$ m7 P/ M& K3 |% \- ^- F; E
; B! \3 g( S9 a4 B当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
" \! F4 D1 i! S: f0 Q/ o
, t: s5 d3 \/ H0 |2 f' Q. o2 dDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。) j! O! O' N8 o6 N5 x  _

+ H8 Q4 p3 f- _- a/ Q. ~: L确定特性可用性- s) S& X0 Z9 e* n0 C

+ p2 j, X/ l& O3 M8 kDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
1 I& S4 ]0 h. R' O
8 {, G; N) y$ v8 Q# i+ J, x- dDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。- g- r, n# w5 X( ~1 V6 ]2 c# z! V
( m0 P/ X& {' v* v3 U8 w
import javax.xml.parsers.DocumentBuilderFactory;) e! d# r6 g: c% h

1 ?$ p' K  ?9 p& v& v  bimport javax.xml.parsers.DocumentBuilder;
) Y, Q# o8 ~5 L, D8 v6 f8 X+ _
import org.w3c.dom.DOMImplementation;
7 L6 a0 G7 I+ I4 N
  I0 I% r5 Q5 E. b& ppublic class ShowDomImpl {
  B0 a: `) F/ K0 d: o" F3 O4 E
/ h$ d- v: ]) O$ U& P/ wpublic static void main (String args[]) {
& K& w/ v5 v4 {+ x2 O! |( e  X' X1 D( N4 z
try {! A6 G5 ?7 V6 I$ W7 W

1 o. v3 u& U3 ~DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();. n* E( s- ]! w

8 W. k) k2 Q1 `: [DocumentBuilder docb = dbf.newDocumentBuilder();
* Y8 M/ e2 e& W' W9 d" ~
% L' l2 L: A3 ]/ J; \DOMImplementation domImpl = docb.getDOMImplementation();
8 i. T3 J9 b1 m: I' H& G- ]6 Q% h$ t8 B$ s+ o- p: {' B0 H# _- y: f7 U4 ?
if (domImpl.hasFeature("StyleSheets", "2.0")) {
/ v- D% p3 R$ m, Z; D  W( q" a# y; J  ?  t- L0 u9 a
System.out.println("Style Sheets are supported.");
5 ^* r% |3 z  [" [+ E2 g6 M  F/ v" ~4 }
} else {# q; R% F" q5 v* Y

* N; h2 [- y0 o6 V/ N6 PSystem.out.println("Style Sheets are not supported.");
4 W1 @1 e1 j: p; B9 @- O& G" B. F4 q0 g; E* I4 Z
}
: Z0 c) z% j9 y( j& ~& s2 k
+ h# I/ P6 y% N/ b5 y% G( C} catch (Exception e) {}
. Q1 o2 u. c' X
% o# r) H, Z+ ^2 t+ {8 \- v- {" r}
# X1 t4 m5 s" V0 n
$ M, e8 |) _% t# Z' z}5 S) ^: d& y. w5 i/ g8 [
4 K* x. I* \, {  w
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
) J- ^. Z" ^- O
' ~- M+ ~. Z: D$ \  C; ?/ Q1 F$ k, f; ?本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
0 u' x# i7 |, c  a- `& x5 j" x# z& H, G
基本的 XML 文件
* s, {3 Q  Z6 q% f/ N0 r! P( K
. w3 P# x1 M( L6 K, X# S本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
- l1 U, _6 V1 E3 F" i, T8 P" Q7 V# v& O9 f
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
) X8 H- a, i) F/ \6 X# I9 ^/ {4 T7 I7 X
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。- P$ [0 q1 K2 q, n# O4 j$ x
# J; \4 O: H; N
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
) I* |, X/ W$ e* z4 d/ F7 C
  E9 e( }* \! S8 f- d  K<?xml version="1.0" encoding="UTF-8"?>
! t& v9 r. S/ F  |
: a  u2 H$ Q5 M" A) m0 ]# C<!DOCTYPE ORDERS SYSTEM "orders.dtd">; d: m, a/ _2 U2 I1 s
- C. o" ?, h1 m, m  z( A
<orders>3 g; I& h; z, m9 d% z" Q0 S
; G# B1 V6 F% k
   <order>2 J5 _; Q, V% ?. Q, }+ a' ]& A/ l

. P7 T2 q9 d& a8 k$ d       <customerid limit="1000">12341</customerid>$ @0 T* X) G2 q

+ I, a0 S3 x6 w. U. ], n       <status>pending</status>, ~4 D; B7 O) L* E" M. {
7 _5 ]# Q4 r" B
       <item instock="Y" itemid="SA15">
4 f" Q& {  L" r  Z3 C
4 d6 r% c3 W4 d. P          <name>Silver Show Saddle, 16 inch</name>9 I  a. Z$ o5 P
) m, t2 @! `+ D! s
          <price>825.00</price>8 O$ F9 w  Q, {6 Q6 D& p0 a

: [1 E$ h) ]2 L; d$ g$ {          <qty>1</qty>+ V9 Q. B2 M/ _! Q

8 A; `& i( E- ~       </item>$ I2 i! Z7 j! x! Q0 T1 Y

& U' E) {9 A) w9 `+ w8 c       <item instock="N" itemid="C49">% G5 e- L6 h0 b5 x! d
: r9 q$ B. R* r- s0 O4 @
         <name>;Premium Cinch</name>
# O$ x' s) ^1 S
2 G* N; P) ^/ w' C) u- E; N( _         <price>49.00</price>2 K. {9 @3 A$ u/ }0 G9 {, {
; Q7 Y$ X8 Z0 S9 E4 @
         <qty>1</qty>3 P' F0 Y) @/ t! i0 e

/ V4 j/ C' z1 `( O; [! t& \, w       </item>  X9 N5 q0 F1 C# S2 [5 r8 b
: R, E) t3 [3 D6 d% v( O) f# n
  </order>  ?' @& w, n" ^
0 \4 l' `1 K" N1 ~$ `+ J8 I
<order>0 N' w  e2 L: ]/ F- ~

8 r9 C7 L+ ]. u. }   <customerid limit="150">251222</customerid>
7 }0 Q. m8 Y, l& C2 l
, I$ H( i! D' |! E' w5 T   <status>pending</status>
- |7 K1 r8 k5 l. ?( o: p" h" ]7 b- ?( s
   <item instock="Y" itemid="WB78">
* u# r% ]/ ]# h: V
, _' a# P" d0 n4 R: l     <name>Winter Blanket (78 inch)</name>
" _. L9 i- H7 X
. I3 R  ]& H3 L8 j1 ]     <price>20</price>2 K: I, W7 g' p1 O
/ o' r/ R$ B) ], W0 D% u" q; d
     <qty>10</qty>' r. K$ `; B7 D9 p( W
: o4 y' K+ Z9 M
   </item>( K$ s- \4 }! _2 T% H' x; t3 P
: p  A9 [3 G! {8 {% x
</order>
$ ]8 u' Z. ^0 y% `3 _% `9 {! ?( X, Z' n9 B; X) T# `7 T/ ]6 m
</orders># R! ]+ u% y, f6 O' G* R5 ?
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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