XSD: несколько групп с одинаковыми элементами

Я пытаюсь проверить XML, который можно только прочитать, но не изменить. Я знаю, что возможно в XML и его структуре, но не то, что будет получено. Некоторые из них имеют элементы с тем же именем, что и другие, либо они абсолютно одинаковы, либо имеют разные типы и т. Д.

Есть ли способ удалить группы из области видимости друг друга, или мне придется отделить XML, отдельно проверить валики и так далее? Ниже я привел пример одной из моих попыток для разъяснения того, что я пытаюсь сделать.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="8" minOccurs="8" name="request">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="1">
<xs:group ref="group1"/>
<xs:group ref="group2"/>
<xs:group ref="group3"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:group name="group1">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:group name="group2">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:string"/>
<xs:element name="world" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:group name="group3">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:integer"/>
<xs:element name="world" minOccurs="0" type="xs:boolean"/>
</xs:sequence>
</xs:group>
</xs:schema>

1

Решение

Вы не можете иметь элементы с одинаковыми именами, но разными типами в одной модели содержимого, request в вашем конкретном случае.

Вы можете обойти это ограничение, сделав group1, group2, а также group3 фактически быть элементами в XML, а не просто группами в XSD.

Если вы не можете изменить XML, то вы приняли неоднозначную грамматику, которую XSD не сможет помочь вам проверить без более общего, чем вы, вероятно, предпочли бы. Например, вы можете использовать xsd:any или обобщить world быть простым типом, который может вместить все случаи — xs:string может работать.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]