返回列表 发帖

DOM的一些概念

  {7 B6 ^$ M0 Q6 C% ~, x- v5 l% P
开放分类: 互连网、网页制作、web技术
' S9 W% {- k* xDOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscape的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。3 K% t7 P" z* A. e- s

( ?7 e% R$ N$ W! U" n+ i' z) ~DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。* S: i* Y+ L3 w2 Q; W0 e! k2 K
, R; Y7 n9 v" ]3 C( ]  g+ r
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 Simple API for XML(SAX),适用于处理数据流,即随着数据的流动而依次处理数据。基于事件的 API 消除了在内存中构造树的需要,但是却不允许开发人员实际更改原始文档中的数据。' Y( l& e! m  F2 x
SAX等模型会从头至尾的顺序解析整个XML文档,当遇到一个节点的开始或或者结束时,会产生一个时间,程序员可以注册事件处理函数以对各个节点进行处理。
$ y. s1 s$ o) \" G3 n' ~
& X8 A  U5 v1 ?/ r5 K另一方面,DOM 还提供了一个 API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。这个模型就是基于树型数据结构的,他在使用之前必须加载整个文档或者至少是结构良好的文档片段- S% ?9 {! N1 t
" C( h. j4 f0 Q7 J
解析器是一个软件应用程序,设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一颗数据树。
( v4 o- M) r8 @) d" K
# `% k$ f0 A( \  ^' R作为 API 的 DOM
7 `, T$ H- K9 f5 f: f/ `$ U9 z- D% ~" o0 P7 |, p$ O! k" s
从 DOM Level 1 开始,DOM API 包含了一些接口,用于表示可从 XML 文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。
% T3 ~9 y# G, I( R6 |% \: O  h+ F6 R* G- S0 {
Level 1 包括对 XML 1.0 和 HTML 的支持,每个 HTML 元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法,等等。然而,它没有包括对 XML 名称空间(XML Namespace)的支持,XML 名称空间提供分割文档中的信息的能力。
. I# f, M* ?& u- W
1 V6 o' n6 ^# L8 V) Y9 Y+ |' [DOM Level 2 添加了名称空间支持。Level 2 扩展了 Level 1,允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level 2 还增加了几个新的模块,以支持级联样式表、事件和增强的树操作。
/ v0 W  f) J9 \
4 {2 \7 Y6 I/ m' U! l7 [5 O& D) D当前正处于定稿阶段的 DOM Level 3 包括对创建 Document 对象(以前的版本将这个任务留给实现,使得创建通用应用程序很困难)的更好支持、增强的名称空间支持,以及用来处理文档加载和保存、验证以及 XPath 的新模块;XPath 是在 XSL 转换(XSL Transformation)以及其他 XML 技术中用来选择节点的手段。
( J- S- F+ ~* A! B
9 d+ N/ {5 }9 d0 A6 [DOM 的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的 DOM 实现所支持。% _% c) |$ B, V3 x, H
1 n+ F6 f, `# d. [/ N
确定特性可用性( T! Q/ z0 E) H- f( R  Z5 r: P4 N: [
; ?5 K6 E/ q; F1 p7 X! `4 j" y, f
DOM 推荐标准的模块性质允许实现者挑选将要包括到产品中的部分,因而在使用某个特定的特性之前,首先确定该特性是否可用可能是必要的。本教程仅使用 DOM Level 2 Core API,不过在着手您自己的项目时,了解如何能够检测特性是有所帮助的。
+ }  K* n7 S0 b4 y5 @1 O2 o$ I5 f% \9 E1 a7 [; s
DOM 中定义的接口之一就是 DOMImplementation。通过使用 hasFeature() 方法,您可以确定某个特定的特性是否受支持。DOM Level 2 中不存在创建DOMImplementation 的标准方法,不过下面的代码将展示如何使用 hasFeature() 来确定 DOM Level 2 样式表模块在某个 Java 应用程序中是否受支持。- A) R" ?! D1 X6 h+ f: g8 |
; U3 R& d& j+ S% I8 @2 I/ |2 G. f3 A
import javax.xml.parsers.DocumentBuilderFactory;& Y( O9 N# n$ I$ N- Y3 Y+ ~
$ ]% g; o% a9 {0 v% M
import javax.xml.parsers.DocumentBuilder;+ M9 o+ D: w3 d; c0 c
3 S+ F6 j. o( `( I0 E1 ~
import org.w3c.dom.DOMImplementation;0 ~6 x; }4 k3 a# W- [- g

5 k9 u& r' E6 J* D; Y8 J! ]public class ShowDomImpl {  V0 p' d' \! }: k
6 V  v0 ~/ R* b: u' ^+ L
public static void main (String args[]) {" p/ w  y; d6 P4 @% [

- p. c3 s. E# C' Ftry {/ y* c9 G; w% \7 p: r! g
3 e( i. L, h( ]* T; H9 Y7 `: N! J
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
$ k7 B3 s+ g) n' I8 q2 N
+ y# b9 G) W' t. @( HDocumentBuilder docb = dbf.newDocumentBuilder();
# Y2 C- t- n& v2 B5 O/ r+ N& J" v8 R) e3 O  Z; X# P3 Z4 Y! A4 Q
DOMImplementation domImpl = docb.getDOMImplementation();  [6 c# R4 M1 X
- y5 V( f' d$ W2 d* W2 L
if (domImpl.hasFeature("StyleSheets", "2.0")) {7 ?3 i& l( k6 Z) d" X7 }3 O

% L4 S6 G% C9 I! ^# C1 gSystem.out.println("Style Sheets are supported.");
1 W, I6 a% U% _( ]1 e& \, b, T; V$ C! c% s
} else {
7 S% g# A: i# ]# I
' L6 e# _4 y0 k- iSystem.out.println("Style Sheets are not supported.");
7 A" b- b# S, `  [5 m# y. t- y. _6 R$ s2 x+ Z# g: e: p
}
) c8 v/ B/ v( V; j9 x% L' i5 j3 Z8 o5 z
} catch (Exception e) {}# o) h1 u; v$ n( Z8 T$ @

* b1 D- t* j0 U3 F% `% v; Y}7 j1 c5 u/ C3 Q, G

3 e0 v3 }9 b3 N* }}
( B' c8 I3 U) {& s6 A2 H3 C. X0 X/ w: m6 @5 S$ P
(DOM Level 3 将包括用于创建 DOMImplementation 的标准方法。)
: m: D3 E( a7 t1 D/ p
$ a$ j. l& ?! A" {. l本教程将使用单个文档来展示 DOM Level 2 Core API 的对象和方法。
" j1 n) g% p, A8 f3 B
- k' g& |1 I' u基本的 XML 文件
9 y  ~! a0 z7 w% p7 g$ V- C
, v6 R0 P" v+ n( c# p; P本教程中的所有例子都是用了一个包含如下节点的 XML 文件,它表示输入某个商业系统的订单。回顾一下,XML 文件的基本组成部分包括:
$ W5 a! @5 R4 _" c* h5 |, t7 _# Y+ ?. n" L" o. s' e
XML 声明:基本的声明 <?xml version="1.0" encoding="UTF-8"?> 将这个文件定义为 XML 文档。在声明中指定一种字符编码的情况并不鲜见,如下所示。通过这种方式,不管该 XML 文件使用的语言或字符编码是什么,只要解析器理解特定的编码,它就能够正确地读取该 XML 文件。. i, J* E! S7 u. t' z% M

+ A& I! X1 L  Z9 V6 FDOCTYPE 声明:XML 是人机之间交换信息的便利手段,但是要使它能够顺利地工作,必须要有一个公共的词汇表。可选的 DOCTYPE 声明可用于指定一个应该用来与此文件做比较的文档(在本例中为 orders.dtd),以确保不会产生任何混淆或丢失信息(例如,丢失一个 userid 或错误拼写某个元素名称)。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是 XML 所必需的,后面的例子实际上从文档中省略了 DOCTYPE 声明。
- s; P% D9 {- Z( t1 z# ^$ {
9 [/ i) ~& s9 _7 G数据本身:XML 文档中的数据必须包含在单个根元素内,比如下面的 orders 元素。要使 XML 文档得到处理,它必须是格式良好的(well-formed)。/ C! z9 A9 I/ v

6 l! K  c/ `6 B" w0 z6 i<?xml version="1.0" encoding="UTF-8"?>
6 D) z2 J' ]) p8 Z) B# J) V. ]; v/ q4 A0 f$ X. o
<!DOCTYPE ORDERS SYSTEM "orders.dtd">
% x6 p$ W; r% R  d
7 N: K# u/ @4 l/ E. Q' T<orders>( m4 T: M$ _1 ~
+ `0 }6 h8 w) r$ ]" j4 }
   <order>
$ \0 b1 _3 i3 f  S4 f# x# [7 P/ `5 [0 C0 C6 x0 N/ y. K
       <customerid limit="1000">12341</customerid>
3 t8 A6 l" v0 S9 @- e1 E0 s
7 S* ?& x. J/ B2 y" x2 ^6 s       <status>pending</status>$ m- w- P1 @( X/ R5 S  U4 S
2 |# ?9 l+ t& V0 ?
       <item instock="Y" itemid="SA15">& r: s4 R4 h9 n; v7 s4 V/ A
% c! c3 \5 z4 |
          <name>Silver Show Saddle, 16 inch</name>
$ I1 Z1 L/ e: s) @! }  o3 m# @& [' t  P2 S  M, ]0 u* C
          <price>825.00</price>
; x5 a9 _/ c# R+ W0 i- q0 M% S9 ~2 H- e
          <qty>1</qty>
  r0 @9 u, X1 Q3 v
6 Q6 Q: U* f5 W: `% D  Y; G/ y+ k8 t       </item>; X/ ^/ C* c- h5 e$ n

+ n/ ^' P3 v* a: \. H: a       <item instock="N" itemid="C49">
7 ?5 i( p$ |# N; x9 U
5 k" I6 y9 P. M; E4 h         <name>;Premium Cinch</name>
- J! P+ [! J) V0 R6 Y3 b' }
. b3 j5 G9 G6 k) A# d, a         <price>49.00</price>
/ I0 A  t( I' {& @& ?) `- d' P( Y/ O1 U# {" a. w' s( s
         <qty>1</qty>5 F; p( l" n) |4 g2 w1 }
6 f7 k( D( Q, L2 z4 r: y, X5 \# V
       </item>3 F) h3 M1 P, U! n" S! `

7 F* b8 e6 T. F  x  </order># q1 v; H& M1 ?0 [
# Q* ^& q" b. J4 K  u  Y4 h
<order>
; y( B% q7 E* p  H0 @0 b
) I0 w! H' _, _/ U2 g   <customerid limit="150">251222</customerid>3 n: ]  @% R# q! m. b( M. L

" b; ~; b  r) ]# `9 B) `2 ?   <status>pending</status>
9 x1 u) X4 Z6 J7 v
( x2 s7 }0 i' w   <item instock="Y" itemid="WB78">
' M* w  S1 |4 C) S# i1 i( {4 F. T1 z8 `/ M! j
     <name>Winter Blanket (78 inch)</name>
$ X% c% \4 T, y8 L6 U, @0 I' ?
0 \( O+ H( T4 h4 E6 I# U* A     <price>20</price>' \; b3 k  i5 a$ M% R9 b- o

8 k3 _' P, {2 Z3 f     <qty>10</qty>
, w# n$ b8 U- D+ d% _% I0 Q" n+ h1 Q4 e, b7 ]) e: k- [
   </item>; o0 s7 X4 {6 o2 Q: N/ H

* C! ?( v2 W+ i  `, l& A$ z: ^% u2 W</order>7 P5 H+ r- u& [! |0 y0 d& Q3 a
4 Q4 A! E+ ]- z0 Q3 |
</orders>
/ d" ?7 p! N+ @6 c# |在 DOM 中,使用 XML 信息意味着首先将它划分为节点。

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