Xml XSD Schema:MaxOccurs位于xs:all下的引用元素上

Xml XSD Schema:MaxOccurs位于xs:all下的引用元素上,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,问题是我使用XS:all是因为元素可以是任何顺序。我无法在引用的元素上放置maxoccurs: <xs:element name="PersonInfo"> <xs:complexType> <xs:all> <xs:element name="Addr" type="AdressType" minOccurs="0" maxOccurs="unbounded" /> <

问题是我使用XS:all是因为元素可以是任何顺序。我无法在引用的元素上放置maxoccurs:

    <xs:element name="PersonInfo">
    <xs:complexType>
        <xs:all>
            <xs:element name="Addr" type="AdressType" minOccurs="0" maxOccurs="unbounded" />

        </xs:all>
        <xs:attribute name="id" type="xs:ID" use="optional" />
        <xs:attribute name="Test" type="xs:string" use="optional" />

    </xs:complexType>
</xs:element>

<xs:complexType name="AdressType">
    <xs:all>
        <xs:element name="BuildingAptNumber" type="xs:string" minOccurs="0" />
        <xs:element name="Addr1" type="xs:string" minOccurs="0" />
        <xs:element name="City" type="xs:string" minOccurs="0" />
        <xs:element name="StateProvCd" type="xs:string" minOccurs="0" />
        <xs:element name="PostalCode" type="xs:string" minOccurs="0" />
    </xs:all>
    <xs:attribute name="AddrTypeCd" type="xs:string" use="optional" />
</xs:complexType>

如果元素没有被引用,我就可以不用使用ComplexType了。有没有办法引用元素并在xs:all下使用maxoccurs

编辑:添加maxoccurs的唯一方法是使用complextype并在complextype中定义xs:choice:

        <xs:element name="Test" minOccurs="0">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded">
                        <xs:element name="Addr" type="PMICADDRESS"/>
                    </xs:choice>
                </xs:complexType>

            </xs:element>

所以问题是我不知道如何声明addr元素的复杂类型。我找到的一个解决方案是更改为XSD1.1。我无法更新到XSD1.1。然而我发现了一条有帮助的线索:

如果这个元素没有被引用,我就可以侥幸逃脱 使用ComplexType

否,您仍然不能在
xs:all
下的
xs:element
上使用
maxOccurs=“unbounded”

是否有任何方法引用元素并使maxoccurs处于 xs:全部

否,
xs:all
下的
xs:element
只能是0或1


评论中关于xs:choice想法的更新

我可以使用
xs:choice
创建元素而不是引用 现有的一个(不理想,因为参考使用了多个点)。我是 试图找出是否有方法使用对 元素具有
xs:choice

如果您的首要任务是避免排序,并且仍然允许在
PersonInfo
下有多个
Addr
元素,那么可以使用
xs:choice
maxOccurs=“unbounded”



但是,请注意,与使用
xs:all
不同,此处可以省略
Addr
e1
e2
。在此特定配置中,
e1
e2
也可以重复出现。如果希望探索其他组合,请参阅
xsd:choice
及其
xsd:element
子项上的
maxOccurs
如何解释。最后,您可以将
xs:all
元素分隔在一组有序元素之前或之后,您可以允许基数大于1。

XSD 1.1中删除了对xs:all的maxOccurs=“1”限制。您可以选择使用XSD1.1处理器吗?据我所知,目前有三种:撒克逊、薛西斯和阿尔托瓦。

MSDN说," . 我也得到了一个错误。我正在使用visual studio和C#code进行XSD验证。您的MSDN引用适用于
xs:all
元素本身,而不是它的
xs:element
子元素,正如我所述,它们的
maxOccurs
值可能为0或1。(旁白:关于XML标准的讨论,请引用W3C,而不是MSDN。)更重要的是,
unbounded
不能用作
xs:all
xs:element
上的
maxOccurs
的值。希望这有帮助。谢谢,我理解你的意思,XS:element嵌套在XS:all中。错误发生在xs:element上。使用xs;sequence会解决这个问题,但是元素可以以任何顺序出现(这就是我使用xs:all的原因)。我知道不能在xs:all下的xs:element上使用maxOccurs(这篇文章的首要原因)。我在寻找另一种选择。我可以使用xs:choice创建元素,而不是引用现有的元素(不理想,因为引用使用了多个点)。我正在试图找出是否有一种方法可以使用xs:choice引用元素我已经为您更新了答案,以解决使用
xs:choice
的可能性。感谢您的更新,不幸的是,如果不使用复杂类型,我无法在xs:all下使用xs:choice。更新了我的问题,并举例说明问题的原因。谢谢Michael。我正在调查。
  <xs:choice maxOccurs="unbounded">
    <xs:element name="Addr" type="AdressType"/>
    <xs:element name="e1"/>
    <xs:element name="e2"/>
  </xs:choice>