返回列表 发帖

DOM的一些概念


* P# @3 f* W1 y0 K1 n& i4 Y( \开放分类: 互连网、网页制作、web技术
: \5 ?) B0 a: X  @DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。& s" K5 O2 n: b8 D" s% q

5 O9 M0 @& x  R5 [DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。9 ^1 g9 {6 N6 I3 k$ V

+ O2 k6 p' ?, Z' y# ~& J对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。
3 {/ ~: A" t' e# xSAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
0 ~0 @- t. R/ l+ c
5 u6 H6 y, n2 C( S  k# H) Z另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段. o* j/ ]0 H2 v% i. {0 q  R
" {- }) |/ O) r8 W
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
# o6 f: J1 A! k
* A% k% u* y- G% \作为 API 的 DOM) Y' X2 m2 p0 X: N, z; w
. @1 q5 |/ Y8 T& u& }4 g- e& s  ?5 e8 \
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。! J! k2 Q$ S, ]

/ O) l1 L/ w3 H' ]% t* ~* W+ yLevel 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。; D- x3 L$ R* `/ U4 j/ m

" |' r: y0 m/ C5 q* eDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。$ P, U# ~; O" q( J+ ?# p
8 i- W& k6 c9 P8 W9 O
当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
8 Y* p% p3 n* p  f& a" ~# g; j0 `. P( b% u6 @' Z8 C: Q
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。8 T" b4 X; i! ^" n, ]

% y& \4 T" c: {, v0 A+ m6 `/ s8 U- o确定特性可用性
4 b0 t: f, ~: ?
( g# g/ z2 t& O# jDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
8 P5 S# |; K+ c( ^4 {/ g/ n9 L# v' w2 C7 p  y8 F9 G
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
6 V7 g0 k+ n5 ^' L5 w
( Z5 {; t( G) z9 a( y0 N# t$ cimport javax.xml.parsers.DocumentBuilderFactory;2 _  A! q7 J8 `8 @# {( |
" r0 N% s  i$ W/ x. ?; x2 `# X2 O  s
import javax.xml.parsers.DocumentBuilder;
# E* C0 w1 i! m. k
  R( x* g$ m. l. Y9 W+ Aimport org.w3c.dom.DOMImplementation;
; L# Q4 I: j/ `  b- j9 f* K2 G9 J) g8 z8 |
public class ShowDomImpl {7 j- F7 j1 D$ u% S
" r- D& Q$ t, _1 T4 c3 p
public static void main (String args[]) {8 {" g0 d" \( ]5 O* K: Z
$ x/ L7 @9 i/ N7 c3 Z0 a, s
try {
8 _) ]0 t6 x7 m" v* t, l
% }* [% i4 w) o3 N7 cDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();+ P$ s( K2 E5 x! Z* ~

: V. ^0 J5 l5 Y- c. [: w/ X; q  ?DocumentBuilder docb = dbf.newDocumentBuilder();
7 Y4 t8 `- U' l- B7 a& P/ y3 `1 t
DOMImplementation domImpl = docb.getDOMImplementation();/ Z& ]2 c0 }  r, \% t
+ {* l. U8 O3 u4 ^
if (domImpl.hasFeature("StyleSheets", "2.0")) {! _+ `3 W3 e* X1 U7 D
. O% r8 l! k; L& {) A
System.out.println("Style Sheets are supported.");
/ o3 J6 u" k: ^
- n% c& w/ }$ `8 x} else {, U( J3 e. M6 b4 Y
8 u- \! A' F: G! B
System.out.println("Style Sheets are not supported.");7 N% Z7 Q7 s+ N3 z& p, k4 F" u3 R$ I
/ [) F7 A2 g" l3 `' z% @
}
6 u: j4 }* n& W! p' @/ T! k7 a2 J! T, V& q
} catch (Exception e) {}0 P+ _+ ~7 D! j
# w. f4 m- a5 R1 ~. x! ^- R$ {
}: J" E3 M0 w; ~6 l( \" _( K+ s" e3 E) i% o
0 X; g7 G6 O# ~( P+ P5 [
}! H4 t6 h8 q' ^3 H2 V+ P

; p. H! G! u1 t8 a. n2 l4 f+ A(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
' J1 _+ Y$ ~! m- R$ e8 j
- s' j" m5 \# O9 X+ [1 J本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。' p% f: C7 s/ }% X1 Q6 H

7 k5 r8 ?* D! m+ @8 E基本的 XML 文件
& z4 P7 f$ i( P8 O/ `  K: S9 g4 K5 ^; M
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
' }8 n2 x4 D3 q4 ^) w
: ^% C2 m4 S+ Z3 d- i) B* D5 pXML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。5 `: ~9 W6 g+ c- b
, L" A9 w( W$ R- p9 z
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
' }* v- E6 Z. z! U3 k
  X) E7 @/ R& b' a: Q1 A数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。6 T2 T. t' M0 H9 {, ~5 B6 |8 g7 Z3 }' h

$ }( r. K5 I2 k( ?5 k<?xml version="1.0" encoding="UTF-8"?>
" |$ U9 D" R* I6 l7 Y1 T& P
0 s# K. x5 S3 A<!DOCTYPE ORDERS SYSTEM "orders.dtd">' X/ i5 m" a+ T6 w  D$ h" `
6 `. T1 d0 m* t2 R9 }9 g0 `
<orders>6 u( C5 Q+ m6 @# Z8 u
- K$ W7 I, Y6 {) e% W( ~' Q
   <order>0 c# ?: q  q7 `2 @& a; }% r# [

" ?' h5 v0 @6 B2 [/ J: S/ v) C       <customerid limit="1000">12341</customerid>+ m2 H7 E7 d+ g. R
$ i3 L% U% Q. A  v3 q2 D
       <status>pending</status>
0 _4 ]2 }  v1 g  E$ t) ]) M) a. p6 `& L
       <item instock="Y" itemid="SA15">
6 @' e2 r2 ~  m% G0 @/ B+ ~* }, o& j* j* ?% s
          <name>Silver Show Saddle, 16 inch</name>3 W  x) J: Z0 E& T- C- `1 O

3 M8 Z4 A9 u0 q" n2 R- x          <price>825.00</price>
+ _9 H$ I! z: t+ E. ]' N& v0 `- R* B* B$ c" G
          <qty>1</qty>
4 I/ ?$ J4 d% R! y3 x0 J' [3 c1 S, w; I+ `/ t9 G# q
       </item>
" r5 O9 ?; X3 O" l! t7 D5 a* u9 u
       <item instock="N" itemid="C49">3 M% V/ q2 S5 A

0 [* l' N: h! y9 v, h% c3 X         <name>;Premium Cinch</name>
4 }2 j9 E5 C4 S3 a. R, k( I( i
5 W3 u! i; }2 u# t7 R* G0 R7 q         <price>49.00</price>" @/ M' z& F: ?
: y8 V; t% m# n. ?, l, P
         <qty>1</qty>  j) C+ t* b7 B- ~
+ O$ d9 w; r% q6 u$ @
       </item>
3 N1 d9 w- ]0 f  `! v4 D2 N0 b9 ^+ q0 U# Q
  </order>* M' S% C$ ?" F0 U7 k
! K1 i+ n2 d! \( |( I, y
<order>& N* V* l) {" o7 u9 K

9 F& w8 n/ E0 {# G, G   <customerid limit="150">251222</customerid>( F; y- P  V: U: l( x* ]' \% K

5 M% C$ ?# v% H+ C7 ?, h   <status>pending</status>
% o2 v  p3 u2 A0 Q( G) V+ X
2 ?, s" X6 O$ X! R   <item instock="Y" itemid="WB78">
: O: N# c( ~2 O% G+ w4 L3 n& }# l5 H( S/ J
     <name>Winter Blanket (78 inch)</name>
9 w' U. Y; H* L: x
* }9 Q; b( N# Q$ ^( y3 H     <price>20</price>
; S) i( ?- ^! V5 e
' l$ Y' k+ B9 I/ |, \     <qty>10</qty>
5 l3 D- }6 h3 z
( q& J( v  A) K   </item>
* n5 ?, ~  X* Y/ Q9 w0 f% X3 d# S& e3 ~3 A# a1 f* F8 f
</order>
" n- G2 d7 G: l: s  t/ W- \1 I; D- n9 \: C, X
</orders>2 M+ R% n1 U2 d# f' v
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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