5

给定模式(匿名,重命名感兴趣的关键点,其余部分省略):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="inspec"
    targetNamespace="the_right_namespace"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="inspec">
    <xs:complexType>
      <xs:all>
        <xs:element name="a_scalar_property" type="xs:int"/>
        <xs:element name="a_collection_property">
          <xs:complexType>
            <snip>
          </xs:complexType>
        </xs:element>
        <xs:element name="another_collection_property">
          <xs:complexType>                
            <snip>
          </xs:complexType>
        </xs:element>                       
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

和实例(使用 VB xml 文字声明):

Dim xDocument = 
<x:inspec xmlns:x='the_right_namespace'>
<a_collection_property/>
<another_collection_property/>
</x:inspec>

验证失败并显示消息The element 'inspec' in namespace 'the_right_namespace' has incomplete content. List of possible elements expected: 'a_scalar_property'.

为什么?all根据 W3Schools的说法,该元素:

“all 元素指定子元素可以以任何顺序出现,并且每个子元素可以出现零次或一次。”

省略a_scalar_property与包含零次相同。为什么此文件无法验证?

并且不要说“发布完整代码”之类的东西——这不是我的 IP,我已经匿名了,这是有充分理由的。它几乎没有其他东西,我已经用这个最小的例子进行了测试,它给出了相同的结果。

4

2 回答 2

6

您需要为中minOccurs="0"的每个可选元素指定xs:all

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="inspec"
    targetNamespace="the_right_namespace"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:element name="inspec">
        <xs:complexType>
            <xs:all>
                <xs:element name="a_scalar_property" type="xs:int" minOccurs="0" />
                <xs:element name="a_collection_property" minOccurs="0">
                    <xs:complexType>
                        <!-- snip -->
                    </xs:complexType>
                </xs:element>
                <xs:element name="another_collection_property" minOccurs="0">
                    <xs:complexType>
                        <!-- snip -->
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
于 2012-07-01T10:50:07.123 回答
2

要使元素成为可选元素, minOccurrs 属性应该为 0,即使在 <all> 组中也是如此。通过阅读 XML 模式规范来获得它确实很麻烦,但是依赖 w3schools 并不是一个好的选择。

于 2012-07-01T10:48:23.447 回答