XML - 管理数据交换/一对一关系
上一章 | 下一章 |
← 一对多关系 | 多对多关系 → |
学习目标
|
在上一章中,介绍了 XML 架构、文档和样式表的一些新功能,以及如何对一对多关系进行建模。在本章中,我们将介绍在 XML 中对一对一关系的建模。我们还将介绍 XML 架构的更多功能。
下图显示了一对一和一对多关系。一对一关系记录每个国家/地区作为单个顶级目的地。
图 4-1:1:1 关系的数据模型
一对一 (1:1) 关系在图 4-1 中的数据模型中表示。将国家/地区和目的地添加到数据模型中允许名为 topDestination 的 1:1 关系。一个国家/地区有许多不同的目的地,但只有一个顶级目的地。图 4-2 中的 XML 架构显示了如何在 XML 架构中表示 1:1 关系。
<?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>
图 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 文档中出现的顺序。 |