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

DOM的一些概念


! t8 k  e2 J, o4 K" [4 D& P开放分类: 互连网、网页制作、web技术
& y0 E& @$ M1 m9 c9 oDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。$ C' r9 B6 w5 k! ^! H0 E% b
6 J- |* o( T% P% J0 O" u
DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
- s( F# |  Z/ ^( x) ?( V2 x* q0 w* i
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
/ ^4 R) }7 B% Q. Y6 LSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。. y) B! S2 e+ Y' S) x, Q. y$ n" Z

7 x% E1 \3 G0 }8 {/ A) g8 e' ^另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
2 X5 R$ _4 Y5 [1 ^2 I! X* R) Y
' d' s$ }, s3 k3 p解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。9 Y5 d- N: p/ I9 G; M' A6 i
. O2 T7 u2 O% _  P2 G
作为 API 的 DOM5 |0 ]" ^+ F& p$ e+ N

" e+ u$ m- v" `( r* j( I从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
1 _6 E. v6 q2 M5 E+ B' s
: b- l: L/ U; Q  N" i' t- \Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
8 P- g4 z3 c/ |& u' d5 ]$ P4 W" ^- a0 {4 Y, A7 o
DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。% ^/ m( A8 [/ r/ \+ o; u+ U- I
8 H0 U2 s' |* g6 s; N! b
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。- ]- L6 n) h9 h" H: m2 V: ~

: L( ~1 g/ u, O, Z) g" t. k0 QDOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
9 l- ~1 `5 \# K% l' w8 {
: l  N8 @2 Y- u确定特性可用性' p8 U/ n+ o- ^8 l+ I

& G: c# j2 }0 ^/ W3 K$ {8 \DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。" j& \5 |, t& N, D+ \5 p! e. C, X8 b

3 d9 p4 U1 Z: M# |( cDOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
) T' _( w) N# P- E& Q  }% a5 q
; x& b# f  c. }import javax.xml.parsers.DocumentBuilderFactory;
/ _6 c* V& z0 z5 Q
" \' R6 Z' O4 L* r6 {$ Wimport javax.xml.parsers.DocumentBuilder;2 B' d6 J! m  T9 h/ H

; k, C3 I) c- [# Nimport org.w3c.dom.DOMImplementation;" D. }$ O3 B: ?( i1 M1 G9 p0 u

0 b$ S8 x8 T% Z! j2 {6 p, epublic class ShowDomImpl {
1 a2 x8 M6 S: ]) u' d0 o- Q; D: s& e3 C- K9 b, @
public static void main (String args[]) {- ~7 \5 u+ R/ G( U& E, T  Z$ G8 o
/ ^( I5 x, Q9 o7 ^* Q( p! G
try {
; R" J$ z2 [3 s" n
% Y) v, [9 P* ]* O, |2 xDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();' `' z  V( h) |
) \6 I2 d& R: f+ E$ q9 v2 H4 Y' N
DocumentBuilder docb = dbf.newDocumentBuilder();
+ a! x2 H. o0 C+ \! j4 j. b! j$ f" ^1 |7 s
DOMImplementation domImpl = docb.getDOMImplementation();
" D6 z2 ^  V$ R) {! t4 X* u5 d& S7 j7 ~8 F* Z  w6 `3 a! e
if (domImpl.hasFeature("StyleSheets", "2.0")) {
; L) Q2 u3 i3 A
- K( q5 q1 X% Z9 U7 xSystem.out.println("Style Sheets are supported.");) e$ G) b5 M4 u! x: d* W" ~
$ ^! b. e8 }* a: X! k# |. [/ K
} else {
% \8 k0 `" H1 \+ J/ X) A& K* f' u' ^4 I* N7 V
System.out.println("Style Sheets are not supported.");$ n  Y" `; H6 u  `' W& G

; A" r1 {5 M* i1 v4 Y}
# W/ u7 g. f2 g" ?( o: z; F% B0 b- y8 a5 p
} catch (Exception e) {}
; l' [6 a- i9 `$ d1 J/ q1 j7 W3 o4 }6 r8 I
}
/ Q9 K, r; u4 Q. r
* o# |! |) u$ c% t/ a. p}+ G% y" r, o. l& o. u$ Y3 n

2 ^" F1 Z' Q2 {(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
# t4 p4 f9 o# u; W( P  j' ?: w4 A, O5 c1 H9 M6 K( I$ n
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
. a5 @% v) n+ S
# I4 L2 Z( k! ^$ i8 n基本的 XML 文件
+ M+ D! l3 Y' f6 U+ L) m
4 k$ b5 j3 k2 R+ b" ]0 |本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:* o- |8 L: u% s2 I
4 o4 [3 E1 O# o% ]. J, }0 A
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
. X- y* m+ y: s; X/ ]1 h) e' \' g, Y7 m2 T* P+ b7 b# X
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
/ i6 d7 @! z' m! _: c9 R* p7 N: q( u
数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。$ O. S/ M3 l2 @& f# C# ?
" q: {* e4 t, E/ o; r' H( E
<?xml version="1.0" encoding="UTF-8"?>
8 p* Z' D' S: V0 g; K7 @% X
8 ]! |- m9 q# @0 k9 l' n! a/ N7 ^<!DOCTYPE ORDERS SYSTEM "orders.dtd">0 [3 }- b$ U7 G! q3 E1 f
0 w4 S7 E& g( A4 P# H
<orders>
1 g, O$ [( Z" E$ D! n( D( R' K  o
. `4 _0 Q/ m% y9 z" l5 E7 ?   <order>+ K0 H, N7 z8 \5 J2 n& N9 y# ^

7 \5 L. X. A7 z# j0 @8 I       <customerid limit="1000">12341</customerid>9 d# P" ]% N# [' i8 {& ?

, }; t& B  w, |' g3 g/ J( Z6 U( t  T       <status>pending</status>
7 w' C; b7 w; r3 q& q! Y
" Q5 ~- d- P& R; |! e/ Q8 Y, R       <item instock="Y" itemid="SA15">
5 \$ k( i7 R. Z$ P
" y) C8 @. u( M6 u          <name>Silver Show Saddle, 16 inch</name>
1 r$ D8 O( ]' v( c- L6 Q1 p- Q2 Q0 t( N0 t' d, @5 S* M6 E
          <price>825.00</price># A/ |3 P6 Z* k. _& g, P/ a5 M9 S
/ X% M/ P  {' o
          <qty>1</qty>3 C4 c' d' g3 H4 K; l8 V/ \

& h; J4 A0 \/ d9 k/ R7 f0 O       </item>
5 Y+ ?2 o- E: m# c
1 D& Y3 ?4 X2 S3 B/ E* T" I       <item instock="N" itemid="C49">
0 X; v5 k9 [9 O3 N) t2 O4 k& S, z  A- `" f+ ]/ r! I$ p
         <name>;Premium Cinch</name>
0 D8 W* c6 v0 |
8 d3 G" G- z8 M         <price>49.00</price>. a2 k' l' e. w* L4 c
' K9 d) F8 c* j
         <qty>1</qty>
; ~0 x* v! `. y' u5 {! n/ ?# E$ y5 M0 ?! n0 n
       </item>; |7 J! o7 X" O* N+ |4 q
0 o: e) e; w. M( o7 D8 X
  </order>$ E, O( I  v  A
0 q9 n" q' S% ]6 X8 ~
<order>, F8 F1 ~" U7 @" H* L
' d3 A. Z- M; ^% ^& r$ g/ [" i
   <customerid limit="150">251222</customerid>
  y1 Z1 `1 {! A$ r  |9 A
2 J3 K, b* T  I" I3 ^& b' Q  K$ C   <status>pending</status>
0 m; D$ v' O* D0 ?4 D
" n' i( c5 u* `7 o   <item instock="Y" itemid="WB78">2 v2 Y" V/ h7 t
: ^  A8 D  N! S! G
     <name>Winter Blanket (78 inch)</name>
5 ?! }! P0 S; I% G
" m2 E  S* t* _$ N9 W% S# _     <price>20</price>2 b4 o  ]& \$ P- J
" }2 M) L/ s2 }) X
     <qty>10</qty>! i1 J- f. @9 s' [, L1 T: u1 a
. w, W; _# E  V
   </item>
' V4 }. ]/ Y& B: j2 V
. L; {+ H0 m, y- C</order>. y( C, `- a7 |- k

( z( b) [7 n5 Y6 |, d6 o) Y/ B" s</orders>
- s2 k1 Z0 J+ d在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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