XMLSchemaSet的XML验证错误
我有一个模式如下:XMLSchemaSet的XML验证错误,xml,xsd,xml-parsing,xml-serialization,xsd-validation,Xml,Xsd,Xml Parsing,Xml Serialization,Xsd Validation,我有一个模式如下: <?xml version="1.0" encoding="utf-8"?> <xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Leaf" /> <xs:complexType nam
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Leaf" />
<xs:complexType name = "Leaf" mixed="true">
<xs:attribute name="ID" type="xs:string" />
</xs:complexType>
<xs:element name="Frame" />
<xs:complexType name="Frame" mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Leaf" type ="Leaf" nillable="true"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" nillable="true"/>
</xs:sequence>
<xs:attribute name="ID" type="xs:string" />
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="Version" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="MetaData1" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="MetaData2" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Version>1.1</Version>
<MetaData1>Somemetadata</MetaData1>
<Page>Page1
<Frame ID="1">Frame1
<Frame ID="2">SubFrame1
<Frame ID="3">SubFrame2
<Leaf ID="1">Alone</Leaf>
</Frame>
<Leaf ID="2">Alone2</Leaf>
</Frame>
</Frame>
<Frame ID="3">SubFrame3
</Frame>
</Page>
<MetaData2 />
</Document>
基本上它是一个递归结构。文档可以有一个页面列表。它必须至少包含1页。页面由框架列表组成。帧可以有子帧或叶(即不能包含子帧)。MetaData1和MetaData2是可选的,可以出现在任何地方
示例XML如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Leaf" />
<xs:complexType name = "Leaf" mixed="true">
<xs:attribute name="ID" type="xs:string" />
</xs:complexType>
<xs:element name="Frame" />
<xs:complexType name="Frame" mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Leaf" type ="Leaf" nillable="true"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" nillable="true"/>
</xs:sequence>
<xs:attribute name="ID" type="xs:string" />
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="Version" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="MetaData1" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="MetaData2" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Version>1.1</Version>
<MetaData1>Somemetadata</MetaData1>
<Page>Page1
<Frame ID="1">Frame1
<Frame ID="2">SubFrame1
<Frame ID="3">SubFrame2
<Leaf ID="1">Alone</Leaf>
</Frame>
<Leaf ID="2">Alone2</Leaf>
</Frame>
</Frame>
<Frame ID="3">SubFrame3
</Frame>
</Page>
<MetaData2 />
</Document>
1.1
一些元数据
第1页
框架1
子帧1
子帧2
单独地
孤独的
子帧3
我使用XmlReaderSettings和XmlSchemaSet对模式进行XML验证。出于某种原因,我得到以下两个错误:
1) {“元素“Document”的子元素“Metadata2”无效。可能的元素列表应为:'Page'。”
我认为这是因为它是按顺序读取的,而在我的例子中,这些元素可以以任何顺序出现。我尝试过使用xs:all属性,但它不适用于maxoccurs=unbounded。还有别的办法吗
2) {“元素'Frame'的子元素'Leaf'无效。可能的元素列表应为:'Frame'。”
这可能与(1)相同吗?叶ID=2时出错
任何帮助都将不胜感激。谢谢您使用的是Microsoft.NET,这意味着您只能使用XSD 1.0提供的功能
xs:all
合成器仅支持带有maxOccurs=“1”
的粒子。这是你的第一个问题
您的模式显然没有捕捉到MetaData1
和MetaData2
可以出现在任何地方的事实Leaf
、Frame
和Page
根本没有这些元素。所以你得做点什么
不管怎样,你不能完全实现你想要的,正如所描述的;有些东西必须给予。您可以选择指定某些元素的位置,允许某些粒子之间存在一些变化,或者将重复元素“收拢”在“集合”项下。以页换页,以框换框,以叶换叶
另一个选项,考虑到您为元数据元素和版本提供的定义,并且不会影响“等效”ADO.NET数据集(假设它在XSD 1中是可能的),将使用属性代替。我将举例说明这种方法。如果您不确定其他选项,请告诉我,我将添加更多示例
修改的XSD:<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:complexType name = "Leaf" mixed="true">
<xs:attribute name="ID" type="xs:string"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
<xs:complexType name="Frame" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Leaf" type ="Leaf" nillable="true"/>
<xs:element name="Frame" type="Frame" nillable="true"/>
</xs:choice>
<xs:attribute name="ID" type="xs:string"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame"/>
</xs:sequence>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="metadata">
<xs:attribute name="metadata1" type="xs:string"/>
<xs:attribute name="metadata2" type="xs:string"/>
</xs:attributeGroup>
</xs:schema>
上述内容的可视化:
以及等效的ADO.NET数据集(此数据集最容易用于确认您对模型的描述):
语义上等价的XML将验证上述内容(更改最少,很容易看出使用属性的影响):
第1页
框架1
子帧1
子帧2
单独地
子帧3
上述XML的示意图:
显示有效实例的更复杂示例XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" version="version1" metadata1="metadata11" metadata2="metadata21">
<Page metadata1="metadata11" metadata2="metadata21">text<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
</Frame>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
</Frame>
</Frame>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
</Frame>
<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
</Frame>
</Frame>
</Frame>
</Page>
<Page metadata1="metadata11" metadata2="metadata21">text<Frame ID="ID1" metadata1="metadata11" metadata2="metadata21">text<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
<Leaf ID="ID1" metadata1="metadata11" metadata2="metadata21">text</Leaf>
</Frame>
</Page>
</Document>
文本文本文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本文本文本
文本
您在Microsoft.NET上,这意味着您只能使用XSD 1.0提供的功能xs:all
合成器仅支持带有maxOccurs=“1”
的粒子。这是你的第一个问题
您的模式显然没有捕捉到MetaData1
和MetaData2
可以出现在任何地方的事实Leaf
、Frame
和Page
根本没有这些元素。所以你得做点什么
不管怎样,你不能完全实现你想要的,正如所描述的;有些东西必须给予。您可以选择指定某些元素的位置,允许某些粒子之间存在一些变化,或者将重复元素“收拢”在“集合”项下。以页换页,以框换框,以叶换叶
另一个选项,考虑到您为元数据元素和版本提供的定义,并且不会影响“等效”ADO.NET数据集(假设它在XSD 1中是可能的),将使用属性代替。我将举例说明这种方法。如果您不确定其他选项,请告诉我,我将添加更多示例
修改的XSD:<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:complexType name = "Leaf" mixed="true">
<xs:attribute name="ID" type="xs:string"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
<xs:complexType name="Frame" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Leaf" type ="Leaf" nillable="true"/>
<xs:element name="Frame" type="Frame" nillable="true"/>
</xs:choice>
<xs:attribute name="ID" type="xs:string"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="Page" nillable="false">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Frame" type="Frame"/>
</xs:sequence>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required"/>
<xs:attributeGroup ref="metadata"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="metadata">
<xs:attribute name="metadata1" type="xs:string"/>
<xs:attribute name="metadata2" type="xs:string"/>
</xs:attributeGroup>
</xs:schema>
上述内容的可视化:
以及等效的ADO.NET数据集(此数据集最容易用于确认您对模型的描述):
T