15.2 设计XML文档

本系统采用XML文档来保存系统状态,因此XML文档的作用类似于原来的系统数据库。由于不管是系统的电子公告信息,还是用户评论信息,都没有保存在数据库中,而是保存在了XML文档里,因此XML文档的设计有点类似于传统应用中的数据库设计。

15.2.1 保存状态的XML文档

从系统设计来看,本系统包含两个实体:电子公告和公告评论,而且电子公告和公告评论之间存在一对多的关联关系,这在数据库设计上比较容易实现,只要在公告评论对应的数据表中增加外键列即可。

因为本系统采用XML文档来保存电子公告和公告评论,同样需要保存电子公告和公告评论之间的关联关系,不过我们在设计XML文档时并没有采用在公告评论中增加外键的方式:因为我们计划为每个电子公告的评论单独创建一份XML文档。也就是说,保存电子公告的XML文档中每条公告记录对应一份评论文件。

因此,本系统需要两类XML文档:

alt 保存所有电子公告的XML文档。

alt 保存用户评论的XML文档。该类型的文档有很多个,每个电子公告即对应一份用户评论的XML文档。

从上面的分析可以看出,本系统中保存电子公告的XML文档只有一份,而保存用户评论的XML文档则有很多份,每条电子公告对应一份用户评论的XML文档。图15.2显示了系统中各XML文档之间的关系。

alt

图15.2 各XML文档之间的关系

了解了系统中两类XML文档之间的关系之后,下面来详细分析两类XML文档的内部结构。

对于保存电子公告的XML文档而言,每当用户新增一条电子公告即在XML文档内新增一个子节点,该子节点用于保存一条电子公告的完整信息,包括公告的标题、内容、发布时间和发布人等必要信息。除此之外,还应保存该电子公告所对应的用户评论。

下面是保存电子公告的XML文档里每个子节点的内部结构:

alt

上面的每个<公告…/>节点保存一条电子公告记录,其中<文件名…/>子节点保存了该电子公告所对应的用户评论的XML文档。

保存电子公告的XML文档需要保存大量的电子公告,每个电子公告对应一个<公告…/>节点,因此保存电子公告的XML文档的整体结构如下:

alt

类似地,保存用户评论的XML文档需要保存多条用户评论,每条用户评论对应一个子节点,该子节点需要保存用户评论的标题、内容、作者和评论时间等信息。每条用户评论对应一个如下结构的XML节点:

alt

对于保存用户评论的XML文档而言,它需要保存多条用户评论,每条评论对应一个<评论…/>节点。除此之外,为了简化XML文档设计,我们将每条公告直接保存到了评论XML文档中。当需要显示指定的电子公告及其全部评论时,只需将评论XML文档发送到客户端即可。因此保存评论的XML文档里除了需要多个<评论…/>节点之外,还需要一个<公告…/>节点,该节点的结构如下:

alt

从上面的结构可以看出,保存评论的XML文档里的<公告…/>节点与保存公告的XML文档里的<公告…/>节点基本相似,只是少了一个<文件名…/>子节点。

下面是保存用户评论的XML文档的结构:

alt

15.2.2 定义XML Schema

设计好两份XML文档的结构之后,下面可以为两份XML文档设计XML Schema定义语义约束,由于这两份XML文档并不复杂,因此其XML Schema并不难。

不过有一点需要指出的是,不管是<公告…/>元素的<内容…/>子元素,还是<评论…/>元素的<内容…/>子元素,都除了需要保存普通的文本内容之外,还需要保存<br />元素,因为当公告内容或用户评论内容中包含换行时,我们必须将其转换为HTML换行符<br />,否则转换为视图时将丢失用户输入的格式。

图15.3是保存公告的XML文档的结构图。

alt

图15.3 公告对应的XML文档的结构图

该结构图所对应的XML Schema文档如下:

程序清单:codes\15\news\list.xsd

alt

图15.4是保存用户评论的XML文档的结构图。

alt

图15.4 用户评论对应的XML文档的结构图

该结构图所对应的XML Schema文档如下:

程序清单:codes\15\news\replys.xsd

alt

在为系统提供上面两类XML文档之后,就可以通过这两类XML文档来保存系统的状态信息:电子公告信息和用户评论信息,这就相当于完成了传统应用中的数据库设计部分。