问题描述
|
从逐年发展的XSD / XML开始,我想编写一个更简单的XSD,仅定位不会被修改或删除的元素,这些元素可以从完整的XSD验证XML。
为了简单起见:
使用此XML:
<root>
<unkNown1/>
<kNown2/>
<unkNown2/>
<kNown1/>
<unkNown3/>
<unkNown4/>
</root>
和这个XSD:
<xsd:schema>
<xsd:element name=\"root\">
<xsd:all>
<xsd:element name=\"unkNown1\" minOccurs=\"0\"/>
<xsd:element name=\"unkNown2\" minOccurs=\"0\"/>
<xsd:element name=\"unkNown3\" minOccurs=\"0\"/>
<xsd:element name=\"unkNown4\" minOccurs=\"0\"/>
<xsd:element name=\"kNown1\" minOccurs=\"0\"/>
<xsd:element name=\"kNown2\" minOccurs=\"0\"/>
</xsd:all>
</xsd:element name=\"root\">
</xsd:schema>
我想做类似的事情:
<xsd:schema>
<xsd:all>
<xsd:any processControl=\"skip\" />
<xsd:element name=\"kNown1\" />
<xsd:element name=\"kNown2\" />
</xsd:schema>
此XSD无效,因为xsd:any
只能出现在xsd:sequence
或xsd:choice
中
我想知道如何使用类似的简单XSD验证原始XML文件
解决方法
您可以使known1,ѭ2和ѭ7
xs:choice
,并将maxOccurs
设置为unbounded
。
编辑:这仍然只处理可选情况,但是我意识到您不必将ѭ6嵌套在ѭ11中。
,这是一个允许
<known1>
和<known2>
元素之间的自由顺序
省略<known1>
或<known2>
(或两者都省略)
在它们之前,之后或之间的任何其他元素的数量不受限制
请注意,必须将“ 16”允许的元素限制为“ 12”或“ 13”以外的其他名称空间。否则,架构将变得明确,因为ѭ16还将允许<known1>
或<known2>
。还要注意的另一件事是,在这里我们有时需要在<xs:choice>
或<xs:sequence>
上设置minOccurs
属性,以保持架构的确定性。
<xs:schema elementFormDefault=\"qualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">
<xs:element name=\"root\">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" namespace=\"##other\" processContents=\"skip\" />
<xs:choice minOccurs=\"0\">
<xs:sequence>
<xs:element name=\"known1\" />
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" namespace=\"##other\" processContents=\"skip\" />
<xs:sequence minOccurs=\"0\">
<xs:element name=\"known2\" />
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" namespace=\"##other\" processContents=\"skip\" />
</xs:sequence>
</xs:sequence>
<xs:sequence>
<xs:element name=\"known2\" />
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" namespace=\"##other\" processContents=\"skip\" />
<xs:sequence minOccurs=\"0\">
<xs:element name=\"known1\" />
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" namespace=\"##other\" processContents=\"skip\" />
</xs:sequence>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
,简短的答案:使用XSD 1.1
这样您的建议就会生效。更加具体:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:vc=\"http://www.w3.org/2007/XMLSchema-versioning\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\" vc:minVersion=\"1.1\">
<xs:element name=\"root\" type=\"root\"/>
<xs:complexType name=\"root\">
<xs:all>
<!-- Required -->
<xs:element name=\"known1\" type=\"xs:string\"/>
<!-- Optional -->
<xs:element name=\"known2\" type=\"xs:string\" minOccurs=\"0\"/>
<xs:element name=\"known3\" type=\"xs:string\" minOccurs=\"0\"/>
<!-- Unknown -->
<xs:any minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"skip\"/>
</xs:all>
</xs:complexType>
</xs:schema>