值的列,新建一个子元素。 因为任何的预先定义(例如通过读取一个示例文档)在读取其它“类型”的文档或者其他文档中包含有超过字长内容的文档时就会产生错误。(长久之策是使用XML schema文档的数据类型。)简单来说,当从一关系型结构生成DTD时,是没有办法预先判断子元素“应该”出现的顺序或者字段(如数据库内部的行标识)是否该进行完全转换。
例如,下面的过程(经简化)说明了如何从一个DTD生成一个关系型结构:
对于每种包含元素或者混合内容的元素类型,新建一个表格和一个主键字段。
对于每个包含混合内容的元素类型,创建一个单独的表格,其中存放未析数据,通过父元素主键链接到父表格。
对于此元素类型的每个单值属性和只包含未析数据内容、只出现一次的子元素,在该表格中创建一个字段。如果元素类型或者属性是可选的,可以让设置该字段为空值。
对于每个多值属性和多次出现的子元素,创建一个单独的表格来存储数值,并且通过父元素主键链接到父表格。
对每个有元素或者混合内容的子元素,通过父元素主键将父元素表格和子元素表格相连接。
下面的过程(经简化)说明了如何从一个关系型的结构生成一个DTD:
对于每个表格,新建一个元素;
对于表格中的每个字段,新建一个属性或者是只包含未析数据的子元素;
对于每个表格字段中提供主键的主键/外键的关系都新建一个子元素。
不幸的是,这些过程还存在着一些缺陷。例如,DTD中没有方法预先准确地规定数据类型或者字段长度。
在以上两种情况中都可能产生命名的冲突。
尽管有这样那样的缺陷,但是这些方法仍然能够很好地奠定在关系型结构和DTD之间互相转换的起点。