Я пытаюсь проверить 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>
Вы не можете иметь элементы с одинаковыми именами, но разными типами в одной модели содержимого, request
в вашем конкретном случае.
Вы можете обойти это ограничение, сделав group1
, group2
, а также group3
фактически быть элементами в XML, а не просто группами в XSD.
Если вы не можете изменить XML, то вы приняли неоднозначную грамматику, которую XSD не сможет помочь вам проверить без более общего, чем вы, вероятно, предпочли бы. Например, вы можете использовать xsd:any
или обобщить world
быть простым типом, который может вместить все случаи — xs:string
может работать.
Других решений пока нет …