XSD架构:重写基complexType的继承元素

本文关键字:继承 元素 complexType 架构 重写 XSD | 更新日期: 2023-09-27 17:59:20

我们已经开始使用模式为我们生成C#类,我基本上是在尝试复制一个覆盖了从基类继承的成员的类。我已经做了很多搜索,对XSD还很陌生,所以我不知道我是做错了还是不可能。下面是一个我正在努力实现的简单例子。

<xs:complexType name="ClientBase" abstract="true">
    <xs:sequence>
      <xs:element name="Company" type="CompanyBase" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>  
  </xs:complexType>
  <xs:complexType name="CompanyBase" abstract="true">
    <xs:attribute name="Id" type="xs:int" use="required" />
  </xs:complexType>
  <xs:complexType name="Company">
    <xs:complexContent>
      <xs:extension base="CompanyBase">
        <xs:attribute name="PartnerId" type="xs:int" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Client">
    <xs:complexContent>
      <xs:extension base="ClientBase">
        <xs:sequence>
          <!-- error occurs here -->
          <xs:element name="Company" type="Company" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

这显然不起作用,因为它在我的客户端类型上爆炸了,给了我一个错误,即"元素‘Company’的多重定义导致内容模型变得模糊"。

我的目标是最终得到代表这一点的东西。

    public abstract class CompanyBase
    {
        public int Id { get; set; }
    }
    public class Company : CompanyBase
    {
        public int PartnerId { get; set; }
    }
    public abstract class ClientBase
    {
        public CompanyBase[] Company { get; set; }
    }
    public class Client : ClientBase
    {
        new public Company[] Company { get; set; }
    }

如有任何帮助,我们将不胜感激。

XSD架构:重写基complexType的继承元素

名为Client的复杂类型,您将其指定为具有名为Company元素,它扩展了ClientBase,后者已经包含名为Company[/strong>的元素(类型为CompanyBase)。因此,元素名称中存在冗余。

另外:对于您的复杂类型,我建议在模式中遵循命名约定,明确它们是类型,而不是全局元素。也就是说,将复杂类型命名为[Typename]Type,而不是[Typename]。从长远来看,它使事情不那么令人困惑,并且还可以避免与全局元素的名称冲突。