Schemi deterministici e non deterministici

Uno schema deterministico è uno schema non ambiguo, che consente al parser utilizzato dal modello SOM (Schema Object Model) di determinare la sequenza che gli elementi devono seguire perché un documento XML sia valido. Uno schema XML può essere ambiguo o non deterministico. Viene considerato non deterministico se il parser non è in grado di determinare con precisione la struttura da convalidare con lo schema. Quando la convalida viene tentata su uno schema non deterministico, il parser utilizzato dal modello SOM genera un errore.

Schema deterministico

Con uno schema deterministico, il parser è in grado di determinare cosa costituisce una sequenza di elementi valida che dovrebbe verificarsi in un documento dell'istanza basato sulle informazioni presenti nello schema.

L'esempio di schema XML che segue è uno schema deterministico che specifica che un documento valido deve contenere un elemento, root, il cui contenuto è un elemento, apple, seguito da un elemento, berry o un elemento, coffee, a sua volta seguito da un elemento, 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>

Utilizzando lo schema precedente, durante l'elaborazione di un documento di istanza il parser è in grado di seguire la logica dello schema, che specifica che se l'elemento root è seguito nel documento dall'elemento apple, il parser ha rilevato la prima parte della sequenza di apple e berry. Analogamente, se il parser rileva l'elemento coffee dopo aver rilevato l'elemento root, determinerà che ha rilevato la prima parte della sequenza di coffee e dairy. Qualsiasi altro ordine degli elementi nel documento di istanza non è valido in base a questo schema.

Schema non deterministico

Con uno schema non deterministico, il parser non è in grado di determinare una sequenza per gli elementi nel documento elaborato. Nell'esempio di schema XML che segue viene illustrato uno schema non deterministico.

<?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>

Durante l'elaborazione di un documento di istanza sullo schema non deterministico appena descritto, quando il parser rileva l'elemento root seguito da un elemento apple, non è in grado di determinare, senza osservare l'elemento successivo, se apple rappresenta la prima parte della sequenza di apple e berry o la prima parte della sequenza di apple e coffee. Dal momento che il parser utilizzato dal modello SOM (Schema Object Model) non esegue il forward checking, il parser genera il messaggio di errore Content model must be deterministic quando si tenta di effettuare la convalida utilizzando uno schema non deterministico.

Vedere anche

SOM (Schema Object Model) XML | Riferimento agli schemi XML (XSD)