xs:any可以放在XSD的xs:all元素中吗?

时间:2018-07-22 22:14:03

标签: xml xsd xsd-validation xml-validation svcutil.exe

我正在尝试从提供的XSD生成数据协定。 pch2向我抛出此错误:

  

在此上下文中不支持Svcutil.exe元素。“

在XSD中,类型'http://www.w3.org/2001/XMLSchema:any'的元素出现了两次。这是它第一次出现。

any

根据我对此的研究,似乎 <xs:element minOccurs="0" maxOccurs="1" name="Markup"> <xs:complexType> <xs:all> <xs:any processContents="lax" /> </xs:all> </xs:complexType> </xs:element> </xs:all> </xs:complexType> 不能包含在xs:any元素中。但是我找不到能确切说明这一点的规格或等效物。

xs:all是否可以出现在xs:any中?还是无效?

2 个答案:

答案 0 :(得分:2)

XSD 1.0

xs:any cannot在XSD的xs:all中:

<all
  id = ID
  maxOccurs = 1 : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, element*)
</all>

但是xs:any可以位于xs:choicexs:sequence中:

<choice
  id = ID
  maxOccurs = (nonNegativeInteger | unbounded)  : 1
  minOccurs = nonNegativeInteger : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (element | group | choice | sequence | any)*)
</choice>

<sequence
  id = ID
  maxOccurs = (nonNegativeInteger | unbounded)  : 1
  minOccurs = nonNegativeInteger : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (element | group | choice | sequence | any)*)
</sequence>

因此,您可以将xs:all包裹在xs:choicexs:sequence中,例如:

  <xs:element minOccurs="0" maxOccurs="1" name="Markup">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="lax" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

并且您的XSD遵守允许的内容模型。

XSD 1.1

xs:any can在XSD的xs:all中:

<all
  id = ID
  maxOccurs = (0 | 1) : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (element | any | group)*)
</all>

但是,请注意,XSD处理器必须符合 XSD 1.1 ;您发布的错误表明您的工具仅支持 XSD 1.0

答案 1 :(得分:0)

xs:any是否可以出现在XSD的xs:all类型下,我仍然不知道。但是我现在知道,根据https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-schema-reference,您不能使用svcutil从XSD生成数据协定。

xs:complexType内容专门将xs:all列为禁止....。因此,我的XSD永远不会与svcutil.exe生成数据协定。