这个XML结构可以用XSD表示吗?其他验证选项?

时间:2011-03-15 17:27:41

标签: xml xsd relaxng schematron

我有以下XML文档结构已经在生产中且无法更改:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root xmlns="http://www.domain_name.com/MySchema">
    <optionalString1>a</optionalString1>
    <optionalString2>b</optionalString2>
    <optionalDependee1>c</optionalDependee1>
    <dependent1_1>d</dependent1_1>
    <dependent1_2>e</dependent1_2>
    <optionalString3>f</optionalString3>
    <optionalDependee2>g</optionalDependee2>
    <dependent2_1>h</dependent2_1>
    <dependent2_2>i</dependent2_2>
    <!-- more and more elements -->
</root>

以下是我试图在XSD中表达的限制:

  1. XML元素可以按任何顺序出现。
  2. “optionalStringX”和“optionalDependeeX”可能存在也可能不存在于给定文件中。
  3. 如果存在“optionalDependeeX”,则“dependentX_1”和“dependentX_2”必须存在。否则,如果“optionalDependeeX”不存在,则“dependentX_1”和“dependentX_2”都不会出现。
  4. 我尝试过使用'complexType'和'group'的几个版本,但它们不是有效的XSD(至少根据VS2010)。我的“小组”实施是这样的:

    <xs:schema>
    
    <xs:group name="BaseGroup">
      <xs:all>
        <xs:element name="optionalString1" type="xs:string" minOccurs="0" />
        <xs:element name="optionalString2" type="xs:string" minOccurs="0" />
        <xs:element name="optionalString3" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:group>
    
    <xs:group name="DependentGroup1">
      <xs:all>
        <xs:element name="optionalDependee1" type="xs:string" minOccurs="1" />
        <xs:element name="dependent1_1" type="xs:string" minOccurs="1" />
        <xs:element name="dependent1_2" type="xs:string" minOccurs="1" />
      </xs:all>
    </xs:group>
    
    <xs:group name="DependentGroup2">
      <xs:all>
        <xs:element name="optionalDependee2" type="xs:string" minOccurs="1" />
        <xs:element name="dependent2_1" type="xs:string" minOccurs="1" />
        <xs:element name="dependent2_2" type="xs:string" minOccurs="1" />
      </xs:all>
    </xs:group>
    
    <xs:group name="Combo1">
      <xs:all>
        <!-- The 'http://www.w3.org/2001/XMLSchema:group'
             element is not supported in this context. -->
        <xs:group ref="BaseGroup"/>
        <xs:group ref="DependentGroup1"/>
      </xs:all>
    </xs:group>
    
    <xs:group name="Combo2">
      <xs:all>
        <!-- The 'http://www.w3.org/2001/XMLSchema:group'
             element is not supported in this context. -->
        <xs:group ref="BaseGroup"/>
        <xs:group ref="DependentGroup1"/>
        <xs:group ref="DependentGroup2"/>
      </xs:all>
    </xs:group>
    
    <xs:complexType name="RootType">
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:group ref="BaseGroup" />
        <xs:group ref="Combo1" />
        <xs:group ref="Combo2" />
      </xs:choice>
    </xs:complexType>
    
    <xs:element name="root" type="RootType" />
    
    </xs:schema>
    

    我是用于验证XML的模式的新手,并且一直认为XSD足够灵活,可以表示所有有效XML的结构。如果我可以重写XML文件的结构,我将使dependentX_1和d​​ependentX_2成为optionalDependeeX的属性或子元素,因为它们表示依赖关系。

    1. 这些限制可以在XSD架构中表示吗?我们试图坚持使用XSD,因为我的理解是它的工具和支持比其他验证解决方案更广泛。
    2. 如果没有,那么其他XML验证器在Python,Perl和C或C ++中是否有很好的支持,并且可以处理比XSD更复杂的文档结构? RelaxNG或Schematron会很合适吗?优点和缺点?除了XSD,我从未使用过任何东西。

2 个答案:

答案 0 :(得分:1)

正如你已经正确完成的那样,可以使用xsd:all来放宽顺序,但不支持你尝试做的其他事情。 next version of XML Schema,即1.1,可以支持您拥有的其他一些变体。但1.1不是最终的,并没有很多图书馆能够理解这一点。我建议你看一下schematron,看看这是否有帮助。

答案 1 :(得分:1)

  到目前为止,

总是假设XSD足够灵活,可以表示所有有效XML的结构

不,这与事实相差甚远 - 至少对于XSD 1.0而言。事实上,如果你想允许元素以任何顺序出现,你可以施加的限制很少,除了说哪些元素必须出现以及哪些元素是可选的。