导出XSD元素时发生SVCUTIL错误-maxoccurs必须=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:CambridgeAssessmentDocumentsCABeaconSchemas-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,则一切正常。如果我完全删除了"atoken"元素,它也可以与"TestResult"属性"maxOccurs"="unbounded"一起使用。

查看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认为BOTH元素应该具有"maxOccurs"=1,即使是作为集合的元素。

这种行为正确吗?还是我做错了什么?

感谢您提供有关如何解决问题的建议。

经过各种尝试,以下是我如何最终使其发挥作用的。我不得不添加一个中间元素来保存我的"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>
<?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-如何允许元素以任意顺序任意次数出现?

最新更新