2011-03-15 48 views
0

我有下面的XML文档结构已在生产,不能更改:这个XML结构可以用XSD表示吗?其他验证选项?

<?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”。

我已经尝试了使用'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之外的任何东西
+0

不,您不能在XSD中执行此操作,例如“如果元素X存在,那么元素Y必须存在”不能用XML模式表示。查看Schematron或RelaxNG作为选择 – 2011-03-15 17:30:56

回答

1

正如您已经正确完成的那样,使用xsd:all可以放松排序,除了您尝试执行的其他操作不被支持。 next version of XML Schema,它是1.1,可以支持你有的其他变体。但1.1并不是最终的,并且没有许多图书馆能够理解这一点。我建议你看看schematron,看看是否有帮助。

1

一直假定直到现在XSD足够灵活,以代表所有有效的XML

不,那是离真相很远的结构 - 至少对于XSD 1.0。事实上,如果你想让元素以任何顺序出现,除了说明哪些元素必须出现以及哪些是可选的外,你可以施加的限制很少。