首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在XSD中使用没有包装器元素的complexType?

如何在XSD中使用没有包装器元素的complexType?
EN

Stack Overflow用户
提问于 2021-02-19 18:34:54
回答 1查看 140关注 0票数 1

如何为这个XML-1编写XSD (简化示例):

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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代表并非地址数据库表一部分的所有字段,这是一个表,我不能仅仅更改该表以包含更多字段,

使用address字段的某种记录类型,如以下XSD:

代码语言:javascript
复制
<?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中的工具,我验证了XML-2使用XSD进行验证,但XML-1没有验证。如何改进XSD中的“问题线”?显然,您不能在XSD中写入没有名称的元素:

代码语言:javascript
复制
<xsd:element type="address_type" />

我需要包含用于complexType字段的address字段,而不需要包含

代码语言:javascript
复制
<address> 

标签。

这个问题的原因是这个XSD对于使用visual中的C#为数据库表address创建一个xsd.exe类是有用的。

我将不得不处理许多不同格式的XML,其中大多数在address包装元素中具有地址数据。扩展XSD以验证这些XML是很容易的,问题是没有包装器元素的地址数据的XML,这似乎不能用complexType Address_Type验证XSD。除非比我聪明的人能找到解决办法。

由于complexType与数据库表的结构之间的关系,我不能仅仅将username字段添加到complexType中。用户名实际上代表所有不在address表中的字段。

我愿意听取所有建议。即使在做了相当多的XSD之后,我仍然觉得自己是个初学者,我甚至不确定是否需要使用xsd:sequence。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-19 19:11:38

更新:在这里创建了解决@Roland精炼需求的新Q/A:

原始的,过时的答案和更新如下..。

如果不需要包装器address元素,则可以简单地不定义一个元素,并将其内容模型直接放置在user的内容模型中。

代码语言:javascript
复制
<?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。例如,请参见

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66283196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档