- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
1.0 简介 6 ~6 U/ ^8 I/ J: R( T. H
2.0 为什么使用数据库?
Z- @( r* i: m6 ?; c3 H4 r5 f3 v3.0 数据和文档的对比
3 V& O3 q1 H: t( f- W2 g# U 3.1 以数据为主的文件
. q9 @! |7 g" a, S d# L 3.2 以文档为主的文件 $ r$ P. p& ?' }. n
3.3 数据(Data)、文件(Documents)和数据库(Databases)
; k1 ~6 L5 k# P) t, n3 z# B" V& r4.0 存储和获取数据
# B3 A- v F, A 4.1 传输数据
) `9 d, Y3 c4 e" J: ^% |% x5 z7 E 4.2 将文档结构映射成数据库结构
" x7 Y( e' W. B- X7 b4 n! e 4.2.1 以模板驱动的映射 # ]! a( a& q2 a! C, u. m
4.2.2 以样式驱动的映射 0 C6 d% K2 p a* o$ \5 a: B$ w% `6 W
4.3 数据类型, 空值(Null), 字符集设置和其他所有的类似集 2 k( }, p: p8 I5 k
4.3.1 数据类型
$ Y! z3 t, H+ ]* z$ `8 _ ^ 4.3.2 二进制数据
: W6 o9 O: U! }* o 4.3.3 空值(Null) " {7 g! F# t9 @1 w
4.3.4 字符集设置 " f1 ^$ y) N2 [
4.3.5 处理指令(Processing Instructions)
7 c2 x9 w8 g. x# h 4.3.6 存储(Storing Markup) * r; q2 @1 D! R1 @% ~; l5 z% q
4.4 从数据库的结构生成DTDs和逆反过程 ' L# D' ?: ?! u
5.0 存储和获取文件(Documents)
/ Q) V. ~# a$ H U* z 5.1 管理内容系统和关系数据库 ; a8 `3 Z/ Y; Y$ G' D0 b$ S
6.0 可利用的软件 ; G! @, E, `) [
6.1 中间件 ! h6 D f0 \2 C# n
6.2 XML服务器 3 L( i, A+ x/ N2 M% e, O9 c/ R
6.3 内容管理系统(Content Management Systems) 1 J) v7 g* z* S [
7.0 附加联接
5 \ S P# {: r1 F$ ^2 f- s% ?6 l% x8.0 注释和反馈 ! x' y. Y: d. Q: R3 |
-----------------------------------------------------------------------
% S) \1 U9 n5 G* V! t1.0 简介
) _# Z& P7 h& t8 ` 本论文简要的探讨了XML和数据库之间的关系,同时罗列出一些可以使用数据库处理XML文档的软件工具。虽然在这里不可能详尽地介绍和提供对这些软件更深层次的评价,但是我希望它能够描述使用数据库处理XML文档中的主要部分。这里有点偏向与关系数据库,因为我的经验如此。
) I$ w( R; v/ t- v0 K6 q P& l+ \! O
2.0 为什么使用数据库?
# A& T4 D8 ]( q* S( C; M 当你考虑到要使用XML和数据库时的第一个要问你自己的问题应该是:为什么我需要使用数据库。你是需要显示数据?你是需要一个保存你主页的空间?数据库在电子商务运用程序中时把XML当做数据传输格式传送吗?这些问题的答案都将直接影响到你对数据库和中间件(如果使用了的话)的选择。 举例说明,假设你是把XML做为一种数据传输9 T4 f, P9 X9 Y% Q: X% z/ C3 c
格式使用在你的电子商务运用程序中。
3 G) o9 Q- Y/ X2 Z. |那么意味着你需要传输的数据格式将主要是具有高度规范结构,那么在XML中的那些自己的编码规范对你而言并不重要了,这样你的兴趣就仅仅是在数据上而不是在这些数据如何物理存储在文 档中了。如果你的运用程序关系简单,那么一个关系数据库和数据传输中间件将能够满足你的需求;如果关系庞大和复杂,那么你就需要一个完全支持XML的开发环境了。
* O' X9 X1 t u, W7 X* J+ ^ 从另一方面来说,假设你是要实现从杂散的XML文件中创建一个网站的功能。你不仅需要管理这个网站,你还要提供给用户查询其中内容的功能。这时你的文件的格式将是高度 ! m, {+ K' e$ S+ t7 W. w* _% b
的不规范,而实体的使用对你来说变得很重要,因为这些文件的结构是网站的基本功能需求。
5 v, r/ v5 @8 ~0 S4 R b4 P在这个例子中,你就需要一些"native XML"数据库而不是普通的关系数据库,执行解释
, c2 i# H T6 \6 x; \3 ^7 @2 n、XML实体使用和支持查询语言(例如XQL)。 $ }. K; k- Q# t# q* d" m( l
/ x& ]3 t7 ]7 X3 h T/ |
5 ~5 h* p* O9 k* F) ~3.0 数据和文档的对比 . J! W+ J4 K. \$ z
也许在大多数情况下,判断是否采用数据库的最重要的因素是你使用数据库是用来
( b0 j! U8 C4 L& t1 O6 k保存数据呢还是保存文件。如果你想保存数据, 你需要的数据库则主要是面向数据存储的,例如一
5 x7 B' `/ c# C% {0 c: b5 f. q9 C个关系数据库或则一个面向对象的数据库,或则也可以是一个在数据库和XML文档之间传递数据的
; k5 B( k3 O! M# \& N中间件。从另一个角度来说,如果你想存储文件,你需要一个专门设计用来存储文件的内容管理 8 r' \2 ^; w0 J9 W: b; `6 r" e# s& v& p
系统。虽然可以把文件保存在关系数据库或则面向对象的数据库中,但你会发现你的工作 4 P# \8 c6 U: k. X
经常是在重复实现一个内容管理系统中的功能而已。简单说,虽然一个内容管理系统通常是建立
# c3 R4 k" m D7 ^6 p在一个面向对象数据库或则关系数据库的顶层,但是如果只是把一个内容管理系统当做数据库
7 _4 z; g; h2 d来使用被证明是失败的。
8 {& y; E% N$ m 你是否需要存储数据或则文件经常取决与你的XML文件。原因是XML文件分为两类:
$ v# F( C' f! g3 ^2 Y数据为主和文档为主。
# n ^7 |6 O! j* ] H% n4 ~3 c' t, W4 c1 p& y* H' J( Y
3.1 数据为主的文件
; U( K( @& z! S 数据为主的文件表现出来的特点是结构相当规范,数据格式良好(就是说,数据中 - @" b/ U" J& j5 H8 o
最小的独立单元是PCDATA-only元素级别或则是一个属性),和一些或则没有混合内容。其中同
3 g4 f) e1 X! H6 z6 M类型元素和PCDATA的出现顺序并不重要。例如XML文件内容是销售单、飞行计划、餐馆菜单等等。 % W0 d8 D: }( ?* d% {. s! |
数据为主的文件经常被用来设计机器消费,这时XML的调用是多余的---它仅仅是一种数
; f$ R1 w$ k4 n! _( L6 q6 {6 Z据传输。
7 S9 f% D& F8 I* x 例如,下面的销售单就是一个数据为主的文档: , ^2 J# `' Y/ D0 X
<Orders> 2 I0 k% s0 j, c5 n, O* \
<SalesOrder SONumber="12345"> ( O2 z; K( l- h3 {+ {, r" \
<Customer CustNumber="543"> ! g( K8 y! A! D& q* @0 m
<CustName>ABC Industries</CustName> 5 _3 \5 o" ~9 Z% z8 @8 |4 b) K
<Street>123 Main St.</Street>
+ B" L2 n* L E/ ^4 ^. e3 j$ Y7 v$ q <City>Chicago</City>
9 `4 n6 Q8 h) |- r, F: r <State>IL</State> + ]8 R* Y/ h& a
<PostCode>60609</PostCode>
, ^/ l+ u k# z7 O5 A8 U </Customer> . S; z" W, w) Y+ G
<OrderDate>981215</OrderDate>
" X% ]1 P" T) ?) F$ t <Line LineNumber="1">
7 N; H/ t5 ^' `7 `' Q* h <Part PartNumber="123">
! W; E& R3 x% S, g3 ~ <Description> : |; O8 k' l) K* T8 a O* z% q
<p>Turkey wrench:<br /> ! L2 b, k; S1 Z$ q+ G
Stainless steel, one-piece construction, 1 S; E$ _# C _2 z: H
lifetime guarantee.</p> : c! K5 V; e( E' T( v
</Description> 6 v5 }: H& O5 _3 b3 m
<Price>9.95</Price>
8 d+ Y5 D: Z v2 d- C </Part>
5 o1 M3 _; c0 F J9 X <Quantity>10</Quantity> 2 F; o6 M* O8 W0 ]+ c% U3 `, K3 D
</Line> ) x! Q6 [+ M- ]9 B2 \- k9 |
<Line LineNumber="2"> + m) z4 z- z! x* n! N* Q3 d
<Part PartNumber="456">
7 b* w" [# Y. o" b7 V X <Description>
. a7 J1 T5 H6 n1 R <p>Stuffing separator:<br />
# \. j# w9 z J$ ~* } Aluminum, one-year guarantee.</p> 8 n! v+ i6 F* c
</Description> 4 Y/ z: l- n& y+ l1 g. x& F
<Price>13.27</Price>
* f) ?; B0 x4 }5 U- J- g </Part>
" z" I$ V* r5 X, n; | <Quantity>5</Quantity>
' s: Y1 J9 y- U+ z. \! F- f </Line>
5 C$ B, r6 G. d7 V# l </SalesOrder> ! |: J4 [8 I! ]7 d; g; y# n$ s) Q
</Orders> : I% x% s0 P. J! O) r1 V
注意在XML世界中,许多(其实应该是大量)的文件实际上都是数据为主的。例如,
4 d- ], o! j- |考虑在Amazon.com网站上显示一本书的各种信息的页面,虽然这个页面是一个相当巨大的文 - d" V- d% O# c# |
本,但是这个文本的结构是高度规范的,所有页面都包含有介绍书的共同点,并且每一页中文本
0 `- o' h/ \, _/ m9 [, d2 Z的大小是受限制的。也就是说,它可以从一个简单的、数据为主的XML文档 + 包含有每一页信息
8 c* r! H9 P0 S的数据库+ XSL样板文件 就能够实现这个网站的结构了。通常,目前任何一个动态建立HTML的网
1 u- t1 M# O; p! d4 T$ \- i, ?8 l站都可以被上面介绍的这种结构来实现的。
5 C; ?# j' x: n" h) H 下面是一个很简单的例子: 8 T1 D: c [: @5 U9 z3 @1 G9 A# w
<Lease> , ~6 F$ d6 |$ H1 G/ i
<Lessee>ABC Industries</Lessee> agrees to lease the property at , y. \* h( m/ G3 _$ B* c0 r
<Address>123 Main St., Chicago, IL</Address> from <Lessor>XYZ / C" `+ F% }' `6 s1 ?
Properties</Lessor> for a term of not less than <LeaseTerm R8 W9 X3 `' e9 d3 y
TimeUnit="Months">18</LeaseTerm> at a cost of <Price
" ^5 k) x% N8 k6 Q7 h+ s3 q& U# o7 OCurrency="USD" TimeUnit="Months">1000</Price>. ) v$ |0 J, ~6 j3 Q/ O! [
</Lease> , z8 m# N; `; p: e1 M
它是使用下面的这个XML文档和一个简单的样板文件实现的:
6 V3 v3 R( V8 b8 U <Lease> 5 L8 H$ M( Z7 k0 ? x* p
<Lessee>ABC Industries</Lessee>
1 K3 b4 U. V/ o0 e8 m <Address>123 Main St., Chicago, IL</Address>
# J# L2 ^) V- x0 N# V3 d <Lessor>XYZ Properties</Lessor> 4 R, Y+ I: ^9 L `6 |
<LeaseTerm TimeUnit="Months">18</LeaseTerm> 9 m' k+ A3 M H. N$ }) z K/ g( n" v
<Price Currency="USD" TimeUnit="Months">1000</Price> 6 j8 s1 V' ] a, s: E: s
</Lease> 1 |7 }+ l: [: s, v0 J8 S3 s5 O
* W: o1 D' P" s% ^: O+ d. W3.2 以文档为主的文件
- l" ~- W: u- C% w3 S+ ~$ i 以文档为主的文件表现出来的特点是:不规范的结构,大量的原始数据(就是说, 1 ]) K7 X4 o$ I x% i) e
最小的独立数据单元是包含有混合内容的元素级或则本身就是一个文档),和大量混合内容。其中
9 c/ a1 t* m! W* K0 O+ h同类型元素和PCDATA出现顺序是非常重要的。例如一本书,一封电子邮件,广告,以及几乎所有的
& l/ e4 Y+ m) ~! _/ u5 b" kXHTML文档。以文档为主的文件通常是用来设计人文消费:
4 H4 Q; Y- D: S: n8 e+ w 例如,下面的产品描述就是一个以文档为主的文件: ) f) y6 l- l7 x- h% ] d
<Product>
/ W/ y1 h9 j2 _0 l <Name>Turkey Wrench</Name>
5 J" G7 x. ]0 r8 U" g# s <Developer>Full Fabrication Labs, Inc.</Developer> ' k; a$ S2 r. L$ I3 U/ a1 O
<Summary>Like a monkey wrench, but not as big.</Summary>
/ F+ `6 i. d! r <Description>
3 \3 |: h; V+ F6 R7 P3 o <Para>The turkey wrench, which comes in both right- and + U9 c- y+ _3 K- W' @
left-handed versions (skyhook optional), is made of the finest - x1 r! l3 T+ Y8 O
stainless steel. The Readi-grip rubberized handle quickly adapts
' z/ }, r: _% z. j1 }. y$ ~( y to your hands, even in the greasiest situations. Adjustment is 7 J% N* W! z/ y
possible through a variety of custom dials.</Para>
9 a; ? b. ~1 k" ^7 M4 t <Para>You can:</Para>
0 b' }1 Q1 Z9 Y4 T <List> 9 V: _4 t- d7 K6 `5 @5 s
<Item><Link URL="Order.html">Order your own turkey wrench</Link></Item>
4 h! W+ F Y& q5 e8 C! S0 O <Item><Link URL="Wrenches.htm">Read more about wrenches</Link></Item> 6 ^* D! O8 [4 ?/ @. w# G8 e
<Item><Link URL="catalog.zip">Download the catalog</Link></Item> ! h3 c9 Q" {) t. b# c, |
</List>
2 Q9 J" H, x# H( u( _ <Para>The turkey wrench costs just $19.99 and, if you 1 O* o3 p+ S6 \# Q! F4 R
order now, comes with a hand-crafted shrimp hammer as a
# Q# T+ U2 Z9 F/ h. l7 w( E! y4 g bonus gift.</Para> 0 f! A3 j* Y& D' e
</Description>
9 f. P* I2 A) t# j
p; A8 N3 j% E& y+ T* ?3.3 数据(Data)、文件(Documents)和数据库(Databases) $ Y3 ~7 \2 `0 ~6 y8 y; O! N( ?
事实上,数据为主的文件和文档为主的文见之间的区别并不是很清晰。例如,虽然
% E- v+ R/ n. _% ^8 \1 b- g一个数据为主的文件(例如一张发票),也有可能包含大量的不规范结构的数据,例如发票的描 + C, y& s | u2 f* ]
述部分。而一个以文档为主的文件(例如用户手册),也可能包含有规范的数据结构(通常是元数
( \, b% I) F. ]% A据metadata),例如作者名和再版日期。除了这些,你用来判断是否是两者中其一的另外 % x" U1 _# n: l3 O
一个重要特点是你是对数据还是对文档感兴趣,这也将决定你要采用什么样的系统。 % j; D$ r1 {$ y& _4 D& M0 D" Z
要存储和获取数据,你可以使用一个数据库(通常是关系数据库,面向对象数据库
6 u7 y" e1 e: ]# x0 x+ k2 h0 y v或则树状体系数据库)和中间件,或则你也可以使用XML服务器(你可以把它看成是将数据库
" A- s9 V* G5 Z: x和中间件捆绑在一起)。要保存文档,你将需要一个内容管理系统。有关各种系统的探讨 + p! c6 H- `! O; C, I$ h
在第4.0小节中, "存储和获取数据"和第5.0小节 "存储和获取文档".你能够在第6.0小节找到 7 \# U0 y5 R/ M/ A8 g7 M) c
一些可使用的软件列表"可利用的软件"。
" d ]1 u/ R: p0 k/ ]6 O. w/ h) L" U1 l+ a# N* x+ b
4.0 存储和获取数据 1 A# u) J: ?8 B
数据的类型可以在数据为主的文件的原始定义或则从数据库中的字段类型中得到。 : d4 f4 E5 p/ |/ l" C; i2 s0 |1 Z
前者的例子是你想把数据库中的数据保存成XML文件放到网站上;后者的例子是你需 ; X6 O& ?2 U- h+ c
要把大量的数据保存到关系数据库中。根据你的具体需求,你需要的软件或则是把XML数据
, ~/ b$ ?4 P m) V2 Q! M读入到数据库或则是把数据库中的数据输出到XML文件,或则两者都支持。 8 o6 L0 m) C: U; `# S
6 Q8 e# n/ f/ @" ]0 }9 Y
4.1 转录数据
0 C8 d, R. p: Y5 s% m, P 当将数据保存在数据库中,它经常需要抛弃与文档信息有关的大量内容,例如它的 ( F8 @$ V! r( d: H% N- B% C
名称和DTD,同时还有它的物理结构,例如实体的定义和使用、属性值和相同类型元素的出现顺 ' p# D: z- x5 U8 _, R: ?0 i
序,还有二进制数据的存储方式 (是经过Base64编码的还是没有经过编码的实体或则其他方式),
+ w/ s4 M7 T6 D" q, SCDATA的内容和其他编码信息。简单而言,当从数据库中获取信息时,最后生成的XML文档结果可
$ q: t$ G( v6 F% ^% w+ m; p能不包含任何CDATA或则实体运用(entity usage) (除非预先定义了实体lt(就是符号"<"
7 w3 J y% Y! _4 `( A4 o" u),gt(">", amp("&", apos("'", quot(""")和同类型元素、属性出现的顺序。
: a3 z+ U8 B+ i! z' f. K# {6 C7 o 例如,假设你需要把一个销售单的信息使用XML格式从一个数据库中获取数据然后转
3 J$ q/ u2 ?* P7 B) W录到另外一个数据库中,在这个例子中,在XML文档中并不关心销售单的编号是保存在销售单的日 & J; o: W; ~: n3 T, Y$ N+ X
期的前面还是后面,也不用关心是否将顾客的名称保存在CDATA section作为一个扩展入口,
% f9 K( n3 W/ A2 a! Y或则甚至直接当成一个PCDATA. 但是,对于将这些相关数据从第一个数据库中转录到第二个数据
( l3 p6 z) c: w0 ~' S: b! ?库的过程中,这些信息都是非常重要的。这样,这个数据传输软件就需要考虑使用树状结构 4 j2 M5 E: i# r) H' H3 k2 a$ M
(它将一个单独的销售单的信息用组(group)来实现)。 : i }# U% @# l, N; e& y* t v
另一个当忽略文档信息和它的物理结构会带来麻烦的例子是---"借贷套利"文档,它
. O" t+ _% `5 j+ X/ L; j$ _保存的数据是从一个数据库中的文档中获取,并且需要重新组装这些数据成为一个新的文档, , B% U E8 Y+ q/ A
而这个过程经常会导致新的文档的结构和原来的文档会不一致。 2 K- C5 l1 q# U$ k. q6 Z. C8 O! v
从上面的例子可以看出,对于数据库和数据传输中间件的选择是根据你的需求而变 , q! p* M, {7 y2 _
化的。 |
|