XML-схема xs: выбор внутри XS: последовательность


Я пытаюсь использовать элемент xs:choice, но при проверке файла XSD я получаю ошибку, которая, как я полагаю, связана с элементом xs: choice. Я искал эту проблему довольно долго, нашел несколько похожих, но ни один не дал мне ответа, который я искал, чтобы решить мою проблему.

То, что я пытаюсь сделать, - это объявить элемент под названием "данные", чьи childs были бы меткой времени и датчиком или поставщиком (здесь я пытаюсь использовать элемент выбора, так как я требуется только элемент датчика или поставщика в качестве родственного элемента метки времени).

Следующий XML-это то, что я пытаюсь проверить:

<?xml version="1.0" encoding="ISO-8859-1"?>
<experience xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<data>
    <timestamp>123456789</timestamp>
    <sensor origin="proximity" >
        <x-axis>9</x-axis>
        <y-axis>0</y-axis>
        <z-axis>0</z-axis>
        <w-axis>0</w-axis>
    </sensor>
</data>
</experience>

И чтобы проверить этот XML, я написал следующий XSD-файл:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of attributes -->
<xs:attribute name="origin" type="xs:string" />

<!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude"  type="xs:float" />
                <xs:element name="longitude" type="xs:float" />
                <xs:element name="altitude"  type="xs:float" />
                <xs:element name="bearing"   type="xs:float" />
                <xs:element name="speed"     type="xs:float" />
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float" />
                <xs:element name="y-axis" type="xs:float" />
                <xs:element name="z-axis" type="xs:float" />
                <xs:element name="w-axis" type="xs:float" />
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1" />

                <xs:choice>
                    <element ref="provider" />
                    <element ref="sensor" />
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

<!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Но как только я загружаю файл и пытаюсь проверить его с помощью следующего веб-сайта w3 , я получаю следующую ошибку:

Файл:/usr / local/XSV/xsvlog/tmph7cMmLuploaded: 45: 6: недопустимый per вах-сложного-типа.1.2.4: элемент {None}: элемент не разрешен здесь (1) в элемент {http://www.w3.org/2001/XMLSchema }: выбор, ожидание [{http://www.w3.org/2001/XMLSchema}:annotation,$,{http://www.w3.org/2001/XMLSchema}:element,{http://www.w3.org/2001/XMLSchema}:group,{http://www.w3.org/2001/XMLSchema}:choice,{http://www.w3.org/2001/XMLSchema}:sequence,{http://www.w3.org/2001/XMLSchema}:any]:

Я думаю, что проблема заключается в элементе xs:choice, но я может, и ошибся.

Поскольку я впервые пытаюсь использовать элемент xs:choice, у меня есть некоторые сомнения, правильно ли я его использую. В соответствии с примером в w3schools я есть, но поскольку я намерен использовать его рядом с другим элементом, я не знаю, правильно ли это.

Если бы кто-нибудь мог помочь мне в этом, я был бы очень признателен.

Заранее большое спасибо.

1 2

1 ответ:

В XML и XSD есть несколько движущихся целей; поэтому XSD и XML ниже минимально модифицированы, чтобы соответствовать друг другу...

Модифицированный XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">

    <!-- definition of attributes -->
    <xs:attribute name="origin" type="xs:string"/>

    <!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude" type="xs:float"/>
                <xs:element name="longitude" type="xs:float"/>
                <xs:element name="altitude" type="xs:float"/>
                <xs:element name="bearing" type="xs:float"/>
                <xs:element name="speed" type="xs:float"/>
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float"/>
                <xs:element name="y-axis" type="xs:float"/>
                <xs:element name="z-axis" type="xs:float"/>
                <xs:element name="w-axis" type="xs:float"/>
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="timestamp" type="xs:long"/>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/>

                <xs:choice>
                    <xs:element ref="provider"/>
                    <xs:element ref="sensor"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Модифицированный XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<experience xmlns="http://www.w3schools.com" xmlns:tns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <data>
        <timestamp>123456789</timestamp>
        <sensor tns:origin="proximity">
            <x-axis>9</x-axis>
            <y-axis>0</y-axis>
            <z-axis>0</z-axis>
            <w-axis>0</w-axis>
        </sensor>
    </data>
</experience>

Итак, вот что происходит:

  • Ваш XML определяет пространство имен XML по умолчанию; поэтому ваш XSD должен определить соответствующее пространство имен, поэтому смотрите новый атрибут targetNamespace и добавление xmlns по умолчанию, чтобы соответствовать этому.

  • Так как все ваши элементы являются квалифицированными (из-за использования пространства имен по умолчанию на корневом уровне), то ваша схема должна использовать elementFormDefault="qualified"

  • Ваша проблема с выбором заключается в том, что у вас есть &lt;element ref="provider" и т. д. который нуждается в XS: квалификаторе (это суть ошибки, которую вы предоставили)

  • Я добавил элемент timestamp в ваш XSD.

Однако с этими изменениями проблема теперь становится вашим XML, особенно атрибутом origin. Поскольку вы объявили атрибут глобальным, он должен быть квалифицированным в пространстве имен XSD, поэтому я добавляю xmln:tns=... и fixin tns:origin=...

Если вы действительно не хотите изменять XML, то ваш XSD должен либо определить атрибут локально (вместо ссылки), либо обернуть атрибут в группу и ссылаться на нее. Итак, вот обновленный XSD, который соответствует исходному XML.

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">
    <xs:attributeGroup name="origin">
        <!-- definition of attributes -->
        <xs:attribute name="origin" type="xs:string"/>      
    </xs:attributeGroup>

    <!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude" type="xs:float"/>
                <xs:element name="longitude" type="xs:float"/>
                <xs:element name="altitude" type="xs:float"/>
                <xs:element name="bearing" type="xs:float"/>
                <xs:element name="speed" type="xs:float"/>
            </xs:all>
            <xs:attributeGroup ref="origin"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float"/>
                <xs:element name="y-axis" type="xs:float"/>
                <xs:element name="z-axis" type="xs:float"/>
                <xs:element name="w-axis" type="xs:float"/>
            </xs:all>
            <xs:attributeGroup ref="origin"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="timestamp" type="xs:long"/>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/>

                <xs:choice>
                    <xs:element ref="provider"/>
                    <xs:element ref="sensor"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>