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" только один раз в определенном разделе (не несколько раз и не были отсортированы), то вам нужно определить все возможные ордера с первым узлом, обязательным для того, чтобы избавиться от неоднозначность. Возможно, вам придется следовать этому методу несколько раз. Надеюсь, это поможет, Питер

Другие вопросы по тегам