SVCUTIL Ошибка при экспорте элемента XSD - maxoccurs must = 1

Я столкнулся с очень странной ошибкой при использовании Svcutil для преобразования XSD в объекты C #.

Вот мой XSD

<xs:element name="TestResults">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="TestResult" type="TestResultType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="atoken" type="IdentifierType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Когда я запускаю Svcutil, я получаю сообщение об ошибке

D:\CambridgeAssessment\Documents\CA\BeaconSchemas-20130211>svcutil /dconly testResults.1.0.xsd

Error: Type 'TestResults' in namespace 'http://ucles/schema/ukba/TestResults/1/0
' cannot be imported. 'maxOccurs' on element 'TestResult' must be 1. Either chan
ge the schema so that the types can map to data contract types or use ImportXmlT
ype or use a different serializer.


If you are using the /dataContractOnly option to import data contract types and
are getting this error message, consider using xsd.exe instead. Types generated
by xsd.exe may be used in the Windows Communication Foundation after applying th
e XmlSerializerFormatAttribute attribute on your service contract. Alternatively
, consider using the /importXmlTypes option to import these types as XML types t
o use with DataContractFormatAttribute attribute on your service contract

Если я установлю атрибут TestResult 'maxOccurs' = 1, все будет работать нормально. Он также работает с атрибутом 'TestResult' maxOccurs '=' unbounded ', если я полностью удалю элемент' atoken '.

Просмотр ссылки на схему для DataContractSerializer , Я обнаружил следующее:

<xs:element> can occur in the following contexts:

It can occur within an <xs:sequence>, which describes a data member of a regular (non-collection) data contract. In this case, the maxOccurs attribute must be 1. (A value of 0 is not allowed).

It can occur within an <xs:sequence>, which describes a data member of a collection data contract. In this case, the maxOccurs attribute must be greater than 1 or "unbounded".

Итак, похоже, что в моем конкретном XSD Svcutil считает, что ОБЕИХ элементах должно быть 'maxOccurs' = 1, даже тот, который является коллекцией.

Это правильное поведение? Или я что-то не так делаю?


person maurocam    schedule 12.02.2013    source источник


Ответы (2)


Спасибо за предложения, как решить проблему.

После различных попыток я, наконец, заставил его работать. Мне пришлось добавить промежуточный элемент, содержащий мою коллекцию TestResult. Таким образом, моя внешняя последовательность содержит два элемента, которые являются «простыми» элементами (хотя на самом деле это не так).

<xs:element name="TestResults">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Token" type="IdentifierType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="TestResultList">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="TestResult" type="TestResultType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
person maurocam    schedule 13.02.2013
comment
Но у вас добавлен новый элемент ‹xs: element name = TestResultList› - person Kanagavelu Sugumar; 13.02.2013

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">   
<xs:element name="TestResults" >
<xs:complexType>
<xs:sequence>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="TestResult" type="xs:string"/>
        <xs:element name="atoken" type="xs:string"/>
    </xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Взгляните на XSD - как разрешить элементы в любом порядке любое количество раз?

person Kanagavelu Sugumar    schedule 12.02.2013
comment
Спасибо, но боюсь, что ни один из двух вариантов не сработает. В варианте 1 ‹xs: sequence› я получаю сообщение об ошибке «maxOccurs» в корне должно быть 1. Если я перейду на ‹xs: sequence maxOccurs = 1›, то вернется к моей исходной ошибке для «TestResult». Для варианта 2 ‹xs: all› Я получаю сообщение об ошибке, в котором указано, что maxOccurs в группе «все» должно быть 0 или 1. - person maurocam; 12.02.2013
comment
Боюсь, что предложенная вами альтернатива также не сработает. Я получаю сообщение об ошибке, которое, кажется, указывает на то, что «TestResults» в качестве корневого элемента не может иметь вложенных последовательностей: Ошибка: тип «TestResults» в пространстве имен «не может быть импортирован. Корневая последовательность должна содержать только локальные элементы. Ссылка группы, выбор, любые и вложенные последовательности не поддерживаются. Либо измените схему, чтобы типы можно было сопоставить с типами контрактов данных, либо используйте ImportXmlType, либо используйте другой сериализатор. - person maurocam; 13.02.2013
comment
@maurocam Coul, пожалуйста, выложите здесь всю схему? - person Kanagavelu Sugumar; 13.02.2013
comment
Извините, я не могу опубликовать всю схему, так как это конфиденциально. Потребуется время, чтобы сделать его универсальным. Ключевым моментом является то, что TestResult - это типизированная коллекция TestResultType, а не xs: string, как вы указываете. - person maurocam; 13.02.2013
comment
@maurocam я думаю; если вы пробовали все вышеупомянутые обновления; если все еще не работает, проблема не в XSD. Нужно проверить парсером и XML. Наконец, я добавил строку для проверки XSD со своей стороны, а во время тестирования вы можете изменить ее на свою. Пока! - person Kanagavelu Sugumar; 13.02.2013
comment
Спасибо за вашу помощь. Предложение о последовательностях вложенности привело меня к решению. - person maurocam; 13.02.2013
comment
@maurocam, если позволяет время. Не могли бы вы попробовать ‹xs: choice› в update_2 - person Kanagavelu Sugumar; 13.02.2013