【发布时间】:2018-07-04 11:04:23
【问题描述】:
我在通过 XSD 模式进行 XML 验证方面遇到问题。 假设我有以下结构:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Category1>
<Elementb>a</Elementb>
<Element2>1</Element2>
<Element3>1.0</Element3>
</Category1>
<Category2>
<Element4>b</Element4>
<Element5>c</Element5>
</Category2>
</Root>
还有以下架构:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
<xs:element name="Root">
<xs:complexType>
<xs:all>
<xs:element name="Category1" type="category1Type" minOccurs="0"/>
<xs:element name="Category2" type="category2Type" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType name="category1Type">
<xs:all>
<xs:element name="Element1" type="xs:token" minOccurs="0"/>
<xs:element name="Element2" type="xs:integer" minOccurs="0"/>
<xs:element name="Element3" type="xs:decimal" minOccurs="0"/>
</xs:all>
</xs:complexType>
<xs:complexType name="category2Type">
<xs:all>
<xs:element name="Element4" type="xs:token" minOccurs="0"/>
<xs:element name="Element5" type="xs:token" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:schema>
好的,“Elementb”未验证,因为它未在架构中定义。这是故意的。 假设我们使用以下代码进行验证:
foreach (XmlNode rootNode in document)
{
foreach (XmlNode category in rootNode)
{
foreach (XmlElement element in category)
{
document.Validate(ValidationCallBack, element);
}
}
}
意思是我希望逐个元素地进行验证。问题在于,在这种情况下,不仅<Elementb> 在调用 Validate 时会引发异常,而且该类别中的以下元素也会引发异常。这是为什么?我错过了什么?我认为通过使用xs:all 和minOccurs="0",顺序并不重要,并且由于缺少<Element1>,<Element2> 也应该验证。有任何想法吗?谢谢。
【问题讨论】:
标签: xml xsd xsd-validation