Схема XSD: переопределить унаследованный элемент базового complexType - PullRequest
1 голос
/ 15 июня 2011

Мы начали использовать схемы для генерации классов 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 голосов
/ 15 июня 2011

Ваш сложный тип с именем Клиент , который вы указываете как имеющий элемент с именем Компания , расширяет ClientBase , который уже содержит элемент с именем Company (который имеет тип CompanyBase.) Следовательно, у вас есть избыточность в именах ваших элементов.

Также: для ваших сложных типов я рекомендую следовать соглашению об именах в ваших схемах, которое поясняет, чтоявляются типами, а не глобальными элементами.То есть назовите ваши сложные типы как [Typename] Тип , а не [Typename] .В долгосрочной перспективе это делает вещи намного менее запутанными, и вы также можете избежать конфликтов имен с вашими глобальными элементами.

...