1

XML とスキーマが機能しない理由を理解するのに苦労しています。

スキーマ:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="animals">
    <xs:element name="animal">
        <xs:complexType>
            <xs:element name="species"/>
            <xs:element name="name"/>
            <xs:element name="population" minOccurs="1"/>
        </xs:complexType>

    </xs:element>
</xs:element>

XML:

<?xml version="1.0"?>

<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="animals.xsd">
    <animal>
        <species>reptile</species>
        <name>cobra</name>

    </animal>
</animals>

最小発生数が 1 の場合、xml ファイルから人口が欠落しているため、エラーをスローすべきではありません。

私はすべて正しくやっていますか?

4

2 に答える 2

2

あなたはいくつかのことを正しく行っています。そのリストに追加したいかもしれないいくつかを次に示します。

  • 作成および定義する名前空間は、制御する権利を持つドメイン名を使用する必要があります。ドメイン w3schools.com を所有していない限り、それらの領域に新しい名前空間を定義しない方がよいでしょう。ドメインを所有しておらず、サンプルのみが必要な場合は、ドメイン example.com がこの目的のために予約されています。または、ターゲット名前空間なしでスキーマを作成できます。

  • xsi:schemaLocation 属性は、単一の URI ではなく一連の URI ペアを値として取ります。各ペアで、最初の項目は名前空間を指定し、2 番目の項目は XSD バリデーターがその名前空間のスキーマ ドキュメントを検索できる場所を指定します。したがって、その属性を XML ドキュメント インスタンスで次のように表示する必要があります。

    xsi:schemaLocation="http://www.w3schools.com animals.xsd"
    

    または、スキーマ ドキュメントを書き直して対象の名前空間を省略する場合は、代わりに xsi:noNamespaceSchemaLocation を使用します。

    xsi:noNamespaceSchemaLocation="animals.xsd"
    
  • 現在、スキーマ ドキュメントでは、ターゲット名前空間がhttp://www.w3schools.comであり、ローカル要素が完全修飾されていることが指定されています。したがって、表示する宣言がこれらの XML 要素インスタンスに適用されることを意図していることをスキーマ プロセッサに認識させたい場合は、XML 内のすべての要素がその名前空間にある必要があります。したがって、XML の開始タグはanimals次のようになります。

    <animals xmlns="http://www.w3schools.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="
            http://www.w3schools.com animals.xsd
            ">
    
  • あなたが示しているように、XSDバリデーターが xsi:schemaLocation の値に偶数のトークンがないという事実に異議を唱えることを期待していたでしょう。そうでない場合は、呼び出し方法に問題があった可能性があります。ただし、使用しているバリデーターとそれをどのように呼び出したかについての詳細情報がなければ、確実にすることは困難です。

  • ほとんどの XSD バリデーターは、いわゆる緩い検証モードで動作を開始します。要素宣言があるドキュメント内の要素を検出すると、それを検証し、そうでない場合はスキップします (または、いくつかの実装では、次に探している子を調べます)。検証できる要素の場合)。

    特定の名前空間の要素を記述するスキーマと、その名前空間にない要素を使用する XML ドキュメントがある場合、緩い検証モードで開始された XSD バリデーターは、ドキュメント インスタンスの要素が有効かどうかを判断できません。XSD 仕様によると、その場合、validityドキュメント要素のプロパティの値は ですnotKnown。ほとんどの XSD バリデータは、無効な要素に遭遇した場合にのみエラー メッセージを発行します。したがって、ほとんどの XSD バリデータは、スキーマに一致するものが何もないドキュメントに対して lax モードで開始され、エラー メッセージを発行しません。これを、ドキュメントがスキーマに対して有効であるという判断と混同しないことが重要です。そのドキュメントがスキーマに対して無効ではないことを意味するだけです。

    多くの人がそうであるように、この動作が不便または紛らわしい場合は、使用しているバリデーターが、ドキュメントを確認できない場合に呼び出し時フラグでエラーまたは少なくとも警告を発行できるかどうかを確認する必要があります。有効であること。(これを行うには、適合する XSD 1.1 バリデータが必要です。XSD 1.0 は、適合要件に関して少しあいまいです。) または、バリデータにより、ドキュメントが名前空間にanimals要素を持つ必要があり、エラーが必要であると言うことができる場合があります。http://www.w3schools.comそれ以外の場合は引き上げられます。バリデーターが動作の開始方法を制御できない場合は、何らかの制御が必要であることをベンダーに伝え、それまでの間、別のバリデーターを探してください。

[PS 考慮すべきもう 1 つの重要な点については、この回答に関する Michael Kay のコメントも参照してください。]

于 2013-02-28T13:55:50.820 に答える
1

あなたのスキーマは間違っているように見えます - 中に直接入れることはできません (または直接中に入れることもできませxs:elementxs:element) xs:complexType

あなたが欲しいのは

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.w3schools.com"
  xmlns="http://www.w3schools.com"
  elementFormDefault="qualified">

  <xs:element name="animals">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="animal" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="species"/>
              <xs:element name="name"/>
              <xs:element name="population" minOccurs="1"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

次に、XML ファイルでスキーマの名前空間を使用する必要があります。

<animals 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="animals.xsd" 
   xmlns="http://www.w3schools.com">
  <animal>
    <species>reptile</species>
    <name>cobra</name>
  </animal>
</animals>
于 2013-02-28T18:58:13.007 に答える