如何在 XSD 中使用没有包装元素的复杂类型?
How to utilize complexType without wrapper element in XSD?
如何为这个XML-1写一个XSD(简化的例子):
<?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>
而不是更符合逻辑的 XML-2:
<?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>
其中 username
代表不属于数据库的所有字段 table 代表地址,这是一个 table 我不能只更改以包含更多字段,
address
字段的某种记录类型像这样 XSD:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<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>
<!-- =========================================== -->
<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>
</xsd:schema>
使用 Visual Studio 中的工具,我验证了 XML-2 与 XSD 相符,但 XML-1 不相符。如何改进XSD中的“问题行”?显然,你不能在 XSD 中写一个没有名字的元素:
<xsd:element type="address_type" />
我需要为 address
字段包含 complexType
而没有封闭
<address>
标签。
这个问题的原因是这个 XSD 将有助于使用 xsd.exe 为数据库 table address
创建 C# class visual studio SDK.
我将不得不处理许多不同的格式 XML,其中大多数在地址包装器元素中具有地址数据。很容易扩展 XSD 来验证那些 XML。问题是 XML 的地址数据没有包装元素,这似乎不适用于 XSD 和 complexType Address_Type。除非比我聪明的人看到解决方案。
因为complexType和数据库结构的关系table,我不能只在complexType中添加用户名字段。用户名实际上代表所有不在地址 table.
中的字段
我愿意接受所有建议。即使在做了一些 XSD 的事情之后,我仍然觉得自己像个初学者,我什至不确定是否需要使用 xsd:sequence。
更新: 新 Q/A 已在此处创建满足@Roland 的改进要求:
原始的、过时的答案和更新如下...
如果您不想要包装器 address
元素,您可以简单地不定义一个,并将其内容模型直接放在 user
:
的内容模型中
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="user" type="user" />
<xsd:complexType name="user">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<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>
</xsd:schema>
根据您的意见,您不想执行上述操作;你想重用 address_Type
.
中的元素
没有直接的方式说出你想要什么,但你可以让 user
复杂类型扩展 address_Type
复杂类型。这将允许您将 username
元素添加到那些已经出现在 address_type
中的元素中(尽管以这种方式扩展地址读起来会很不自然)。
要更自然地重用部分内容模型,请考虑使用 xs:group
。例如,参见
- Refer to specific element of an XSD model group?
如何为这个XML-1写一个XSD(简化的例子):
<?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>
而不是更符合逻辑的 XML-2:
<?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>
其中 username
代表不属于数据库的所有字段 table 代表地址,这是一个 table 我不能只更改以包含更多字段,
address
字段的某种记录类型像这样 XSD:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<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>
<!-- =========================================== -->
<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>
</xsd:schema>
使用 Visual Studio 中的工具,我验证了 XML-2 与 XSD 相符,但 XML-1 不相符。如何改进XSD中的“问题行”?显然,你不能在 XSD 中写一个没有名字的元素:
<xsd:element type="address_type" />
我需要为 address
字段包含 complexType
而没有封闭
<address>
标签。
这个问题的原因是这个 XSD 将有助于使用 xsd.exe 为数据库 table address
创建 C# class visual studio SDK.
我将不得不处理许多不同的格式 XML,其中大多数在地址包装器元素中具有地址数据。很容易扩展 XSD 来验证那些 XML。问题是 XML 的地址数据没有包装元素,这似乎不适用于 XSD 和 complexType Address_Type。除非比我聪明的人看到解决方案。
因为complexType和数据库结构的关系table,我不能只在complexType中添加用户名字段。用户名实际上代表所有不在地址 table.
中的字段我愿意接受所有建议。即使在做了一些 XSD 的事情之后,我仍然觉得自己像个初学者,我什至不确定是否需要使用 xsd:sequence。
更新: 新 Q/A 已在此处创建满足@Roland 的改进要求:
原始的、过时的答案和更新如下...
如果您不想要包装器 address
元素,您可以简单地不定义一个,并将其内容模型直接放在 user
:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="user" type="user" />
<xsd:complexType name="user">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<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>
</xsd:schema>
根据您的意见,您不想执行上述操作;你想重用 address_Type
.
没有直接的方式说出你想要什么,但你可以让 user
复杂类型扩展 address_Type
复杂类型。这将允许您将 username
元素添加到那些已经出现在 address_type
中的元素中(尽管以这种方式扩展地址读起来会很不自然)。
要更自然地重用部分内容模型,请考虑使用 xs:group
。例如,参见
- Refer to specific element of an XSD model group?