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 验证之前转换输入以将弃用的形式转换为其目标形式。