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

DOM的一些概念


2 q8 ?& w9 P: d开放分类: 互连网、网页制作、web技术
& f' F: l% C5 j7 v' z) hDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。6 P& x( {3 ~" \. f7 r

1 e7 \1 X( @  MDOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
1 ~/ }5 V4 l9 i) K* g6 ]  w1 O9 Z7 f% b. \6 ]. W
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
# A- D+ _6 g3 s: ~1 |1 @+ C! ZSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
( C% @' i2 r9 x$ W9 {3 _/ u2 L0 e+ w; F9 |1 U
另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
# Q7 i- v2 R- ]( l  P
' ~( Q8 w3 G1 T1 ^5 Y. [1 q. t解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。& E1 K$ H. v; M" T% |, I2 Z/ N

" e0 @3 z/ T1 ^$ I" Q( f$ v) |4 T作为 API 的 DOM! Z  H: a, _/ A2 |

7 p+ {8 R# f3 J: ?8 x从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。( F5 t+ e/ `6 A
) Q, j9 k! U9 ~8 F6 f
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。' T/ ]9 `/ C0 l7 j& R  h

/ [& l% \+ _; _DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
' Y% T3 L% K2 V/ s, Z$ x6 \
1 E/ k2 ~& v, [; |9 S2 o8 {当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
: T: L  G- F0 D% |5 M8 e1 |. v3 A- A* J$ L8 k
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
; y  ~1 K" X2 E( s' M6 a+ _( [: S7 }
确定特性可用性' o% {: O- v8 |& m

5 d( ^6 n1 z5 d& X3 S  H" m) r9 \DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
* Q# ^9 T* z9 B2 k' E
  l+ _8 w" j1 o" qDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
$ P( a+ n8 R% S. B, {! `
# @- _% c4 r# P/ K' f" bimport javax.xml.parsers.DocumentBuilderFactory;( p- i4 a( h& L% r3 H

* O5 m1 ~) t0 `  ^" Z( zimport javax.xml.parsers.DocumentBuilder;, r. P# T, R( {7 J
" }6 `8 P! u- _; m; ^2 X
import org.w3c.dom.DOMImplementation;
9 D# z! e+ y. D( t3 A3 n" L3 U* `- N5 c7 T) F
public class ShowDomImpl {+ j6 ~- l) O! d. V

6 R  w7 S" a$ Tpublic static void main (String args[]) {
) G1 m! E3 S' }+ Y0 ]: s( u( I) _8 k
try {
7 r) t; n- k1 S5 {0 U6 ^- Y/ B1 n3 [. t" n8 G
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
6 ~- D: _6 d( X+ Y+ H0 i' b
7 _! @! `7 Q, Y/ L3 }' g# u  U8 LDocumentBuilder docb = dbf.newDocumentBuilder();
, `, Y" ?6 i6 s  `" y2 ]% W
' `4 D3 ?4 q8 @8 ?% Q/ Z: [( YDOMImplementation domImpl = docb.getDOMImplementation();% ~9 K9 q) t: K7 L

1 k- O8 X+ c$ e8 M6 W  u2 a2 m2 Wif (domImpl.hasFeature("StyleSheets", "2.0")) {
6 p0 O1 x' X9 C( }' G4 F# s* Q. L3 V/ x/ h  O  D; C# ]& [
System.out.println("Style Sheets are supported.");4 `: R; m$ M+ C( M3 A, m  P

- p- {" ~+ B( b1 f  Z} else {. p4 t' L3 ~6 [9 t  N- U* h
$ G- P" k# H9 u& w9 S+ I  f
System.out.println("Style Sheets are not supported.");
- M# p5 U, x! `& H+ }. ]. F2 v2 K  D' `# e6 L' j- Q* ]
}4 M1 ?' @! j; E' `8 B' i
$ U% x% y& C) V! c+ E6 i' T( a
} catch (Exception e) {}
  J6 ?- [0 n& l5 h  o/ x# ]' |9 m+ l6 v0 i# B9 W% B3 I
}  s: g+ ]5 j" u, W3 Q5 ^

, \' B& p" H% K  P/ i8 L}/ ]& `& K8 e4 o! U
# C7 o% h! O7 e/ H5 O0 ~/ ~
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
8 L1 C0 Y6 X) v& `7 w5 B
2 T% A! h) q0 Q- D. I: i% @; p本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
1 d7 g1 x- O4 r* W7 P5 n
, \- |9 X' ~7 a; D; b8 o! r% S基本的 XML 文件4 z2 C; ^" w# _2 J- h

# [& [/ }0 y: T4 K本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
/ a& D! A/ n: i8 d1 |8 ^: s
, f; p. `  [* u; k9 d5 sXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。7 o- r  L2 z$ i7 B% g; P

1 a4 o3 G5 L- r% o9 o$ O: L* yDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。  j5 r* [6 \( Y* _" ~. c3 c

3 @# j! N0 q9 @$ |& V数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。
8 R1 o' p7 P  v8 J0 z1 D. L: K' B  Y
<?xml version="1.0" encoding="UTF-8"?>
  x2 k4 f9 q% G4 ]
% W0 `+ d# Z' p& |<!DOCTYPE ORDERS SYSTEM "orders.dtd"># G+ b" a& P& J8 W
- p8 _; C( |7 e* P0 T
<orders>- n9 R1 G0 n# V2 I  I& a! F

% e0 G  P  v5 t! S& {   <order>
7 ?# c6 T2 w+ t; L% n$ n% C) z5 _8 y
       <customerid limit="1000">12341</customerid>
  E! V6 g( x# p# ~
+ Y  Q4 r; l2 C! I$ ^       <status>pending</status>8 n8 a$ @; @8 i) Q

( \% b9 R6 c1 C$ q9 `: m; e5 W       <item instock="Y" itemid="SA15">7 L" n! v4 k( _9 O' e1 y
: y8 m: I/ l: L0 g1 V
          <name>Silver Show Saddle, 16 inch</name>
! t9 z; T. q2 ]8 u& N2 o$ q. H
3 V4 C# [4 j( X3 s4 G1 t. `- G, S          <price>825.00</price>
$ Y1 @7 v6 Z- _( u0 U7 L
: A) f& h0 S  {- N4 E          <qty>1</qty>* M4 C0 _3 _9 O) N' y# g% _

* `6 I, Q  @$ y+ w/ ]       </item>6 w. l1 y  O# |# c. E: x. c
3 {  v  v% S8 l0 h
       <item instock="N" itemid="C49">/ W4 }* E# [, ^: Z/ p. Z; m

. a6 j* p9 ~' u2 H4 e9 U$ U8 W; l' L9 O         <name>;Premium Cinch</name>
% P- _8 m9 S- b  ]: p1 t, e
9 i; \5 w( u/ K: U         <price>49.00</price>
2 F, s+ v# E, n- |" l; K5 z$ D! C; x, h; r, r! P
         <qty>1</qty>' G: F* V4 Q4 K2 q' b9 R, `8 P

; p6 l' g/ B4 Q  F- f2 i" G2 S3 z       </item>7 }6 c( j. ^- H" T

4 ?4 U% C6 t; h# m2 w% c  </order>$ l$ l; T; R8 |
4 s9 x' g. j! p% {* S) P
<order>4 m/ b4 O7 J) r! s! L% V

' ^, g+ v& d9 Y# @   <customerid limit="150">251222</customerid>
2 B8 d8 M$ S/ U+ {) l3 M  [; J+ u
, B- a; ?8 {# i$ D2 P   <status>pending</status>! H) X# [. J- _- T' g, b
8 |0 x: o5 V* I( L6 o
   <item instock="Y" itemid="WB78">
  T9 e- |& o* W# l+ R: i+ N6 |1 r4 _2 @' ]. c% T( X
     <name>Winter Blanket (78 inch)</name>% C* G0 U  t& r, \
6 T: \0 z8 [) c2 v5 i
     <price>20</price>; ^1 c& H9 H0 r* y8 l) I

% Z7 f$ p- O; g" W9 _     <qty>10</qty>. O: `4 r3 n: s; H  c! s
; O( v4 l* b( A; U3 g$ D6 x, l/ Z2 ]
   </item>: u& U3 Q; H; v: y' o& W) z5 ~
* g7 w: K5 U, T' ^
</order>
6 H$ g( N) y$ m' g5 e  d
, F5 g: @3 W1 _: D9 U</orders>! d6 j- N: w$ g
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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