串的空元素或属性是空值。这个时候你必须考虑如何选择合适的中间件来解决这个问题。一些中间件可以让用户选择在XML文档中定义用什么来组成空值。
5.3.4 字符集
根据定义,除了一些控制字符,XML文档能够包含任何的Unicode字符。但是不幸的是,许多数据库都限制或则不支持Unicode,而且需要一些特殊的配置才能够处理非ASCII编码的字符数据。如果你的数据包含了非ASCII字符,那么务必要核实你的数据库和中间件是否能够处理这些字符。
5.3.5 处理指令
处理指令并不属于XML文档中的“数据”部分,因此目前许多中间件可能不能正常的处理。问题是,尤其是在将XML文档结构严格映射成数据库结构时,处理指令通常是很难处理的,因为它们可以虚拟地出现在文档的任何位置。因此,中间件就很难判断将它们保存到什么位置以及在什么时候检索读取出来。如果处理指令和文档的循环回复("round-tripping")对你而言是非常重要的话,就务必检查你的中间件是如解决这个问题的。
5.3.6 存储标记
在
href="#markup">4
href="#markup">.2.2
小节中提到,有时候将包含元素或者混合内容的元素不作进一步的解析而直接保存到数据库中是非常有用的。最常见的方法是简单的把这个标记本身直接保存到数据库中。不幸的是,当从数据库中检索数据时将产生问题:不可能判断数据库中的标记到底是真的标记还是代表了标记字符的实体,如由lt和gt转义的字符。
例如,下面的description元素:
<description>
<b>Confusing example:</b> <foo/>
</description>
在数据库中存储为:
<b>Confusing example:</b> <foo/>
这时数据库就不能判断<b>和<foo>是标记还是文本。有几种可能的解决方法,如以一定的方式来标志标记或者对非标记的标记字符使用实体。但是这时你要格外注意这样的方式是否和使用这些的数据的其它应用兼容。例如,如果你想查询数据库中的小于号("<")和
lt实体("<")时就要特别留心。
5.4 从数据库的结构生成DTD及其互逆过程
在XML文档和数据库之间转换数据时,一个普遍问题是:如何从数据库的结构(Schema)生成XML的DTD,如果从XML的DTD产生数据库的结构。简而言之,这是非常直接的操作,但是产生的结果通常离许多用户的期望值还有一些距离。
(还要注意这通常是一次性操作,而大多数应用,尤其是所有的垂直性应用都结合了已知的DTD和关系型Schema的集合。显而易见的特例是在关系数据库中存储随机XML文档或者将关系型数据发布为XML文档的工具;而在后面的情况中,DTD的作用并不明显。)
对于元素类型中每个有单一数值的属性和只包含有PCDATA内容的子元素类型在该ta
ble中新建立一列(字段)。如果子元素类型或则属性是可选的,让该字段允许为空。
对于每个有多值的属性或则多仅含有PCDATA内容的子元素类型,再建立一个分开的
table来保存他们的值,通过它们的父表的主关键字连接到父表。
对于每个子元素,这些子元素本身还有元素或则混合内容,使用父表中的关键字将
父元素表连接到子元素表中。
而下面则是一个从关系数据库的结构生成XML文档的过程(简化过的):
对每个table,新建一个元素。
对表中的每列,建立一个属性或则只含PCDATA的子元素
对每个包含有在主键/外键关键字关系中主键