are minutes later. </flightinfo>从下面的xml文件和一个简单的样式表中创建这个文档:
<flights>
<airline>abc airways</airline>
<origin>dallas</origin>
<destination>fort worth</destination>
<flight>
<departure>09:15</departure>
<arrival>09:16</arrival>
</flight>
<flight>
<departure>11:15</departure>
<arrival>11:16</arrival>
</flight>
<flight>
<departure>13:15</departure>
<arrival>13:16</arrival>
</flight>
</flights>
4.2 以文档为中心的文档 (document-centric documents)
以文档为中心的文档通常是供人消费的。例如书籍、email、广告以及几乎所有人工写成的xhtml文件。其特性为结构不太或根本不规则、数据粒度大(larger grained data)(最小的独立数据单位可能存在于包含混合内容的元素甚至整个文档本身),混合内容多。同级元素或pcdata出现的次序一般来说总是非常重要的。
以文档为中心的文档通常是以xml手工写成,或从其他格式(如rtf, pdf, sgml)转换到xml,与以数据为中心的文档不同,它们通常不来源于数据库。(由插入到模板中的数据得到的文档是以数据为中心的;更多信息请看4.1节末尾部分)。将各种格式转换为xml的软件信息,请参阅xml软件相关链接。
例如,下面这个产品说明是以文档为中心的:
<product> <intro> the <productname>turkey wrench</productname> from <developer>full fabrication labs, inc.</developer> is <summary>like a monkey wrench, but not as big.</summary> </intro> <description> <para>the turkey wrench, which comes in <i>both right- and left- handed versions (skyhook optional)</i>, is made of the <b>finest stainless steel</b>. the readi-grip rubberized handle quickly adapts to your hands, even in the greasiest situations. adjustment is possible through a variety of custom dials.</para> <para>you can:</para> <list> <item><link url="order.html">order your own turkey wrench</link></item> <item><link url="wrenches.htm">read more about wrenches</link></item> <item><link url="catalog.zip">download the catalog</link></item> </list> <para>the turkey wrench costs <b>just $19.99</b> and, if you order now, comes with a <b>hand-crafted shrimp hammer</b> as a bonus gift.</para> </description> </product>
4.3 数据、文档和数据库(data, documents, and databases)
实际上,以数据为中心和以文档为中心的文档之间的差别不一定很明显。例如,另一种以数据为中心的文档比如发票,可能含有大粒度的、非结构化的数据比如零件说明;另一种以文档文中心的文件如用户手册,可能包含细粒度的结构规则的数据(通常为元数据)比如作者和修订日期。其它例子包括法律和医学文书,虽然以散文的形式写成但是却包含离散的数据块例如日期、名称和操作程序,出于法定原因通常要以完整的文件形式存储。
除此之外,弄清文件的这两种特点有助于选择数据库的类型。一般来说,将数据存储于传统的数据库,例如关系型,面向对象型或层次型数据库。这可由第三方的中间件完成或由数据库本身提供内在支持。对于后者,该数据库被称作支持xml的(xml-enabled)。文档可被存储在原生(native)xml数据库(专为存储xml而设计的数据库)或内容管理系统(建在原生xml数据库之上专门用来管理文档的程序)。
这些原则并不是绝对的。如果对xml特有的功能不很看重,数据,特别是半结构化的数据可以存储在原生xml数据库,文档也可以存储到传统数据库。何况传统数据库与原生xml数据库之间的界限越来越模糊,传统数据库增加了原生xml的能力,而原生xml数据库增加了对文档存储在外部(通常为关系型)数据库的支持。
本文剩下的部分就有关数据(第5节)和文档(第6节)的存储和读取的策略与问题展开讨论。关于最新的xml数据库产品,请见 xml database products。
5.0 数据的存取(storing and retrieving data)
为了在xml文件和数据库之间交换数据,有必要将xml文件的schema(dtd,xml schema, relax ng等)映射到数据库的schema。用于数据转换的软件就建在这种映射之上。该软件可以使用xml query语言(如xpath,xquery,或其他专用语言)或简单地按照映射(select * from table的xml对等式)转换数据。对于后者,文档的结构必须完全符合映射所要求的结构。由于通常不易做到这点,使用这种策略的产品一般要和xslt一起使用。在数据转换到数据库之前,先将文件按照映射所要求的结构进行转换,然后转存数据。相应地,数据从数据库中取出以后,结果文件要被转换成应用程序所需的结构。
5.1 映射[xml]文件schema到数据库schema (mapping document schemas to database schemas)
文件schema到数据库schema的映射是在元素类型、属性和文本上进行的。这时几乎总是忽略物理结构(例如实体、cdata部分及编码信息)及某些逻辑结构(如处理指令、注释以及元素和pcdata在父元素内出现的顺序)。这样比完全照搬更为合理,因为数据库和应用程序只需关心xml文件中的数据。例如,在上述的销售订单中,客户代号是在cdata部分,还是外部实体中,或直接就是pcdata并不重要,同样,客户代号出现在订货日期之前或之后也无关紧要。
这种方法的一个后果是能否保证文件有“往返车票” -- 将文件中的数据存入数据库后,又从数据库中的数据建立文件,而这个文件往往和原来的文件不同(哪怕从最一般的意义上讲)。在选择软件是要考虑到是不是允许这种情形发生。
将一个xml文件的schema映射到数据库的schema有两种方法:基于表格的映射和对象-关系映射。
5.1.1 基于表格的映射 (table-based mapping)
许多转换xml到数据库的中间软件都采用基于表格的映射。它把xml文件看作一个(或一组)表格,也就是说,xml文件的结构必须是下面这种样子,如果只是单一表格的话,就不再需要<database>元素和其他<table>元素: <database>
<table>
<row>
<column1>...</column1>
<column2>...</column2>
...
</row>
<row>