为地址等数据库表建模似乎很简单,就像 XSD 中的这样:
<xsd:complexType name="address_Type">
<!-- the columns of the database table for addresses -->
<xsd:sequence>
<xsd:element name="street" type="xsd:string" />
<xsd:element name="city" type="xsd:string" />
<xsd:element name="state" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
然后,您可以使用此表加上一些其他不相关的数据(例如用户名)来定义 XML 格式,如下所示:
<xsd:element name="user" type="user" />
<!-- =========================================== -->
<xsd:complexType name="user">
<xsd:sequence>
<!-- username stands for all non-address fields -->
<xsd:element name="username" type="xsd:string" />
<!-- wrapper element for the address fields -->
<xsd:element name="address" type="address_Type" />
</xsd:sequence>
</xsd:complexType>
XML 可能是这样的:
<?xml version="1.0" encoding="utf-8"?>
<user>
<username>Albert Einstein</username>
<!-- with wrapper element for address -->
<address>
<street>Main Street</street>
<city>Ghost Town</city>
<state>Up State</state>
</address>
</user>
此方法可以轻松扩展到具有地址列表或与其他表中的记录相结合的地址记录的 XML。通过这种方式,一个 XSD 可以涵盖许多 XML 格式。
然而,如果有人认为,如果我只包含地址对象的 1 个实例,为什么我需要那个愚蠢的“地址”包装元素,得到这个 XML:
<?xml version="1.0" encoding="utf-8"?>
<user>
<username>Albert Einstein</username>
<!-- no wrapper element for address -->
<street>Main Street</street>
<city>Ghost Town</city>
<state>Up State</state>
</user>
对我来说,现在我们似乎不能使用与上面 XSD 中相同的复杂类型作为地址。
在我的公司,IT 组织是分散的,如果我开始大喊“你应该添加包装元素”,我可能会感到喉咙痛。或者头痛。因此,我需要改进我的 XSD,以应对带有和不带有包装器元素的 XML。
我尝试添加一个没有名称的 xsd:element,但这不起作用:
<xsd:element type="address_Type" />
我找不到 xsd: 具有 type 属性的实体来指向除 xsd:element 之外的复杂类型。
我的问题是是否还有一种方法可以重新使用最后一个 XML 的复杂类型?