我有下面的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要表达的限制:
- XML元素可以出现在任何订单。
- “optionalStringX”和“optionalDependeeX”可能存在也可能不存在于给定的文件中。
- 如果存在“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和dependentX_2属性或optionalDependeeX的子元素,因为它们会表示依赖关系。
- 这些限制可以在XSD模式中表示吗?如果可能,我们试图坚持使用XSD,因为我的理解是,工具和对它的支持比其他验证解决方案更为广泛。
- 如果不是,还有哪些其他XML验证程序在Python,Perl和C或C++中有很好的支持,并且可以处理比XSD更复杂的文档结构? RelaxNG或Schematron会是否合适?优点和缺点?我从来没有使用过除XSD之外的任何东西
不,您不能在XSD中执行此操作,例如“如果元素X存在,那么元素Y必须存在”不能用XML模式表示。查看Schematron或RelaxNG作为选择 – 2011-03-15 17:30:56