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

DOM的一些概念

: W% [+ s# o% `5 w5 ]; D1 R
开放分类: 互连网、网页制作、web技术
# {0 u4 `. T& E* |, [' GDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。: v) U/ ]' r( F  J6 U; t

- J: Y" Q4 {. r$ \DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。. d0 \) Y9 L+ B2 s

5 _: o2 ?  w0 q" i0 i( V8 w$ c对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。6 H  w3 H) n; K- [7 E9 K
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
) G+ X6 B9 }0 Z
7 ~  \; A( W- W另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段
+ T5 o* q3 \6 D4 t. b, P$ C% D8 _
# S. r! H" q) a1 o- r- |; |解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
  t+ k# V" a9 N' n3 u) q7 C$ \% U4 ~7 h# @  s
作为 API 的 DOM
8 P$ D# e4 \8 N7 Q+ Z# ~" x4 Z& N( Z
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。  u) z4 u) M6 F8 P  o! W
9 J; m# P" f  d5 p
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
  \% g- b" s' @4 l
0 ?& C: H, f. Z: e6 {. A' lDOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。3 s% v+ ^: H) ~& ^1 ~

* d- x& A" P6 `8 T' K当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。. U/ |9 \8 d+ w# L2 U
! l+ h" s; V0 z2 b& d
DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。
, \$ f) E; \" Y+ Z2 d: e) Y
0 x: a8 w. Z, E确定特性可用性
' n% p7 @9 R- v& [
; s, d3 C/ Z: [8 m1 D; C# V+ WDOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。5 Q9 A6 e" F7 o; }
3 j7 z8 W. {! ~1 Z# J* N5 S
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。
/ M- ^+ a4 Y& c* F
9 Q! Z* e3 g: u: X+ a8 R7 V% Bimport javax.xml.parsers.DocumentBuilderFactory;
, u4 X7 r& Y% `+ q0 Q5 G* p, f- r' \9 J9 S; D% U
import javax.xml.parsers.DocumentBuilder;
$ q. [/ E6 p* c+ y6 n" h
$ t1 n3 G3 V; @( @5 A( ^! S- F7 @import org.w3c.dom.DOMImplementation;
$ M  J8 Z+ p  a* `$ `( V# u0 N
6 m% {; w; D6 I( wpublic class ShowDomImpl {) E, h+ E' ]. n4 P1 a0 A
% U$ v  A8 B, E# n8 m$ `
public static void main (String args[]) {
( @, y. B$ v, _/ P0 R% i4 J! H
try {7 I  ^6 Q% H1 H

( ?9 S3 S2 b  P# L2 o" E2 p8 [DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
$ w2 H7 q1 g2 D+ l7 x1 p& Q9 }6 Y7 f
DocumentBuilder docb = dbf.newDocumentBuilder();  N: _9 i, _0 Z( F5 F
/ \( b6 |% ?, f' v- r
DOMImplementation domImpl = docb.getDOMImplementation();
" R4 N8 j" X8 T3 E- Q* c
, r3 u! o2 N6 H% b5 M6 e" \% yif (domImpl.hasFeature("StyleSheets", "2.0")) {
( S' v! J4 H0 u1 p% B4 E8 ]: W3 X$ F$ T) u* w' i
System.out.println("Style Sheets are supported.");8 h2 [+ S2 `8 W+ e5 c

- G3 z* U7 Q1 x8 ~} else {! @* y7 s# S* D  @6 m& ?7 Z

# h: k1 ?4 w8 x; S9 ]System.out.println("Style Sheets are not supported.");7 j- Z" d9 B% ?( @* A: k6 Y9 H
; c- l3 f8 F* k# ], I
}& F! u: j/ ?' _8 K

' {5 C! e# t% ?. o} catch (Exception e) {}
( }- r5 _. Z* B3 Y0 N( g
3 s: a8 E- F4 y" _}; }6 g; j8 D  W9 F+ f0 D7 [& N

% {' j( @  [7 i+ X; Z' R}" u% e1 {6 v' O
6 V: B9 D( w& N6 j
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)$ y" v, w2 A4 L% ]2 L! @/ n2 A8 O
6 Y3 _, \3 |6 O" U& t8 A2 |1 c, H% F
本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。& Z; N2 n% |" t$ M
- }# H- ]& t: d# _" {
基本的 XML 文件
1 E0 [5 ]+ n# m1 q: a" k2 N1 _- G, o$ T& o
本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:5 M) Y" L- X# K2 m5 H" {5 l% \
5 u' T: g# n- S: U8 T7 q" t
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。
- J5 z; o7 q% V$ i2 Z: u0 h* z7 X7 j1 q: B. C2 [
DOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
1 N1 j2 F$ l6 e3 p# S7 B5 f
' b7 a1 k- Z6 x数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。% Z* _0 U" }3 [5 `

$ j& L3 E. s, S2 y1 K& n<?xml version="1.0" encoding="UTF-8"?>+ K1 j: a2 y$ T0 s2 t: J- i; O
3 A' d+ f; W3 D- z
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
, w1 }$ v# n0 l9 ?7 Y$ v' N" U* L1 ^/ p
<orders>
, D. I) Q: p$ S  Q1 I
) u- A3 s: ^# b' ^4 R2 E: E) e1 P   <order>
( x2 ]$ W# Y1 A8 l" [& `
. z% ]: r$ n- y' @. Y" ]       <customerid limit="1000">12341</customerid>  ], c- {6 W; c
" T  [) u/ m7 Y1 C/ w/ K0 |
       <status>pending</status>
; E; @4 ]1 S! W4 X% t
# V% E% S. B3 D1 p8 w       <item instock="Y" itemid="SA15">, P2 Q8 n, w. x
) G( `& T4 ^. {- k) b0 g* o$ ^
          <name>Silver Show Saddle, 16 inch</name>4 ?* \# k3 W5 [% c' ]6 o
3 z! L$ u0 J: K4 T6 ~! T/ |! {
          <price>825.00</price>
" d8 Z3 H7 g' K- C8 D# G: O  T3 w' L/ z
          <qty>1</qty>
7 l; G- }% [" Q) a' d7 o  q/ r6 ]5 X( s
       </item>
7 m/ C- w; k4 R4 I& N8 ~
& Z2 H8 b" v! t, o9 C5 `       <item instock="N" itemid="C49">/ H& @, u4 X; I: d2 U  j5 f

' a* d3 ~. `; y- |         <name>;Premium Cinch</name>5 n1 s7 j  q$ r6 H4 @3 f& G) T
' r8 Y5 `! M  W* x6 s9 t; t" F4 }
         <price>49.00</price>
# O) n" R0 w. E# g' I
- d% w5 o& r9 L; m& L! z$ q3 I         <qty>1</qty>' _5 p9 x5 r6 [2 Z. M5 Q

2 w, ?4 }  G, I& _- w) }; @       </item>% x# S+ [' {/ a% {0 m3 I6 N% r

& G9 A$ a2 K) s8 ^" G3 S  </order>  p$ \& U/ m) v0 l( B* \
0 C9 u: O' ~. y5 o2 v& y, t
<order>0 Q- t0 [" ]/ P% S0 j
; z4 k; y8 C1 N1 i4 c
   <customerid limit="150">251222</customerid>/ x5 j* X6 u  e& a; U# ?
1 A6 e9 N! k/ q4 E
   <status>pending</status>$ e! c$ P& O# ?0 g

+ p0 M+ Q* J$ m1 f  T& v   <item instock="Y" itemid="WB78">3 |" v/ n! q$ w( V! j" e; ^
# Q2 E+ p+ v3 H" L" D
     <name>Winter Blanket (78 inch)</name>$ E2 A* ~* H7 h) l' o. y" ?+ j
& D, y- P. E  g1 n5 {+ n# s
     <price>20</price>
, w* Z5 L' p5 O) J. u
! g; G8 p' M, g+ M     <qty>10</qty>
5 h  g6 m8 F" M4 ~4 R* a- S; @; f# W( O5 O. q& U
   </item>5 g; G" \3 t5 M; `) {2 {5 \

3 z/ Y* _2 [$ K5 x7 x5 D</order>
  [5 D$ x( I. ]6 C* Y# K+ T2 ^2 `  R
</orders>  r. D) k7 A, w1 @' K
在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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