2013-02-12 1 views
1

Je rencontre une erreur très étrange lors de l'utilisation de Svcutil pour convertir XSD en objets C#.SVCUTIL Erreur lors de l'exportation de l'élément XSD - maxoccurs must = 1

Voici mon 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> 

Quand je lance Svcutil l'erreur que je reçois est

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 

Si je mets l'attribut 'TestResult' 'maxOccurs' = 1, tout cela fonctionne très bien. Cela fonctionne également avec l'attribut 'TestResult' 'maxOccurs' = 'unbounded' si je supprime complètement l'élément 'atoken'.

regardant le schéma refernce pour DataContractSerializer, je trouve ce qui suit:

<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". 

Ainsi, il ressemble à mon XSD particulier Svcutil pense que les deux éléments devraient avoir « maxOccurs » = 1, même la qui est une collection.

Est-ce que ce comportement est correct? Ou est-ce que je fais quelque chose de mal?

Répondre

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> 

S'il vous plaît jeter un oeil à XSD - how to allow elements in any order any number of times?

+0

Merci, mais je crains qu'aucune des 2 options ne fonctionne. Dans l'option 1 , j'obtiens une erreur disant que 'maxOccurs' sur la racine doit être 1. Si je change en cela revient alors à mon erreur d'origine pour 'TestResult' . Pour l'option 2 , j'obtiens une erreur indiquant que maxOccurs dans un groupe 'all' doit être 0 ou 1. – maurocam

+0

@maurocam a mis à jour la réponse. –

+0

J'ai peur que l'alternative que vous suggérez ne fonctionne pas. J'obtiens une erreur qui semble indiquer que 'TestResults' en tant qu'élément racine ne peut pas avoir de séquences imbriquées: Erreur: Le type 'TestResults' dans l'espace de noms '' ne peut pas être importé. La séquence racine ne doit contenir que des éléments locaux. Groupe Les séquences ref, choice, any et nested ne sont pas supportées. Modifiez le schéma afin que les types puissent correspondre aux types de contrat de données ou utiliser ImportXmlType ou utiliser un sérialiseur différent. – maurocam

0

Merci pour les suggestions sur la façon de résoudre le problème.

Après plusieurs tentatives, voici comment j'ai finalement réussi à le faire fonctionner. J'ai dû ajouter un élément intermédiaire qui contient ma collection 'TestResult'. De cette façon, ma séquence externe contient deux éléments qui sont tous deux des éléments «simples» (bien qu'ils ne le soient pas vraiment)

<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

Mais vous êtes ajouté avec un nouvel élément

Questions connexes