Проверка двух разных структур с одинаковым именем - PullRequest
0 голосов
/ 29 мая 2019

У меня есть элемент, скажем, Автомобиль , который имеет несколько вложенных элементов (т. Е. Кузов , Цвет и т. Д.). Может быть много разных типов автомобилей, но все они будут представлены элементом Car ; однако элементы Body , Color могут отличаться.

Например, у меня есть эти два xml:

Car1.xml

<Car>
    <Body>
        <Length>2</Length>
        <Shape>Box</Shape>
    </Body>
    <Color>
        <PrimColor>Red</PrimColor>
        <SecColor>
            <Hue>Blue</Hue>
        </SecColor>
    </Color>
</Car>  

Car2.xml

<Car>
    <Body>
        <Length>2</Length>
        <Shape>Box</Shape>
        <Sunroof>True</Sunroof>
    </Body>
    <Color>
        <PrimColor>Red</PrimColor>
        <SecColor>
            <Gloss>True</Gloss>
            <Tinted>False</Tinted>
        </SecColor>
    </Color>
</Car>  

Мне нужно создать xsd для проверки обоих со следующими условиями

  • Если элемент Body не содержит элемент Sunroof, элемент SecColor может содержать только элемент Hue, но он необязательно должен присутствовать
  • Если элемент Body содержит Sunroof, элемент SecColor может содержать только Gloss и Tinted, но они не обязательно должны быть там (один, оба или ни один не могут появиться)

Я не могу изменить xml (он мне дан).

В настоящее время я просто установил minOccurs="0" для этих специальных элементов, но это не соблюдает указанное выше правило.

Я просмотрел группы выбора, но xerces жалуется: «В группе моделей появляются несколько элементов с именем« Body », с разными типами». Это было то, что я пытался сделать

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema targetNamespace="Cars" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" >
    <xs:element name="Car">
        <xs:complexType>
            <xs:sequence>
                <xs:choice>
                    <xs:sequence>
                        <xs:element name="Body">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Length" type="xs:integer" />
                                    <xs:element name="Shape" type="xs:string" />
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="Color">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="PrimColor" type="xs:string" />
                                    <xs:element name="SecColor" >
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="Hue" type="xs:string" minOccurs="0" />
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:sequence>
                        <xs:element name="Body">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Length" type="xs:integer" />
                                    <xs:element name="Shape" type="xs:string" />
                                    <xs:element name="Sunroof" type="xs:boolean" />
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="Color">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="PrimColor" type="xs:string" />
                                    <xs:element name="SecColor" >
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="Gloss" type="xs:boolean" minOccurs="0" />
                                                <xs:element name="Tinted" type="xs:boolean"  minOccurs="0" />
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Я думал об условных типах, но они работают только с атрибутами, а xml не содержит их.

Можно ли применить эти правила и проверить xml с помощью xsd 1.1?

1 Ответ

0 голосов
/ 11 июня 2019

Итак, я использовал assert для проверки моего xml.

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema targetNamespace="Cars" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" >
    <xs:element name="Car">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Body">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Length" type="xs:integer" />
                            <xs:element name="Shape" type="xs:string" />
                            <xs:element name="Sunroof" type="xs:boolean" minOccurs="0"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Color">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="PrimColor" type="xs:string" />
                            <xs:element name="SecColor" >
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Hue" type="xs:string" minOccurs="0" />
                                        <xs:element name="Gloss" type="xs:boolean" minOccurs="0" />
                                        <xs:element name="Tinted" type="xs:boolean"  minOccurs="0" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:assert test="
                (not(Car/Body/Sunroof) and 
                not(Car/Color/SecColor/Gloss) and
                not(Car/Color/SecColor/Tinted))
                or
                (count(Car/Body/Sunroof) eq 1 and 
                not(Car/Color/SecColor/Hue))" />
        </xs:complexType>
    </xs:element>
</xs:schema>

Это гарантирует, что, если люк на крыше не существует, элемент Gloss and Tinted также не может; аналогично, если существует люк в крыше, элемент Хюэ не может.

...