XSD架构:覆盖基础complexType的继承元素

时间:2011-06-14 21:08:43

标签: c# inheritance xsd schema xsd.exe

我们已经开始使用模式为我们生成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>

这显然不起作用,因为它在我的客户端类型上爆炸,给我一个错误“元素'公司'的多重定义导致内容模型变得模棱两可”。

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

    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; }
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您指定为具有名为公司的元素的客户端的复杂类型,扩展 ClientBase ,其已包含元素名为公司(其类型为CompanyBase。)因此,您的元素名称中存在冗余。

另外:对于您的复杂类型,我建议您在模式中遵循命名约定,以阐明它们是类型,而不是全局元素。即,将复杂类型命名为 [Typename] Type ,而不是 [Typename] 。从长远来看,它可以减少混乱,你也可以避免与全局元素发生名称冲突。