次の方法で共有


確定的スキーマと非確定的スキーマ

確定的スキーマとは、あいまいではないスキーマのことです。このスキーマでは、スキーマ オブジェクト モデル (SOM) で使用されているパーサーは、XML ドキュメントが有効であるために必要な要素のシーケンスを判別できます。XML スキーマは、あいまいに、つまり非確定的にすることもできます。パーサーによる構造解析で、スキーマを使用しても明確に判別できない場合、スキーマは非確定的スキーマと見なされます。非確定的スキーマで検証しようとすると、SOM で使用するパーサーがエラーを生成します。

確定的スキーマ

確定的スキーマでは、パーサーは、インスタンス ドキュメント内で発生する要素の有効な順序をどのように構成するかを、スキーマ内の情報に基づいて判別できます。

次に示すのは、有効なドキュメントに要素 root を含むことを指定した確定的 XML スキーマです。要素 root は、要素 apple と次に要素 berry、または要素 coffee と次に要素 dairy のいずれかを内容として持っています。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
        <xs:choice>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="berry"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="coffee"/>
                <xs:element name="dairy"/>
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:schema>

上のスキーマを使用して、インスタンス ドキュメントの処理中にパーサーがスキーマのロジックを解析できます。ここでは、ドキュメント内で要素 root の後に要素 apple が続いている場合、パーサーが検出するのは apple および berry のシーケンスの最初の部分です。同様に、パーサーは、要素 root の検出後に要素 coffee を検出すると、coffee および dairy というシーケンスの最初の部分を検出したと判断します。インスタンス ドキュメント内の要素の順序がこれ以外の場合、特定のスキーマに従って順序は無効となります。

非確定的スキーマ

非確定的スキーマを使用すると、パーサーは処理対象のドキュメント内の要素のシーケンスを判別できません。非確定的 XML スキーマの例を次に示します。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
        <xs:choice>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="berry"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="coffee"/>
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:schema>

上の非確定的スキーマを照合してインスタンス ドキュメントを処理しているときに、パーサーは、要素 root とその次の要素 apple を検出しても、その後に続く要素を参照しないと、apple 要素が apple および berry のシーケンスの最初の部分であるか、apple および coffee のシーケンスの最初の部分であるかを判別できません。スキーマ オブジェクト モデル (SOM) で使用されるパーサーは、前方向のチェックを行わないため、非確定的スキーマを使用して検証を行おうとすると、そのパーサーはエラー メッセージ "Content model must be deterministic" を生成します。

参照

XML スキーマ オブジェクト モデル (SOM) | XML スキーマ リファレンス (XSD)