跳转至内容

XML - 管理数据交换/一对一关系

来自维基教科书,开放世界中的开放书籍



上一章 下一章
一对多关系 多对多关系



学习目标

  • 为包含 1:1 关系的数据模型创建架构
  • 对 XML 架构中的元素或属性施加限制
  • 为 XML 架构中的元素指定固定值或默认值


在上一章中,介绍了 XML 架构、文档和样式表的一些新功能,以及如何对一对多关系进行建模。在本章中,我们将介绍在 XML 中对一对一关系的建模。我们还将介绍 XML 架构的更多功能。


一对一 (1:1) 关系

[编辑 | 编辑源代码]

下图显示了一对一和一对多关系。一对一关系记录每个国家/地区作为单个顶级目的地。


图 4-1:1:1 关系的数据模型

XML 架构

[编辑 | 编辑源代码]

一对一 (1:1) 关系在图 4-1 中的数据模型中表示。将国家/地区和目的地添加到数据模型中允许名为 topDestination 的 1:1 关系。一个国家/地区有许多不同的目的地,但只有一个顶级目的地。图 4-2 中的 XML 架构显示了如何在 XML 架构中表示 1:1 关系。

XML 架构示例

[编辑 | 编辑源代码]
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> 
<!--
Tour Guide
--> 
 <xsd:element name="tourGuide"> 
  <xsd:complexType> 
   <xsd:sequence> 
    <xsd:element name="country" type="countryDetails" minOccurs="1" maxOccurs="unbounded" /> 
   </xsd:sequence> 
  </xsd:complexType> 
 </xsd:element> 
<!--
Country
--> 
 <xsd:complexType name="countryDetails"> 
  <xsd:sequence> 
   <xsd:element name="countryName" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
   <xsd:element name="population" type="xsd:integer" minOccurs="0" maxOccurs="1" default="0"/> 
   <xsd:element name="continent" minOccurs="0" maxOccurs="1"> 
    <xsd:simpleType> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="Asia"/> 
      <xsd:enumeration value="Africa"/> 
      <xsd:enumeration value="Australasia"/> 
      <xsd:enumeration value="Europe"/> 
      <xsd:enumeration value="North America"/> 
      <xsd:enumeration value="South America"/> 
      <xsd:enumeration value="Antarctica"/> 
     </xsd:restriction> 
    </xsd:simpleType> 
   </xsd:element> 
   <xsd:element name="topDestination" type="destinationDetails" minOccurs="0" maxOccurs="1"/> 
   <xsd:element name="destination" type="destinationDetails" minOccurs="0" maxOccurs="unbounded"/> 
  </xsd:sequence> 
 </xsd:complexType> 
<!--
Destination
--> 
 <xsd:complexType name="destinationDetails"> 
  <xsd:all> 
   <xsd:element name="destinationName" type="xsd:string"/> 
   <xsd:element name="description" type="xsd:string"/> 
   <xsd:element name="streetAddress" type="xsd:string" minOccurs="0"/> 
   <xsd:element name="telephoneNumber" type="xsd:string" minOccurs="0"/> 
   <xsd:element name="websiteURL" type="xsd:anyURI" minOccurs="0"/> 
  </xsd:all> 
 </xsd:complexType> 
</xsd:schema>


图 4-2:一对一关系的 XML 架构

架构中的新元素

[编辑 | 编辑源代码]


让我们检查一下图 4-2 中架构中的新元素和属性。

  • Country 是在 City 中定义的复杂类型,用于表示国家/地区与其城市之间的 1:M 关系。
  • Destination 是在 Country 中定义的复杂类型,用于表示国家/地区与其多个目的地之间的 1:M 关系。
  • topDestination 是在 Country 中定义的复杂类型,用于表示国家/地区与其顶级目的地之间的 1:1 关系。

架构中的限制

[编辑 | 编辑源代码]


在上一章中介绍了对元素施加限制;但是,还可以对元素施加更多可能很有用的限制。可以对影响处理器如何处理空格字符的元素和属性施加限制。

<xsd:element name="streetAddress">
 <xsd:simpleType>
  <xsd:restriction base="xsd:string">
   <xsd:whiteSpace value="preserve"/>
  </xsd:restriction>
 </xsd:simpleType>
</xsd:element>

空格 & 长度约束

[编辑 | 编辑源代码]

whiteSpace 约束设置为“preserve”,这意味着 XML 处理器将不会删除任何空格字符。其他有用的限制包括:

  • 替换 - XML 处理器将用空格替换所有空格字符。
<xsd:whiteSpace value="replace"/>
  • 折叠 - 处理器将删除所有空格字符。
<xsd:whiteSpace value="collapse"/>
  • length、maxLength、minLength - 元素的长度可以是固定的,也可以具有预定义的范围。
<xsd:length value="8"/>
<xsd:minLength value="5"/>
<xsd:maxLength value="8"/>

顺序指示器

[编辑 | 编辑源代码]

除了对元素施加限制之外,还可以使用顺序指示器来定义元素应该出现的顺序。

全部指示器
[编辑 | 编辑源代码]

<all> 指示器默认指定子元素可以以任何顺序出现,并且每个子元素必须出现一次且仅出现一次。

<xsd:element name="person">
 <xsd:complexType>
  <xsd:all>
   <xsd:element name="firstname" type="xsd:string"/>
   <xsd:element name="lastname" type="xsd:string"/>
  </xsd:all>
 </xsd:complexType>
</xsd:element>
选择指示器
[编辑 | 编辑源代码]

<choice> 指示器指定可以出现一个子元素或另一个子元素。

<xsd:element name="person">
 <xsd:complexType>
  <xsd:choice>
   <xsd:element name="employee" type="employee"/>
   <xsd:element name="visitor" type="visitor"/>
  </xsd:choice>
 </xsd:complexType>
</xsd:element>
顺序指示器
[编辑 | 编辑源代码]

<sequence> 指示器指定子元素必须以特定顺序出现。

<xsd:element name="person">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element name="firstname" type="xsd:string"/>
   <xsd:element name="lastname" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

XML 文档

[编辑 | 编辑源代码]


图 4-3 中的 XML 文档显示了如何在 XML 文档中使用在图 4-2 中找到的 XML 架构中定义的新元素(country 和 destination)。请注意,由于在架构中使用了 <xsd:all> 顺序指示器,因此 <topDestination> 的子元素可以以任何顺序出现。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="newXMLSchema.xsl" media="screen"?>
<tourGuide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="XMLSchema.xsd">   
<!--
Malaysia
-->   
<country> 
   <countryName>Malaysia</countryName> 
   <population>22229040</population> 
   <continent>Asia</continent> 
   <topDestination> 
    <description>A popular duty-free island north of Penang.</description> 
    <destinationName>Pulau Langkawi</destinationName> 
   </topDestination> 
   <destination> 
    <destinationName>Muzium Di-Raja</destinationName> 
    <description>The original palace of the Sultan</description>
    <streetAddress>122 Muzium Road</streetAddress>
    <telephoneNumber>48494030</telephoneNumber>
    <websiteURL>www.muziumdiraja.com</websiteURL> 
   </destination> 
   <destination> 
    <destinationName>Kinabalu National Park</destinationName> 
    <description>A national park</description>
    <streetAddress>54 Ocean View Drive</streetAddress>
    <telephoneNumber>4847101</telephoneNumber>
    <websiteURL>www.kinabalu.com</websiteURL> 
   </destination> 
  </country>
<!--
Belize
--> 
  <country> 
   <countryName>Belize</countryName> 
   <population>249183</population> 
   <continent>South America</continent> 
   <topDestination> 
    <destinationName>San Pedro</destinationName> 
    <description>San Pedro is an island off the coast of Belize</description> 
   </topDestination> 
   <destination> 
    <destinationName>Belize City</destinationName> 
    <description>Belize City is the former capital of Belize</description>
    <websiteURL>www.belizecity.com</websiteURL> 
   </destination> 
   <destination> 
    <destinationName>Xunantunich</destinationName> 
    <description>Mayan ruins</description>
    <streetAddress>4 High Street</streetAddress>
    <telephoneNumber>011770801</telephoneNumber> 
   </destination> 
  </country> 
  </tourGuide>

图 4-3:一对一关系的 XML 文档

架构设计人员可以对元素的长度以及处理器如何处理空格施加限制。架构设计人员还可以为元素指定固定值或默认值。顺序指示器可用于指定元素必须在 XML 文档中出现的顺序。


华夏公益教科书