web-dev-qa-db-ja.com

XML Schema Validation:要素の宣言が見つかりません

私はまだXMLスキーマなどに慣れていないので、XML、スキーマ、スタイルシート(XSLT)の開発に取り組んでいます。私は合理的な進歩を遂げましたが、スキーマが機能しなくなったことに気づいたので、より単純な説明のない例に戻しました。

これが私のXMLです。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="Test.Namespace"  
      schemaLocation="http://myNameSpace.com Test1.xsd">
    <element1 id="001">
        <element2 id="001.1">
             <element3 id="001.1" />
        </element2>
    </element1>
</Root>

私はここにあるスキーマを書きました:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="item" type="element3Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element3Type">
         <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
 </xsd:schema>

スキーマは、私の実際のXMLの構造を表しています。

さて、XMLを検証しようとすると、次のエラーが表示されます。

cvc-elt.1: Cannot find the declaration of element 'Root'. [7]

これは、ルート要素の名前空間の問題と関係があると思いますが、実際にはわかりません。

誰かが私が間違っていることを提案してください。

20
Nerdio

cvc-elt.1:要素「Root」の宣言が見つかりません。 [7]

ルート要素のschemaLocation属性はxsi:schemaLocationでなければならず、正しい名前空間を使用するように修正する必要があります。

おそらく、スキーマのtargetNamespaceとドキュメントのxmlnshttp://myNameSpace.comに変更する必要があります(名前空間は有効なURIであると想定されているため、Test.Namespaceは、[urn:Test.Namespaceは問題ありません)。これを行うと、スキーマが見つかるはずです。ポイントは、スキーマのターゲット名前空間、ドキュメントの名前空間、およびスキーマの場所を指定する名前空間の3つすべてが同じでなければならないということです。

(ただし、<element2>には、スキーマでitemが必要なドキュメントに<element3>が含まれているため、まだ検証されません)

18
Ian Roberts

上記の皆さんに感謝しますが、これは修正されました。他の人の利益のために、最も重大なエラーは、Ianによって提案された3つの名前空間を調整することでした。

完全を期すために、修正されたXMLおよびXSDを以下に示します

タイプミスが修正されたXMLを次に示します(遅刻による混乱はごめんなさい)

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

<Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <element1 id="001">
        <element2 id="001.1">
            <element3 id="001.1" />
        </element2>
    </element1>
</Root>

そして、ここにスキーマがあります

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:Test.Namespace"
            xmlns="urn:Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="element3" type="element3Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element3Type">
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
</xsd:schema>

皆さんに感謝します。これが将来誰かに役立つことを願っています。

21
Nerdio

XMLスキーマのtargetNamespaceRoot要素の名前空間と一致しません(Test.NamespaceのドットとTest,Namespaceのコンマ)

上記に同意したら、element2にXSDにない属性orderがあることを考慮する必要があります。

1
Petru Gardea