У меня есть следующая структура документа 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 могут появляться в любом порядке.
- «AdditionalStringX» и «AdditionalDependeeX» могут присутствовать или отсутствовать в данном файле.
- Если присутствует параметр «AdditionalDependeeX», то ТРЕБУЕТСЯ, чтобы «зависимый Х_1» и «зависимый Х_2» присутствовали. В противном случае, если «AdditionalDependeeX» не присутствует, не будет присутствовать ни «independentX_1», ни «independentX_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, я бы сделал зависимые X_1 и зависимые X_2 либо атрибутами, либо подэлементами необязательного элемента DedededeX, поскольку они выражали бы зависимые отношения.
- Могут ли эти ограничения быть представлены в схеме XSD? Мы стараемся придерживаться XSD, если это возможно, поскольку, насколько я понимаю, инструменты и поддержка для него гораздо более распространены, чем другие решения для проверки.
- Если нет, то какой другой валидатор XML имеет хорошую поддержку в Python, Perl и C или C ++ и может обрабатывать более сложные структуры документов, чем XSD? Подойдет ли RelaxNG или Schematron? Плюсы и минусы? Я никогда не использовал ничего кроме XSD.