XSD 验证 XML 可能简单也可能复杂的节点
XSD validation of XML node that could be simple or could be complex
给定一个 XML 节点可以是
<Uninstall id="Text">{GUID}</Uninstall>
或
<Uninstall id="Text">
<File>PATH TO EXECUTABLE</File>
<Arguments>ARGUMENTS</Arguments>
</Uninstall>
我正在尝试用 XSD 验证这一点。我有这个
<xs:complexType name = 'Uninstall'>
<xs:choice>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:attributeGroup ref='Task_Attributes'/>
<xs:attributeGroup ref='Directive_Attributes'/>
</xs:extension>
</xs:simpleContent>
<xs:complexContent>
<xs:sequence>
<xs:element name = 'File' type='xs:string' minOccurs = '1' maxOccurs='1' />
<xs:element name = 'Arguments' type='xs:string' minOccurs = '0' maxOccurs='1' />
</xs:sequence>
<xs:attributeGroup ref='Task_Attributes'/>
<xs:attributeGroup ref='Directive_Attributes'/>
</xs:complexContent>
</xs:choice>
</xs:complexType>
但是当我将模式文件添加到 [xml.xmlReaderSettings]
时 Exception calling "Add" with "2" argument(s): "The 'http://www.w3.org/2001/XMLSchema:simpleContent' element is not supported in this context."
出现错误。请注意,两个 attributeGroups 引用了可能的属性,这些属性对于简单形式和复杂形式都是相同的。所以我很确定我遇到的问题是在简单和复杂之间做出选择。但也许我也可以将 XSD 简化为只引用一次属性,因为这很常见?
我知道 XML 非常丑陋,我正在转向更一致的 XML 结构。但我需要验证当前不一致的 XML 以自动迁移到新的、更一致的 XML。
XSD 无法表达对您的数据的所有可能的约束,对于 XSD 1.0 尤其如此 - XSD 1.1 中的断言为您提供了更多的灵活性。但是这个即使在 XSD 1.1.
中也很尴尬
有时会被忽视的一个选项是针对结构的清理版本定义架构,然后在验证之前将实际实例转换为该结构。例如,如果 Uninstall
元素的一种形式被弃用并仅出于兼容性而保留,您可以在对结果进行 XSD 验证之前转换输入以将弃用的形式转换为其目标形式。
给定一个 XML 节点可以是
<Uninstall id="Text">{GUID}</Uninstall>
或
<Uninstall id="Text">
<File>PATH TO EXECUTABLE</File>
<Arguments>ARGUMENTS</Arguments>
</Uninstall>
我正在尝试用 XSD 验证这一点。我有这个
<xs:complexType name = 'Uninstall'>
<xs:choice>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:attributeGroup ref='Task_Attributes'/>
<xs:attributeGroup ref='Directive_Attributes'/>
</xs:extension>
</xs:simpleContent>
<xs:complexContent>
<xs:sequence>
<xs:element name = 'File' type='xs:string' minOccurs = '1' maxOccurs='1' />
<xs:element name = 'Arguments' type='xs:string' minOccurs = '0' maxOccurs='1' />
</xs:sequence>
<xs:attributeGroup ref='Task_Attributes'/>
<xs:attributeGroup ref='Directive_Attributes'/>
</xs:complexContent>
</xs:choice>
</xs:complexType>
但是当我将模式文件添加到 [xml.xmlReaderSettings]
时 Exception calling "Add" with "2" argument(s): "The 'http://www.w3.org/2001/XMLSchema:simpleContent' element is not supported in this context."
出现错误。请注意,两个 attributeGroups 引用了可能的属性,这些属性对于简单形式和复杂形式都是相同的。所以我很确定我遇到的问题是在简单和复杂之间做出选择。但也许我也可以将 XSD 简化为只引用一次属性,因为这很常见?
我知道 XML 非常丑陋,我正在转向更一致的 XML 结构。但我需要验证当前不一致的 XML 以自动迁移到新的、更一致的 XML。
XSD 无法表达对您的数据的所有可能的约束,对于 XSD 1.0 尤其如此 - XSD 1.1 中的断言为您提供了更多的灵活性。但是这个即使在 XSD 1.1.
中也很尴尬有时会被忽视的一个选项是针对结构的清理版本定义架构,然后在验证之前将实际实例转换为该结构。例如,如果 Uninstall
元素的一种形式被弃用并仅出于兼容性而保留,您可以在对结果进行 XSD 验证之前转换输入以将弃用的形式转换为其目标形式。