XSD - наличие обязательных, необязательных и неограниченных элементов без ограничений по порядку
Я пытаюсь создать схему для отчета XML, которая не имеет никаких ограничений на порядок отображения элементов, но содержит элемент, который должен появиться один раз, элементы, которые могут появиться один раз, и элементы, которые могут отображаться любым числом раз.
Я создал XSD после второго ответа на этот вопрос, так как это решение (хотя и некрасивое) должно решить мою проблему. Однако использование средства Microsoft xsd.exe для создания классов для xsd или использование XmlDocument.Validate() выдало следующее предупреждение:
Предупреждение о проверке схемы: множественное определение элемента "option2" приводит к тому, что модель содержимого становится неоднозначной. Модель контента должна быть сформирована так, чтобы...
Ошибка в строке 21, во второй раз в опциях xsd появляется "option2".
Ниже приводится то, что у меня было для моей версии второго ответа на вопрос, на который я ссылался ранее.
<xs:group name="unboundedElements">
<xs:choice>
<xs:element name="unbounded1" type="unbounded1Type"/>
<xs:element name="unbounded2" type="unbounded2Type"/>
<xs:element name="unbounded3" type="unbounded3Type"/>
<xs:element name="unbounded4" type="unbounded4Type"/>
</xs:choice>
</xs:group>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice>
<xs:sequence>
<xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="required" type="queryType" maxOccurs="1"/>
</xs:sequence>
<xs:sequence>
<xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="required" type="queryType" maxOccurs="1"/>
</xs:sequence>
<xs:sequence>
<xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
<xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="required" type="queryType" maxOccurs="1"/>
// And so on, since this is 5! = 120 permutations
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
Я надеюсь, что кто-то может указать и объяснить, что я делаю неправильно.
Я мог бы "проверить" XML, просто используя <xs:choice maxOccurs="unbounded">
пометьте все элементы так, чтобы порядок не имел значения, но это не наложит каких-либо необходимых ограничений на документ xml.
Также я знаю, что xsd 1.1 позволяет использовать maxOccurs="unbounded"
с <xs:all>
что решило бы проблему идеально, но.NET не поддерживает использование xsd 1.1.
Я думаю, что моим лучшим решением в будущем, вероятно, было бы просто установить строгий порядок элементов путем сортировки узлов xml перед его проверкой (позволяя документу xsd быть намного проще и правильнее), но я все еще хочу узнать больше о xsd и попробуй выяснить что не так с моей попыткой.
1 ответ
Если вы хотите, чтобы узлы "option1" ... "option4" только один раз в определенном разделе (не несколько раз и не были отсортированы), то вам нужно определить все возможные ордера с первым узлом, обязательным для того, чтобы избавиться от неоднозначность. Возможно, вам придется следовать этому методу несколько раз. Надеюсь, это поможет, Питер