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

DOM的一些概念

. R$ L6 h' B  G+ i; L
开放分类: 互连网、网页制作、web技术1 R- b' u! E# F6 ~$ `4 Y% ]
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
( t1 |! E6 u: r8 Y1 I6 b( B/ w8 T! K4 e, |2 a
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
4 I3 r7 X, L1 I: e7 Z5 u0 a; w  L; r8 Z9 q
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。* g! {- \" x& U8 l9 E/ W5 k
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。+ W' r- S; R5 K1 S0 j' G  x6 N2 a
5 C" w, Q' S# w; k- ?/ L1 m4 C
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
# C/ f8 W+ O9 r3 i7 x6 i# [3 X
+ E+ o$ t( I0 q8 [8 \% e2 h解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
6 J& w+ p1 [+ L* q0 ]* t, v; p2 v. Z1 M% k" s( ]
作为 API 的 DOM
2 @4 o! v- v3 C" V3 w$ J) V6 m% R, Q2 ^% _1 l
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
% ?" ?& E. D1 {; p1 W) |6 W9 W# T* q* X8 s8 a, M5 l
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。) y% l: i+ U2 C. L1 z, x$ n( c

7 t2 e3 w7 f# n: o  i) C6 sDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
" u  x2 z' ~  W5 K9 e3 m# W. d$ u
9 }. D" {' E5 f当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
2 D3 ?: D+ x; j! L
% B/ N# G; g; |3 u6 M8 XDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
2 ?, @3 S$ t9 q6 n. j& e% ?2 I- I, i- D. h; t8 f. \
确定特性可用性, L. w5 j" X4 V( g* M' r, V; Q6 R1 {" R

2 {, w9 X& J8 l+ Z/ H8 HDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。5 m' r3 v! O- \/ q& n0 N9 W
/ b( R: w+ S5 `2 A  g
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。2 `8 {6 l. y0 T' L+ q+ C9 v3 e

2 |4 J* ]3 x8 r$ I! M0 Z2 I8 Ximport javax.xml.parsers.DocumentBuilderFactory;
! h% ]% Q. j. B( g, F4 P/ U4 Z3 I" _$ `' g; e/ E4 h
import javax.xml.parsers.DocumentBuilder;2 J+ ~8 G  ?7 E. j8 o
/ a- T) \) W3 [7 A3 D
import org.w3c.dom.DOMImplementation;0 a$ E! X' r* U/ A

: A# K( K2 |% X" k3 I2 Lpublic class ShowDomImpl {
& z4 [* _3 _2 q/ H3 w# K
/ d+ p" D6 d% ]0 @9 E/ N1 x3 Upublic static void main (String args[]) {
- \. S7 @0 P9 d/ B! j/ E  ?7 |0 K( H9 j& P
try {, G8 B* O4 E8 U3 y
! O' x0 W$ J" Q1 r5 ]* G
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();8 L9 ^9 O2 _8 N6 I

+ u3 Y& m/ ]( I# N1 d: x- eDocumentBuilder docb = dbf.newDocumentBuilder();+ f8 u2 b) Z8 v9 ^

4 m! x6 x9 p7 j7 ^( q' O5 DDOMImplementation domImpl = docb.getDOMImplementation();
) e$ w' X9 Z7 s% L2 X( @6 b* O4 f) Q) i8 b) a
if (domImpl.hasFeature("StyleSheets", "2.0")) {, h3 j; _4 o. _6 \- m  e( s5 ^6 x

; s0 V1 f- P5 x! S6 h+ ^System.out.println("Style Sheets are supported.");
4 K7 z: W7 T  q, c& a
; h; i) n! r: v( Y} else {7 H6 _5 ~8 D8 c0 w3 X5 J$ E$ s

4 M9 X* l. p' H3 P/ {4 cSystem.out.println("Style Sheets are not supported.");
5 l1 I& }" K. n( l. e6 D  }
; c0 }2 |/ y+ W8 q9 I+ P}) ?8 G8 Z* N& H+ _4 O8 Z
& f, o) B, r/ V( C
} catch (Exception e) {}
  N7 O9 N( G$ D% a% O# w
' H5 ]9 o  F  G+ i+ K}( M& Z( q  |# o0 _& K0 E/ w! M

& {1 p/ O2 I! p$ s}; S6 H/ Z$ d! l0 G

: L5 d3 p3 A$ n(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
; `' N4 W- S/ O1 ^1 Y8 J9 R6 y( c1 {' j' V2 y2 r0 z; r
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。4 u5 F2 p8 n- r. }7 p0 A" f0 R% C
+ g9 E# y, R6 e$ w( T1 b6 }
基本的 XML 文件
  c9 t" M+ u2 X# Y2 G; ]) W
5 T9 c$ W5 l- }+ p7 ?. B本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
1 \6 J+ ]- ]  R  \4 x) |! q# ~0 A0 i0 J# S$ A
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
  d8 W6 t# L$ r# ?- p( H
1 v9 H% T" r2 [7 e+ ?# kDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。+ L* r2 R! A8 `5 I4 J
1 J: F0 S- S- x& j% L
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
- d+ I2 @" m$ f4 v7 Z! {! o5 s
, ]! A! e$ c6 a& o<?xml version="1.0" encoding="UTF-8"?>
4 h3 x) }1 i9 I1 `$ ~; J, h
2 `- P" |% F3 ]' Z: i" j* H: a8 Y<!DOCTYPE ORDERS SYSTEM "orders.dtd">
+ h4 a) t; i+ g. H- {6 L2 w0 ?7 i0 s, g, \0 K! q5 P; H4 \
<orders>! X$ S, O- W6 T! g
8 e5 G7 B& k8 u
   <order>
- R8 `* \# H$ w* m! j% D# K' n! A0 G8 P" h3 j' v
       <customerid limit="1000">12341</customerid>1 v; d0 y6 f9 v4 `1 C# K2 {

' ?$ c7 X) Y. _' O( U- ~# s       <status>pending</status>2 W1 |' G4 h  |3 @

0 U$ M0 R- T& k, q1 g3 ]       <item instock="Y" itemid="SA15">
! @; {* `( s0 S8 T1 w5 V3 H& h. i# t6 e2 ~* ^; w! ^3 p+ p( R# I1 o" @
          <name>Silver Show Saddle, 16 inch</name>2 h+ \) z4 Z: V' F% T9 J; ~

* f3 z. l! n, [  j9 \2 @" e+ y          <price>825.00</price>
9 i) Q% K. W8 j9 C% O# h) ~0 h! p" O8 F; }; }3 }5 h3 w( M
          <qty>1</qty>, w7 z( |! s2 r! S! f

* B% {: C$ I+ C. s1 G% J       </item>& {) E: |) m7 O6 c5 F
# c8 v- G' A1 K5 x+ x
       <item instock="N" itemid="C49">
. h1 L, W( ~% d, f8 w& S2 ~- W6 p* y8 u  g4 u$ x! D: i" a
         <name>;Premium Cinch</name>
5 Y; e( O  p" m) o  \2 h  m0 X& H  }7 c0 Q3 }
         <price>49.00</price>: s. Q& r; S$ ]0 F
: s+ j- s! U! _, z' G8 @
         <qty>1</qty>
) Y9 E$ C/ H0 H! V& `& L* q
+ d/ T0 L- \9 B3 T1 L) H7 k       </item>& l* [; z$ J. G% K8 U* `
  @5 ^9 M! k# _% e# ^
  </order>% F( }# j& f, P6 ~

4 l. ?) S: A! o6 f2 T- `<order>: o* m9 y( e6 b  A* O% |

& M. E$ s5 ~* u6 r   <customerid limit="150">251222</customerid>. q2 W( _9 w6 r# q6 Q* d6 J

2 b$ a  i# \2 ]& _; z   <status>pending</status>  Y  Y% |+ n% a8 U) A
: }7 h! v0 s1 a# E+ g
   <item instock="Y" itemid="WB78">
1 @. p* `1 w, T' x
& h9 g2 t8 i. c# p8 H3 C     <name>Winter Blanket (78 inch)</name>. u, j. M) ^7 m: ~

8 w) h' l/ F# w% a" |! W+ U     <price>20</price>" W( V! |. D3 A! X: l2 S! J: e

8 ^' x7 l6 B  t. |     <qty>10</qty>
. [, ]* n% R/ f
  l* ]6 W' p' J5 ], ]+ G! \   </item>
. l! X$ T# W( ?3 ?8 [: G% X: q& z' N4 L4 {! v& _
</order>
5 B" h3 Z: u$ _4 q; r3 |" v, u
8 E8 T: B6 B& o# P7 ?. J0 w</orders>
. Y: x9 @( @6 U% B4 L3 b在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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