2

xs:choice 要素を使用しようとしていますが、XSD ファイルの検証中に、xs:choice 要素に関連していると思われるエラーが発生します。この問題をかなり検索しましたが、似たような問題がいくつか見つかりましたが、問題を解決するために探していた答えはありませんでした。

私がやろうとしているのは、「データ」と呼ばれる要素を宣言することです。その子はタイムスタンプとセンサーまたはプロバイダーになります (センサーまたはプロバイダーのみが必要なので、ここで選択要素を使用しようとしています)。タイムスタンプの兄弟としての provider 要素)。

次の 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 web サイトを使用して検証しようとすると、次のエラーが発生します。

file:/usr/local/XSV/xsvlog/tmph7cMmLuploaded:45:6: cvc-complex-type.1.2.4 ごとに無効: 要素 {None}: ここで許可されていない要素 (1) 要素 { http://www. w3.org/2001/XMLSchema }:choice、予想 [{ http://www.w3.org/2001/XMLSchema }:annotation,$,{ http://www.w3.org/2001/XMLSchema }:element ,{ http://www.w3.org/2001/XMLSchema }:グループ,{ 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 の例によると私ですが、別の要素の隣に使用するつもりなので、それが正しいかどうかはわかりません。

誰かがこれについて私を助けることができれば、私は非常に感謝しています.

よろしくお願いします。

4

1 に答える 1

3

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: 修飾子が必要ななどがあることです(これは、提供したエラーの要点です)

  • timestampXSD に要素を追加しました。

ただし、これらの変更により、問題は XML、特に origin 属性になります。xmln:tns=...属性グローバルを宣言したので、XSD の名前空間で修飾する必要があります。tns:origin=...

XML を本当に変更したくない場合は、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">
    <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>
于 2013-05-05T13:37:42.697 に答える