2013-02-12 3 views
1

Я встречаю очень странную ошибку при использовании Svcutil для преобразования XSD в объекты C#.SVCUTIL Ошибка при экспорте элемента XSD - maxoccurs must = 1

Вот мой 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, даже один который является коллекцией.

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

ответ

0
<?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 - how to allow elements in any order any number of times?

+0

Спасибо, но я боюсь, что ни один из двух вариантов не работает. В Варианте 1 я получаю сообщение об ошибке «maxOccurs» в корневой папке должно быть 1. Если я перейду на , он вернется к исходной ошибке для 'TestResult' , Для варианта 2 Я получаю сообщение о том, что maxOccurs в группе «все» должно быть 0 или 1. – maurocam

+0

@maurocam обновил ответ. –

+0

Боюсь, альтернатива, которую вы предлагаете, также не работает. Я получаю сообщение об ошибке, которое, как представляется, указывает на то, что «TestResults» в качестве корневого элемента не может иметь вложенных последовательностей: Ошибка: тип «TestResults» в пространстве имен «» не может быть импортирован. Корневая последовательность должна содержать только локальные элементы. Группа ref, choice, любые и вложенные последовательности не поддерживаются. Либо измените схему, чтобы типы могли сопоставлять типы контрактов данных, либо использовать ImportXmlType или использовать другой сериализатор. – maurocam

0

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

После различных попыток ниже показано, как я, наконец, получил его на работу. Мне пришлось добавить промежуточный элемент, содержащий мою коллекцию 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> 
+0

Но вы добавлены с новым элементом