返回列表 发帖

DOM的一些概念

  k0 I3 t+ `: a! p
开放分类: 互连网、网页制作、web技术% K  S' j0 P" B8 C; U6 M( T* D
DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。
4 W3 H1 @8 |- o5 U4 j/ P4 h, b) o5 Q3 D, r7 E! L, |
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。6 \$ Y* f8 |6 M- e# _7 n

6 k# }, a7 u* {+ |7 O! Q7 b4 h对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。% ]. P& W8 G$ w* P
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
0 M3 ~! k) M  B( o) z2 a, ~  T
8 _2 a  D, Z4 j+ n另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
- C" h" I1 l; G* S: c5 I* a, I% q+ s" l9 \# ]
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
# s- d. O/ K& R% U! s6 L! z+ f8 ]6 S+ S
作为 API 的 DOM
: p! _1 q5 m- M1 w' u. C& S* d
6 R: X1 H0 a. a$ Y, |: w) [, B从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。! M8 ?9 h9 G3 y, \0 t( i
% y, T3 B4 L2 d3 S
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
- |0 t: ^2 g! `' U* v+ f8 T* Q, R4 F( D* Z  B
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
) |1 d) l5 ]; w  _8 D9 Z' g
  r$ K$ Y& Q8 P/ |+ c当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
+ `8 F; Y' }3 A
1 n6 z+ @; k0 @DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
/ l/ ~3 M# m# v" t4 r( X' ]
" ?) Q8 }; i0 |2 W7 n7 P确定特性可用性8 L. v9 j- h# S
2 E: A) |9 e: G$ A  g
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
/ _, z* [% @7 n: s
: H. z9 |3 v) p, j! @) qDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。) Y: Q) t/ B7 }: B: `  A7 t  c- m& C
) b+ U* h. R- H
import javax.xml.parsers.DocumentBuilderFactory;& l0 n# B; {3 j( y9 l: Z
1 ]5 |$ q. ~$ p( r3 l
import javax.xml.parsers.DocumentBuilder;
3 V' y% \1 ?. s1 I& s# h
. E5 A: ]3 H$ ]: limport org.w3c.dom.DOMImplementation;6 \7 L* z1 C2 m; l

0 ?# j( I. L3 r: L% W8 Zpublic class ShowDomImpl {
& r$ Z. q  P5 {% j6 i: m. T* L) ~) o! R6 y% e: r0 V
public static void main (String args[]) {
1 F1 e. x3 \2 D) j5 ^7 l! z% q7 e9 p1 V
7 G. ], l# Q: h. B  u6 G8 Q6 U7 s' Atry {
  e# k( I( U. n3 \7 K) q0 ~  v3 ]4 j$ F  k
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();8 q) {' }2 M6 r8 a) [  P; `
  W9 q; @- W+ n$ X! b% m; ?+ x' I
DocumentBuilder docb = dbf.newDocumentBuilder();5 |- p2 K+ c/ e1 L

; K9 r. p5 y' U' ^5 yDOMImplementation domImpl = docb.getDOMImplementation();
9 e, F% ~! b$ x% F9 K3 T
' w; i# o5 Y" v: C% j; t4 z) Gif (domImpl.hasFeature("StyleSheets", "2.0")) {
, x6 M# k9 X# R& S. n. x/ n0 f+ f2 D/ D5 v, j. y! c
System.out.println("Style Sheets are supported.");. @- }" c! ]) l& l. r& C0 }
# B# l; J: B# G6 y' l  `( @
} else {
/ D+ `0 X3 U9 `7 h, J( L  h' A4 S/ v
8 O9 J8 _4 `0 d7 R6 ^" CSystem.out.println("Style Sheets are not supported.");8 F3 D& I* H, a- F

2 F! _- z% }3 Q}
0 i1 C7 G  `5 |2 d) c* m$ ^% x: Z
8 k/ A/ A' P8 B} catch (Exception e) {}
+ H- v# d1 Z( B, J! g; k/ ^
8 ?( G# n+ s, S% ?}
- Y1 Z9 ?6 Y; k: l6 D- e4 H( l) h. q+ W: G( r3 }
}. ~' d1 B5 x: x4 P
: j+ r' J# D* s
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)5 d; a1 J  C: \0 j; @7 O
. ]  o( l  J# f- G3 U
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。* u. }0 m% [. Y; B( b$ z
3 O3 J/ Q5 S; D- z
基本的 XML 文件
; n% X' B) f* [3 {/ B4 W! `
* i( ~: H! R1 j( ?9 r, i本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
- a; W3 `* P: w; L1 j; `# o% ], ]- a5 G
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。, z6 o: H8 t% X$ }

- {+ e4 p& v, u8 wDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
" R( X* e  x6 K+ |4 G  T$ ^1 U' s8 a' [9 m" d
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
8 q" Z( y+ o; j( }' Y  Y# y- ]: Q8 }. x6 R
<?xml version="1.0" encoding="UTF-8"?>0 N: k2 [* S* p( N' R, a
( k4 a% W9 C5 I  M% `& j
<!DOCTYPE ORDERS SYSTEM "orders.dtd">1 ?# u9 ]1 z& b+ E0 P+ G5 h

  `6 [6 U0 Q4 j<orders>
/ M' g' Q  h* m1 g+ S5 e& `% X5 B) @
   <order>% J0 k- q2 j$ t
9 E+ y- {' y; b3 ]2 q/ w
       <customerid limit="1000">12341</customerid>1 M9 ]3 D& E) j; l5 W
7 k+ f* ?2 \4 w
       <status>pending</status>' z. F+ K5 E, m  u" T0 W5 o
7 M2 O& i4 s! L
       <item instock="Y" itemid="SA15">
; E9 T1 s" o+ I* ]1 q8 V; q1 r
8 d) o2 u$ U* k          <name>Silver Show Saddle, 16 inch</name>
- N+ A( C$ d) |" z0 F5 b5 e! h) n& q1 V7 n) ?& ^9 \9 ~1 `
          <price>825.00</price>
3 @. R  f* M7 ?8 i$ L  q* f
# z+ g7 _  J8 C          <qty>1</qty>
. ^5 }7 ~" s4 m5 G9 x8 y7 A# p7 {# w% x* V6 e$ ?  z
       </item>
* d8 D; T6 i1 J. c: o3 C: `% @% ^% G( C" k& p" i$ p' V
       <item instock="N" itemid="C49">9 t7 A2 P& a5 e, r/ e" M: H

* r* o8 T5 u2 E2 k  ~         <name>;Premium Cinch</name>7 N2 c) r6 F# E5 m: v+ q
. f+ _: e# u% W' {# @1 l$ R
         <price>49.00</price>$ \7 ^: Q+ r8 K3 Y

3 k- G8 s4 d( |7 }- O4 h# L         <qty>1</qty>
# C) g+ i$ o9 v1 ]2 @6 N5 e7 v+ i+ `' H/ Y9 N6 K! C) W
       </item>
0 v+ s4 V5 }& S0 N; e' i5 M5 C7 L5 Q
) H* H+ o3 b- ?0 c" i/ V2 K4 e  </order>
1 b/ E7 F6 F& ~  Y2 h  m7 E( K( l! b) `3 n+ q0 b
<order>: @, F9 B4 ~( A  b& P( x
2 \; f& E$ m1 x  I0 T2 H6 H1 G! _7 ?
   <customerid limit="150">251222</customerid>
1 Q+ y" R& O" ~- b% q/ F8 M
$ e- P- E! T6 h7 U' A   <status>pending</status>, J" Z  g( j3 f3 u+ |

. {( H% z/ c  B4 U   <item instock="Y" itemid="WB78">" B( y" _. T& J+ w
& d, {7 w1 J. J" n6 K% ~/ v9 R+ K1 g
     <name>Winter Blanket (78 inch)</name>
+ v3 u/ O& G4 ^6 J( H
9 D! _: h* V. v; V  P     <price>20</price>' S$ s  {& L- q9 \4 w# }& i, l

9 T" d6 S+ ]) d     <qty>10</qty>
2 z- j( l6 C% f* d3 _' A# F* V6 v5 X1 C
   </item>
; j  h/ S: l# Q1 H' w9 `8 G* \
- N' a4 m6 h! m</order>
. A5 @: G: R7 W& C2 L2 H7 F( M0 h( v* [9 C7 n
</orders>- `* ]; _  z$ R6 }7 c6 V# n
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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