2

私は XML と XSD を学んでいますが、問題があります。次の XSD ドキュメントを使用して、次の XML ドキュメントを検証したいと考えています。属性「id」が 2 つの異なる要素で使用されているためです。彼の定義を store と client の定義から切り離して、ref を使用したかったのです。残念ながら、Netbeans は属性の参照を無視しているようです。または、ファイル store.xml をチェックすると次のエラーが発生するため、間違った方法で実行しています。

XML validation started.

Checking file:/Users/toto/NetBeansProjects/Cookbook/src/java/store.xml...
Referenced entity at "file:/Users/strokyl/NetBeansProjects/Cookbook/src/java/store.xsd".
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'client'. [14] 
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'client'. [19] 
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'client'. [24] 
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'product'. [32] 
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'product'. [39] 
cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'product'. [46]

クライアントとストアのidの属性の定義に置き換える<xs:attribute ref="id"/>と、xmlは正しく有効になりました!

あなたの貴重な助けを前もって感謝し、私の下手な英語で申し訳ありません(私はフランス人です)。

XML ファイル (store.xml)

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Document   : store.xml.xml
    Created on : 12 novembre 2013, 22:09
    Author     : strokyl
    Description:
        Purpose of the document follows.
-->
<store xmlns="http://etud.insa-toulouse.fr/~duzan/store"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation='http://etud.insa-toulouse.fr/~duzan/store store.xsd'>
    <clients>
        <client id="1">
            <first_name>Luc</first_name>
            <last_name>Duzan</last_name>
            <age>22</age>
        </client>
        <client id="2">
            <first_name>Adrien</first_name>
            <last_name>Gareau</last_name>
            <age>22</age>
        </client>
        <client id="3">
            <first_name>Gilles</first_name>
            <last_name>Roudière</last_name>
            <age>22</age>
        </client>
    </clients>

    <products>
        <product id="1">
            <name>Poster de Maxime Médard</name>
  <!-- You don’t have to use same convention that you use for relational database -->
            <categorie>Poster</categorie>
            <price>10</price>
            <number_in_stock>100</number_in_stock>
        </product>
        <product id="2">
            <name>Poster de Yannick Jauzion</name>
            <categorie>Poster</categorie>
            <price>10</price>
            <number_in_stock>200</number_in_stock>
        </product>

        <product id="3">
            <name>Drapeau du stade toulousain</name>
            <categorie>drapeau</categorie>
            <price>5</price>
            <number_in_stock>500</number_in_stock>
        </product>
    </products>
</store>

XML スキーマ ファイル (store.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://etud.insa-toulouse.fr/~duzan/store"
    xmlns="http://etud.insa-toulouse.fr/~duzan/store"
    elementFormDefault="qualified">

    <xs:element name="store">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="clients"/>
                <xs:element ref="products"/>
                <xs:any/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

<!-- Definition très exposé de clients -->

    <xs:element name="first_name" type="xs:string"/>
    <xs:element name="last_name" type="xs:string"/>

    <xs:element name="age">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
                <xs:minInclusive value="0"/>
                <xs:maxInclusive value="120"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:attribute name="id" type="xs:integer"/>

    <xs:complexType name="client_type">
        <xs:sequence>
            <xs:element ref="first_name"/>
            <xs:element ref="last_name"/>
            <xs:element ref="age"/>
        </xs:sequence>
        <xs:attribute ref="id"/>
    </xs:complexType>

    <xs:element name="client" type="client_type"/>

    <xs:complexType name="clients_type">
        <xs:sequence>
            <xs:element ref="client" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="clients" type="clients_type"/>

<!-- Definition très condensé de product à part qu'on réutilise l'attribut id définit plus tôt -->
    <xs:element name="products">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="product" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"/>
                            <xs:element name="categorie" type="xs:string"/>
                            <xs:element name="price">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>

                            <xs:element name="number_in_stock">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                        <xs:maxInclusive value="1000"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>

                        </xs:sequence>
                        <xs:attribute ref="id"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
4

2 に答える 2

0

前の回答に同意しますが、簡単にするために:

実際、属性の問題は、再利用のためにグローバル宣言を指定したい場合 (複合型の外側を意味します)、それらを使用している xml インスタンスで属性を修飾する必要があることです。

あなたの場合、store.xml インスタンス内で次のことを行う必要があります。

1) ストアで宣言された名前空間に接頭辞を追加します。たとえば、「xmlns:store="http://etud.insa-toulouse.fr/~duzan/store"」とします:

<store xmlns="http://etud.insa-toulouse.fr/~duzan/store"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:store="http://etud.insa-toulouse.fr/~duzan/store"

    xsi:schemaLocation='http://etud.insa-toulouse.fr/~duzan/store store.xsd'>

2) 次に、 store:idなどの属性を修飾する必要があります。

<clients>
    <client store:id="1">
        <first_name>Luc</first_name>
        <last_name>Duzan</last_name>
        <age>22</age>
    </client>

私の提案:

  • 属性を使用する理由 SOA のプラクティスは、可能な場合は要素を使用することです (もちろん、誰もが同じことを考えているわけではありません..)
  • 本当に必要な場合は、(複合型内の) 属性のローカル宣言のみを使用して、インスタンス内の名前空間が冗長になるのを避けてください。
于 2013-11-17T14:55:42.833 に答える