给定模式(匿名化,重命名关键点,其余部分省略):
<?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'.
为什么呢?根据W3Schools,all
元素:
“all元素指定子元素可以按任何顺序出现,并且每个子元素可以出现零次或一次。”
省略a_scalar_property
与将其包括零次相同。为什么这个文件无法验证?
并且不要说“发布完整代码”之类的内容 - 这不是我的IP,我有充分的理由对其进行匿名处理。除此之外别无他法,我用这个最小的例子进行了测试,结果相同。
答案 0 :(得分: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>
答案 1 :(得分:2)
要使元素可选,minOccurrs属性应为0,即使在&lt; all&gt;中也是如此组。从阅读XML模式规范中获得这一点非常麻烦,但依赖w3schools并不是一个好的选择。