web-dev-qa-db-ja.com

検証ルートに一致するグローバル宣言はありません

バックグラウンド

スキーマを使用してXMLドキュメントを検証します。

問題

問題の最も単純な形式は、2つのファイルに示されています。

XML文書

<?xml version="1.0"?>

<recipe
  xmlns:r="http://www.namespace.org/recipe">

<r:description>
  <r:title>sugar cookies</r:title>
</r:description>

</recipe>

XSDドキュメント

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
   version="1.0"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:r="http://www.namespace.org/recipe">

  <xsd:complexType name="recipe">
    <xsd:choice>
      <xsd:element name="description" type="descriptionType"
        minOccurs="1" maxOccurs="1" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="descriptionType">
    <xsd:all>
      <xsd:element name="title">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:minLength value="5" />
            <xsd:maxLength value="55" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>
    </xsd:all>
  </xsd:complexType>
</xsd:schema>

エラー

xmllint からの完全なエラーメッセージ:

file.xml:4:要素のレシピ:スキーマの妥当性エラー:要素 'recipe':検証ルートに一致するグローバル宣言はありません。

質問

特定のスキーマを使用して特定のXMLドキュメントを正常に検証できるようにするための正しい構文(または不足しているスキーマ属性)は何ですか?

47
Dave Jarvis

XMLインスタンスを変更する必要があります。あなたの現在のものは、名前空間にdescriptionと呼ばれるタイプがあると言いますhttp://www.namespace.org/recipe =。ただし、XSD定義では、その名前空間で公開される唯一のタイプは、recipeおよびdescriptionTypeと呼ばれます。

したがって、XSDスキーマでdescriptionと呼ばれるタイプを定義するか、recipeタイプを正しく参照するようにインスタンスを変更します。

<?xml version="1.0" encoding="utf-8"?>
<r:recipe
  xmlns:r="http://www.namespace.org/recipe">
  <description>
    <title>sugar cookies</title>
  </description>
</r:recipe>

[〜#〜] update [〜#〜]これは解決策の半分にすぎません-残りの半分はここにある@Aravindの答えです: https://stackoverflow.com/a/8426185/569662

27
tom redfern

グローバル要素の定義のみがルート要素として使用できます。スキーマには複合型のみがあるため、エラーが発生します。変更 <xsd:complexType name="recipe">

<xsd:element name="recipe">
  <xsd:complexType>
    <xsd:choice>
      <xsd:element name="description" type="descriptionType"
        minOccurs="1" maxOccurs="1" />
    </xsd:choice>
  </xsd:complexType>
</xsd:element>

これについてもっと読む here

14

私の練習では、2つのケースでNo matching global declaration available for the validation rootを取得しました。

  • XSDに<xsd:element name="recipe" .../>が含まれていない場合は、@ aravind-r-yarramの回答で説明されています。
  • XMLの<recipe/>xmlns属性が含まれていない場合。そのような場合、xmlnsを追加すると役立ちます。

    <recipe xmlns="http://www.namespace.org/recipe">
        ...
    </recipe>
    
4
Artur Klesun