我有以下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中表达的限制:
我尝试过使用'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的属性或子元素,因为它们表示依赖关系。
答案 0 :(得分:1)
正如你已经正确完成的那样,可以使用xsd:all来放宽顺序,但不支持你尝试做的其他事情。 next version of XML Schema,即1.1,可以支持您拥有的其他一些变体。但1.1不是最终的,并没有很多图书馆能够理解这一点。我建议你看一下schematron,看看这是否有帮助。
答案 1 :(得分:1)
到目前为止,总是假设XSD足够灵活,可以表示所有有效XML的结构
不,这与事实相差甚远 - 至少对于XSD 1.0而言。事实上,如果你想允许元素以任何顺序出现,你可以施加的限制很少,除了说哪些元素必须出现以及哪些元素是可选的。