【发布时间】:2011-03-15 17:27:40
【问题描述】:
我有以下 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 中表达的限制:
- 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 作为替代方案
标签: xml xsd relaxng schematron