Validation XmlSchemaValidator de type push

La classe XmlSchemaValidator fournit un mécanisme efficace et performant de validation des données XML par rapport aux schémas XML selon le modèle push. Par exemple, la classe XmlSchemaValidator permet de valider un jeu d'informations XML sur place sans devoir le sérialiser dans un document XML et réanalyser ensuite le document à l'aide d'un lecteur XML de validation.

La classe XmlSchemaValidator peut être utilisée dans des scénarios avancés tels que la création de moteurs de validation pour des sources de données XML personnalisées ou la génération d’un writer XML de validation.

L'exemple suivant illustre l'utilisation de la classe XmlSchemaValidator pour valider le fichier contosoBooks.xml par rapport au schéma contosoBooks.xsd. Cet exemple utilise la classe XmlSerializer pour désérialiser le fichier contosoBooks.xml et transmettre la valeur des nœuds aux méthodes de la classe XmlSchemaValidator.

Notes

Cet exemple est utilisé dans toutes les sections de cette rubrique.

using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Collections;

namespace Microsoft.Samples.Xml.Schema
{
    class XmlSchemaValidatorExamples
    {
        static void Main()
        {
            // The XML document to deserialize into the XmlSerializer object.
            XmlReader reader = XmlReader.Create("contosoBooks.xml");

            // The XmlSerializer object.
            XmlSerializer serializer = new XmlSerializer(typeof(ContosoBooks));
            ContosoBooks books = (ContosoBooks)serializer.Deserialize(reader);

            // The XmlSchemaSet object containing the schema used to validate the XML document.
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            schemaSet.Add("http://www.contoso.com/books", "contosoBooks.xsd");

            // The XmlNamespaceManager object used to handle namespaces.
            XmlNamespaceManager manager = new XmlNamespaceManager(reader.NameTable);

            // Assign a ValidationEventHandler to handle schema validation warnings and errors.
            XmlSchemaValidator validator = new XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
            validator.ValidationEventHandler += new ValidationEventHandler(SchemaValidationEventHandler);

            // Initialize the XmlSchemaValidator object.
            validator.Initialize();

            // Validate the bookstore element, verify that all required attributes are present
            // and prepare to validate child content.
            validator.ValidateElement("bookstore", "http://www.contoso.com/books", null);
            validator.GetUnspecifiedDefaultAttributes(new ArrayList());
            validator.ValidateEndOfAttributes(null);

            // Get the next expected element in the bookstore context.
            XmlSchemaParticle[] particles = validator.GetExpectedParticles();
            XmlSchemaElement nextElement = particles[0] as XmlSchemaElement;
            Console.WriteLine("Expected Element: '{0}'", nextElement.Name);

            foreach (BookType book in books.Book)
            {
                // Validate the book element.
                validator.ValidateElement("book", "http://www.contoso.com/books", null);

                // Get the expected attributes for the book element.
                Console.Write("\nExpected attributes: ");
                XmlSchemaAttribute[] attributes = validator.GetExpectedAttributes();
                foreach (XmlSchemaAttribute attribute in attributes)
                {
                    Console.Write("'{0}' ", attribute.Name);
                }
                Console.WriteLine();

                // Validate the genre attribute and display its post schema validation information.
                if (book.Genre != null)
                {
                    validator.ValidateAttribute("genre", "", book.Genre, schemaInfo);
                }
                DisplaySchemaInfo();

                // Validate the publicationdate attribute and display its post schema validation information.
                if (book.PublicationDate != null)
                {
                    validator.ValidateAttribute("publicationdate", "", dateTimeGetter(book.PublicationDate), schemaInfo);
                }
                DisplaySchemaInfo();

                // Validate the ISBN attribute and display its post schema validation information.
                if (book.Isbn != null)
                {
                    validator.ValidateAttribute("ISBN", "", book.Isbn, schemaInfo);
                }
                DisplaySchemaInfo();

                // After validating all the attributes for the current element with ValidateAttribute method,
                // you must call GetUnspecifiedDefaultAttributes to validate the default attributes.
                validator.GetUnspecifiedDefaultAttributes(new ArrayList());

                // Verify that all required attributes of the book element are present
                // and prepare to validate child content.
                validator.ValidateEndOfAttributes(null);

                // Validate the title element and its content.
                validator.ValidateElement("title", "http://www.contoso.com/books", null);
                validator.ValidateEndElement(null, book.Title);

                // Validate the author element, verify that all required attributes are present
                // and prepare to validate child content.
                validator.ValidateElement("author", "http://www.contoso.com/books", null);
                validator.GetUnspecifiedDefaultAttributes(new ArrayList());
                validator.ValidateEndOfAttributes(null);

                if (book.Author.Name != null)
                {
                    // Validate the name element and its content.
                    validator.ValidateElement("name", "http://www.contoso.com/books", null);
                    validator.ValidateEndElement(null, book.Author.Name);
                }

                if (book.Author.FirstName != null)
                {
                    // Validate the first-name element and its content.
                    validator.ValidateElement("first-name", "http://www.contoso.com/books", null);
                    validator.ValidateEndElement(null, book.Author.FirstName);
                }

                if (book.Author.LastName != null)
                {
                    // Validate the last-name element and its content.
                    validator.ValidateElement("last-name", "http://www.contoso.com/books", null);
                    validator.ValidateEndElement(null, book.Author.LastName);
                }

                // Validate the content of the author element.
                validator.ValidateEndElement(null);

                // Validate the price element and its content.
                validator.ValidateElement("price", "http://www.contoso.com/books", null);
                validator.ValidateEndElement(null, book.Price);

                // Validate the content of the book element.
                validator.ValidateEndElement(null);
            }

            // Validate the content of the bookstore element.
            validator.ValidateEndElement(null);

            // Close the XmlReader object.
            reader.Close();
        }

        static XmlSchemaInfo schemaInfo = new XmlSchemaInfo();
        static object dateTimeGetterContent;

        static object dateTimeGetterHandle()
        {
            return dateTimeGetterContent;
        }

        static XmlValueGetter dateTimeGetter(DateTime dateTime)
        {
            dateTimeGetterContent = dateTime;
            return new XmlValueGetter(dateTimeGetterHandle);
        }

        static void DisplaySchemaInfo()
        {
            if (schemaInfo.SchemaElement != null)
            {
                Console.WriteLine("Element '{0}' with type '{1}' is '{2}'",
                    schemaInfo.SchemaElement.Name, schemaInfo.SchemaType, schemaInfo.Validity);
            }
            else if (schemaInfo.SchemaAttribute != null)
            {
                Console.WriteLine("Attribute '{0}' with type '{1}' is '{2}'",
                    schemaInfo.SchemaAttribute.Name, schemaInfo.SchemaType, schemaInfo.Validity);
            }
        }

        static void SchemaValidationEventHandler(object sender, ValidationEventArgs e)
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    Console.WriteLine("\nError: {0}", e.Message);
                    break;
                case XmlSeverityType.Warning:
                    Console.WriteLine("\nWarning: {0}", e.Message);
                    break;
            }
        }
    }

    [XmlRootAttribute("bookstore", Namespace = "http://www.contoso.com/books", IsNullable = false)]
    public class ContosoBooks
    {
        [XmlElementAttribute("book")]
        public BookType[] Book;
    }

    public class BookType
    {
        [XmlAttributeAttribute("genre")]
        public string Genre;

        [XmlAttributeAttribute("publicationdate", DataType = "date")]
        public DateTime PublicationDate;

        [XmlAttributeAttribute("ISBN")]
        public string Isbn;

        [XmlElementAttribute("title")]
        public string Title;

        [XmlElementAttribute("author")]
        public BookAuthor Author;

        [XmlElementAttribute("price")]
        public Decimal Price;
    }

    public class BookAuthor
    {
        [XmlElementAttribute("name")]
        public string Name;

        [XmlElementAttribute("first-name")]
        public string FirstName;

        [XmlElementAttribute("last-name")]
        public string LastName;
    }
}
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.Serialization
Imports System.Collections


Namespace Microsoft.Samples.Xml.Schema

    Class XmlSchemaValidatorExamples

        Shared Sub Main()

            ' The XML document to deserialize into the XmlSerializer object.
            Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml")

            ' The XmlSerializer object.
            Dim serializer As XmlSerializer = New XmlSerializer(GetType(ContosoBooks))
            Dim books As ContosoBooks = CType(serializer.Deserialize(reader), ContosoBooks)

            ' The XmlSchemaSet object containing the schema used to validate the XML document.
            Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
            schemaSet.Add("http://www.contoso.com/books", "contosoBooks.xsd")

            ' The XmlNamespaceManager object used to handle namespaces.
            Dim manager As XmlNamespaceManager = New XmlNamespaceManager(reader.NameTable)

            ' Assign a ValidationEventHandler to handle schema validation warnings and errors.
            Dim validator As XmlSchemaValidator = New XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None)
            'validator.ValidationEventHandler += New ValidationEventHandler(SchemaValidationEventHandler)
            AddHandler validator.ValidationEventHandler, AddressOf SchemaValidationEventHandler

            ' Initialize the XmlSchemaValidator object.
            validator.Initialize()

            ' Validate the bookstore element, verify that all required attributes are present
            ' and prepare to validate child content.
            validator.ValidateElement("bookstore", "http://www.contoso.com/books", Nothing)

            validator.GetUnspecifiedDefaultAttributes(New ArrayList())
            validator.ValidateEndOfAttributes(Nothing)

            ' Get the next expected element in the bookstore context.
            Dim particles() As XmlSchemaParticle = validator.GetExpectedParticles()
            Dim nextElement As XmlSchemaElement = particles(0)
            Console.WriteLine("Expected Element: '{0}'", nextElement.Name)

            For Each book As BookType In books.book
                ' Validate the book element.
                validator.ValidateElement("book", "http://www.contoso.com/books", Nothing)

                ' Get the expected attributes for the book element.
                Console.Write(vbCrLf & "Expected attributes: ")
                Dim attributes() As XmlSchemaAttribute = validator.GetExpectedAttributes()
                For Each attribute As XmlSchemaAttribute In attributes
                    Console.Write("'{0}' ", attribute.Name)
                Next
                Console.WriteLine()

                ' Validate the genre attribute and display its post schema validation information.
                If Not book.Genre Is Nothing Then
                    validator.ValidateAttribute("genre", "", book.Genre, schemaInfo)
                End If
                DisplaySchemaInfo()

                ' Validate the publicationdate attribute and display its post schema validation information.
                If Not book.PublicationDate = Nothing Then
                    validator.ValidateAttribute("publicationdate", "", dateTimeGetter(book.PublicationDate), schemaInfo)
                End If
                DisplaySchemaInfo()

                ' Validate the ISBN attribute and display its post schema validation information.
                If Not book.Isbn Is Nothing Then
                    validator.ValidateAttribute("ISBN", "", book.Isbn, schemaInfo)
                End If
                DisplaySchemaInfo()

                ' After validating all the attributes for the current element with ValidateAttribute method,
                ' you must call GetUnspecifiedDefaultAttributes to validate the default attributes.
                validator.GetUnspecifiedDefaultAttributes(New ArrayList())

                ' Verify that all required attributes of the book element are present
                ' and prepare to validate child content.
                validator.ValidateEndOfAttributes(Nothing)

                ' Validate the title element and its content.
                validator.ValidateElement("title", "http://www.contoso.com/books", Nothing)
                validator.ValidateEndElement(Nothing, book.Title)

                ' Validate the author element, verify that all required attributes are present
                ' and prepare to validate child content.
                validator.ValidateElement("author", "http://www.contoso.com/books", Nothing)

                validator.GetUnspecifiedDefaultAttributes(New ArrayList())
                validator.ValidateEndOfAttributes(Nothing)

                If Not book.Author.Name Is Nothing Then
                    ' Validate the name element and its content.
                    validator.ValidateElement("name", "http://www.contoso.com/books", Nothing)
                    validator.ValidateEndElement(Nothing, book.Author.Name)
                End If

                If Not book.Author.FirstName Is Nothing Then
                    ' Validate the first-name element and its content.
                    validator.ValidateElement("first-name", "http://www.contoso.com/books", Nothing)
                    validator.ValidateEndElement(Nothing, book.Author.FirstName)

                End If

                If Not book.Author.LastName Is Nothing Then
                    ' Validate the last-name element and its content.
                    validator.ValidateElement("last-name", "http://www.contoso.com/books", Nothing)
                    validator.ValidateEndElement(Nothing, book.Author.LastName)
                End If

                ' Validate the content of the author element.
                validator.ValidateEndElement(Nothing)

                ' Validate the price element and its content.
                validator.ValidateElement("price", "http://www.contoso.com/books", Nothing)
                validator.ValidateEndElement(Nothing, book.Price)

                ' Validate the content of the book element.
                validator.ValidateEndElement(Nothing)
            Next

            ' Validate the content of the bookstore element.
            validator.ValidateEndElement(Nothing)

            ' Close the XmlReader object.
            reader.Close()

        End Sub

        Shared schemaInfo As XmlSchemaInfo = New XmlSchemaInfo()
        Shared dateTimeGetterContent As Object

        Shared Function dateTimeGetterHandle() As Object

            Return dateTimeGetterContent

        End Function

        Shared Function dateTimeGetter(ByVal dateTime As DateTime) As XmlValueGetter

            dateTimeGetterContent = dateTime
            Return New XmlValueGetter(AddressOf dateTimeGetterHandle)

        End Function

        Shared Sub DisplaySchemaInfo()

            If Not schemaInfo.SchemaElement Is Nothing Then
                Console.WriteLine("Element '{0}' with type '{1}' is '{2}'", schemaInfo.SchemaElement.Name, schemaInfo.SchemaType, schemaInfo.Validity)
            ElseIf Not schemaInfo.SchemaAttribute Is Nothing Then
                Console.WriteLine("Attribute '{0}' with type '{1}' is '{2}'", schemaInfo.SchemaAttribute.Name, schemaInfo.SchemaType, schemaInfo.Validity)
            End If

        End Sub

        Shared Sub SchemaValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)

            Select Case e.Severity
                Case XmlSeverityType.Error
                    Console.WriteLine(vbCrLf & "Error: {0}", e.Message)
                    Exit Sub
                Case XmlSeverityType.Warning
                    Console.WriteLine(vbCrLf & "Warning: {0}", e.Message)
                    Exit Sub
            End Select

        End Sub

    End Class

    <XmlRootAttribute("bookstore", Namespace:="http://www.contoso.com/books", IsNullable:=False)> _
    Public Class ContosoBooks

        <XmlElementAttribute("book")> _
        Public book() As BookType

    End Class

    Public Class BookType

        <XmlAttributeAttribute("genre")> _
        Public Genre As String

        <XmlAttributeAttribute("publicationdate", DataType:="date")> _
        Public PublicationDate As DateTime

        <XmlAttributeAttribute("ISBN")> _
        Public Isbn As String

        <XmlElementAttribute("title")> _
        Public Title As String

        <XmlElementAttribute("author")> _
        Public Author As BookAuthor

        <XmlElementAttribute("price")> _
        Public Price As Decimal

    End Class

    Public Class BookAuthor

        <XmlElementAttribute("name")> _
        Public Name As String

        <XmlElementAttribute("first-name")> _
        Public FirstName As String

        <XmlElementAttribute("last-name")> _
        Public LastName As String

    End Class

End Namespace

L'exemple prend le fichier contosoBooks.xml comme entrée.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

L'exemple prend également le fichier contosoBooks.xsd comme entrée.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Validation de données XML à l'aide de XmlSchemaValidator

Pour commencer à valider un jeu d'informations XML, vous devez d'abord initialiser une nouvelle instance de la classe XmlSchemaValidator à l'aide du constructeur XmlSchemaValidator.

Le constructeur XmlSchemaValidator prend comme paramètres des objets XmlNameTable, XmlSchemaSet et XmlNamespaceManager ainsi qu'une valeur XmlSchemaValidationFlags. L'objet XmlNameTable permet d'atomiser des chaînes d'espace de noms bien connues telles que l'espace de noms de schéma, l'espace de noms XML, etc., et est transmis à la méthode ParseValue lors de la validation d'un contenu simple. L'objet XmlSchemaSet contient les schémas XML permettant de valider le jeu d'informations XML. L'objet XmlNamespaceManager permet de résoudre les espaces de noms rencontrés pendant la validation. La valeur XmlSchemaValidationFlags permet de désactiver certaines fonctions de validation.

Pour plus d'informations sur le constructeur XmlSchemaValidator, voir la documentation de référence sur la classe XmlSchemaValidator.

Initialisation de la validation

Une fois qu'un objet XmlSchemaValidator a été construit, deux méthodes Initialize surchargées permettent d'initialiser l'état de l'objet XmlSchemaValidator. Voici les deux méthodes Initialize.

La méthode XmlSchemaValidator.Initialize par défaut initialise un objet XmlSchemaValidator à son état de départ, tandis que la méthode XmlSchemaValidator.Initialize surchargée, qui prend un objet XmlSchemaObject comme paramètre, initialise un objet XmlSchemaValidator à son état de départ pour une validation partielle.

Les deux méthodes Initialize ne peuvent être appelées qu'immédiatement après la construction d'un objet XmlSchemaValidator ou après un appel à la méthode EndValidation.

Pour un exemple de la méthode XmlSchemaValidator.Initialize, voir l'exemple donné dans l'introduction. Pour plus d'informations sur la méthode Initialize, voir la documentation de référence sur la classe XmlSchemaValidator.

Validation partielle

La méthode XmlSchemaValidator.Initialize, qui prend un objet XmlSchemaObject comme paramètre, initialise un objet XmlSchemaValidator à son état de départ pour une validation partielle.

Dans l'exemple suivant, un objet XmlSchemaObject est initialisé en vue d'une validation partielle à l'aide de la méthode XmlSchemaValidator.Initialize. L'élément de schéma orderNumber est transmis lorsque l'objet XmlQualifiedName sélectionne l'élément de schéma dans la collection XmlSchemaObjectTable retournée par la propriété GlobalElements de l'objet XmlSchemaSet. L'objet XmlSchemaValidator valide ensuite cet élément spécifique.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add(Nothing, "schema.xsd")
schemaSet.Compile()
Dim nameTable As NameTable = New NameTable()
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(nameTable)

Dim validator As XmlSchemaValidator = New XmlSchemaValidator(nameTable, schemaSet, manager, XmlSchemaValidationFlags.None)
validator.Initialize(schemaSet.GlobalElements.Item(New XmlQualifiedName("orderNumber")))

validator.ValidateElement("orderNumber", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateText("123")
validator.ValidateEndElement(Nothing)
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "schema.xsd");
schemaSet.Compile();
NameTable nameTable = new NameTable();
XmlNamespaceManager manager = new XmlNamespaceManager(nameTable);

XmlSchemaValidator validator = new XmlSchemaValidator(nameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
validator.Initialize(schemaSet.GlobalElements[new XmlQualifiedName("orderNumber")]);

validator.ValidateElement("orderNumber", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateText("123");
validator.ValidateEndElement(null);

L'exemple prend le schéma XML suivant comme entrée.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="orderNumber" type="xs:int" />
</xs:schema>

Pour plus d'informations sur la méthode Initialize, voir la documentation de référence sur la classe XmlSchemaValidator.

Ajout de schémas supplémentaires

La méthode AddSchema de la classe XmlSchemaValidator permet d'ajouter un schéma XML à l'ensemble de schémas utilisés pendant la validation. La méthode AddSchema peut être utilisée pour simuler l'effet de la rencontre d'un schéma XML inline dans le jeu d'informations XML en cours de validation.

Notes

L'espace de noms cible du paramètre XmlSchema ne peut pas correspondre à celui d'un élément ou attribut déjà rencontré par l'objet XmlSchemaValidator.

Si la valeur XmlSchemaValidationFlags.ProcessInlineSchema n'a pas été transmise comme paramètre au constructeur XmlSchemaValidator, la méthode AddSchema ne fait rien.

Le résultat de la méthode AddSchema dépend du contexte de nœuds XML actuel en cours de validation. Pour plus d’informations sur les contextes de validation, voir la section « Contexte de validation » de cette rubrique.

Pour plus d'informations sur la méthode AddSchema, voir la documentation de référence sur la classe XmlSchemaValidator.

Validation d'éléments, d'attributs et de contenu

La classe XmlSchemaValidator fournit plusieurs méthodes permettant de valider des éléments, des attributs et du contenu se trouvant dans un jeu d'informations XML par rapport à des schémas XML. Le tableau suivant décrit chacune de ces méthodes.

Méthode Description
ValidateElement Valide le nom de l'élément dans le contexte actuel.
ValidateAttribute Valide l'attribut dans le contexte de l'élément actuel ou par rapport à l'objet XmlSchemaAttribute transmis comme paramètre à la méthode Initialize.
ValidateEndOfAttributes Vérifie si tous les attributs obligatoires dans le contexte de l'élément sont présents et prépare l'objet XmlSchemaValidator à la validation du contenu enfant de l'élément.
ValidateText Vérifie si du texte est autorisé dans le contexte de l’élément actuel et accumule le texte pour une validation si l’élément actuel a un contenu simple.
ValidateWhitespace Vérifie si des espaces blancs sont autorisés dans le contexte de l’élément actuel et accumule les espaces blancs pour une validation si l’élément actuel a un contenu simple.
ValidateEndElement Pour les éléments ayant un contenu simple, vérifie si le contenu textuel de l'élément est valide par rapport à son type de données ; pour les éléments ayant un contenu complexe, vérifie si le contenu de l'élément actuel est complet.
SkipToEndElement Ignore la validation du contenu de l'élément actuel et prépare l'objet XmlSchemaValidator à la validation du contenu dans le contexte de l'élément parent.
EndValidation Termine la validation et vérifie les contraintes d’identité pour l’ensemble du document XML si l’option de validation ProcessIdentityConstraints est activée.

Notes

La classe XmlSchemaValidator a une transition d'état définie qui veille à la séquence et l'occurrence des appels effectués à chacune des méthodes décrites dans le tableau ci-dessus. La transition d'état spécifique de la classe XmlSchemaValidator est décrite dans la section « Transition d'état de XmlSchemaValidator » de cette rubrique.

Pour un exemple des méthodes utilisées pour valider des éléments, des attributs et du contenu dans un jeu d'informations XML, voir l'exemple de la section précédente. Pour plus d'informations sur ces méthodes, voir la documentation de référence sur la classe XmlSchemaValidator.

Validation de contenu à l'aide un objet XmlValueGetter

L'objet XmlValueGetterdelegate permet de transmettre la valeur de nœuds d'attribut, de texte ou d'espace blanc comme un type CLR (Common Language Runtime) compatible avec le type XSD (XML Schema Definition) de ces nœuds. Un objet XmlValueGetterdelegate s’avère utile si la valeur CLR d’un nœud d’attribut, de texte ou d’espace blanc est déjà disponible ; il évite de devoir la convertir en une string et la réanalyser pour la valider.

Les méthodes ValidateAttribute, ValidateText et ValidateWhitespace sont surchargées et acceptent la valeur des nœuds d'attribut, de texte ou d'espace blanc comme string ou comme XmlValueGetterdelegate.

Les méthodes suivantes de la classe XmlSchemaValidator prennent un objet XmlValueGetterdelegate comme paramètre.

L'exemple de XmlValueGetterdelegate suivant est pris de l'exemple de classe XmlSchemaValidator donné dans l'introduction. L'objet XmlValueGetterdelegate retourne la valeur d'un attribut sous la forme d'un objet DateTime. Pour valider cet objet DateTime retourné par l'objet XmlValueGetter, l'objet XmlSchemaValidator commence par le convertir en un ValueType (ValueType est le mappage CLR par défaut pour le type XSD) correspondant au type de données de l'attribut, puis il vérifie les facettes de la valeur convertie.

Shared dateTimeGetterContent As Object

Shared Function DateTimeGetterHandle() As Object
    Return dateTimeGetterContent
End Function

Shared Function DateTimeGetter(dateTime As DateTime) As XmlValueGetter
    dateTimeGetterContent = dateTime
    Return New XmlValueGetter(AddressOf DateTimeGetterHandle)
End Function
static object dateTimeGetterContent;

static object DateTimeGetterHandle()
{
    return dateTimeGetterContent;
}

static XmlValueGetter DateTimeGetter(DateTime dateTime)
{
    dateTimeGetterContent = dateTime;
    return new XmlValueGetter(dateTimeGetterHandle);
}

Pour un exemple complet de l'objet XmlValueGetterdelegate, voir l'exemple donné dans l'introduction. Pour plus d'informations sur l'objet XmlValueGetterdelegate, voir la documentation de référence sur les classes XmlValueGetter et XmlSchemaValidator.

Informations de post-validation de schéma

La classe XmlSchemaInfo représente certaines informations de post-validation de schéma d’un nœud XML validé par la classe XmlSchemaValidator. Diverses méthodes de la classe XmlSchemaValidator acceptent un objet XmlSchemaInfo comme paramètre null (out) facultatif.

Si la validation réussit, des propriétés de l'objet XmlSchemaInfo sont définies avec les résultats de la validation. Par exemple, en cas de validation réussie d'un attribut à l'aide de la méthode ValidateAttribute, les propriétés XmlSchemaInfo, SchemaAttribute, SchemaType et MemberType de l'objet Validity (s'il est spécifié) sont définies à l'aide des résultats de la validation.

Les méthodes suivantes de la classe XmlSchemaValidator acceptent un objet XmlSchemaInfo comme paramètre out.

Pour un exemple complet de la classe XmlSchemaInfo, voir l'exemple donné dans l'introduction. Pour plus d'informations sur la classe XmlSchemaInfo, voir la documentation de référence sur la classe XmlSchemaInfo.

Extraction des particules attendues, attributs attendus et attributs par défaut non spécifiés

La classe XmlSchemaValidator fournit les méthodes GetExpectedAttributes, GetExpectedParticles et GetUnspecifiedDefaultAttributes pour extraire les particules, attributs et attributs par défaut non spécifiés attendus dans le contexte de validation actuel.

Extraction des particules attendues

La méthode GetExpectedParticles retourne un tableau d'objets XmlSchemaParticle contenant les particules attendues dans le contexte de l'élément actuel. Les particules valides qui peuvent être retournées par la méthode GetExpectedParticles sont des instances des classes XmlSchemaElement et XmlSchemaAny.

Lorsque le constructeur du modèle de contenu est xs:sequence, seule la particule suivante dans la séquence est retournée. Si le constructeur du modèle de contenu est xs:all ou xs:choice, toutes les particules valides pouvant suivre dans le contexte de l'élément actuel sont retournées.

Notes

Si la méthode GetExpectedParticles est appelée immédiatement après l'appel à la méthode Initialize, la méthode GetExpectedParticles retourne tous les éléments globaux.

Par exemple, dans le schéma de langage XSD (XML Schema Definition) et le document XML qui suivent, après la validation de l'élément book, l'élément book est le contexte d'élément actuel. La méthode GetExpectedParticles retourne un tableau contenant un seul objet XmlSchemaElement représentant l'élément title. Lorsque le contexte de validation est l'élément title, la méthode GetExpectedParticles retourne un tableau vide. Si la méthode GetExpectedParticles est appelée après que l'élément title a été validé mais avant que l'élément description soit validé, elle retourne un tableau contenant un seul objet XmlSchemaElement représentant l'élément description. Si la méthode GetExpectedParticles est appelée après que l'élément description a été validé, elle retourne un tableau contenant un seul objet XmlSchemaAny représentant le caractère générique.

Dim reader As XmlReader =  XmlReader.Create("input.xml")

Dim schemaSet As New XmlSchemaSet()
schemaSet.Add(Nothing, "schema.xsd")
Dim manager As New XmlNamespaceManager(reader.NameTable)

Dim validator As New XmlSchemaValidator(reader.NameTable,schemaSet,manager,XmlSchemaValidationFlags.None)
validator.Initialize()

validator.ValidateElement("book", "", Nothing)

validator.ValidateEndOfAttributes(Nothing)
For Each element As XmlSchemaElement In validator.GetExpectedParticles()
    Console.WriteLine(element.Name)
Next

validator.ValidateElement("title", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
For Each element As XmlSchemaElement In validator.GetExpectedParticles()
    Console.WriteLine(element.Name)
Next
validator.ValidateEndElement(Nothing)

For Each element As XmlSchemaElement In validator.GetExpectedParticles()
    Console.WriteLine(element.Name)
Next

validator.ValidateElement("description", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateEndElement(Nothing)

For Each particle As XmlSchemaParticle In validator.GetExpectedParticles()
    Console.WriteLine(particle.GetType())
Next

validator.ValidateElement("namespace", "", Nothing)
validator.ValidateEndOfAttributes(Nothing)
validator.ValidateEndElement(Nothing)

validator.ValidateEndElement(Nothing)
XmlReader reader = XmlReader.Create("input.xml");

var schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "schema.xsd");
var manager = new XmlNamespaceManager(reader.NameTable);

var validator = new XmlSchemaValidator(reader.NameTable, schemaSet, manager, XmlSchemaValidationFlags.None);
validator.Initialize();

validator.ValidateElement("book", "", null);

validator.ValidateEndOfAttributes(null);
foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
    Console.WriteLine(element.Name);
}

validator.ValidateElement("title", "", null);
validator.ValidateEndOfAttributes(null);
foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
    Console.WriteLine(element.Name);
}
validator.ValidateEndElement(null);

foreach (XmlSchemaElement element in validator.GetExpectedParticles())
{
    Console.WriteLine(element.Name);
}

validator.ValidateElement("description", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateEndElement(null);

foreach (XmlSchemaParticle particle in validator.GetExpectedParticles())
{
    Console.WriteLine(particle.GetType());
}

validator.ValidateElement("namespace", "", null);
validator.ValidateEndOfAttributes(null);
validator.ValidateEndElement(null);

validator.ValidateEndElement(null);

L’exemple prend le code XML suivant comme entrée :

<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema">
  <xs:element name="book">
    <xs:sequence>
      <xs:element name="title" type="xs:string" />
      <xs:element name="description" type="xs:string" />
      <xs:any processContent="lax" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:element>
</xs:schema>

L’exemple prend le schéma XSD suivant comme entrée :

<book>
  <title>My Book</title>
  <description>My Book's Description</description>
  <namespace>System.Xml.Schema</namespace>
</book>

Notes

Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel en cours de validation. Pour plus d’informations, voir la section « Contexte de validation » de cette rubrique.

Pour un exemple de la méthode GetExpectedParticles, voir l'exemple donné dans l'introduction. Pour plus d'informations sur la méthode GetExpectedParticles, voir la documentation de référence sur la classe XmlSchemaValidator.

Extraction des attributs attendus

La méthode GetExpectedAttributes retourne un tableau d'objets XmlSchemaAttribute contenant les attributs attendus dans le contexte de l'élément actuel.

Par exemple, dans l'exemple donné dans l'introduction, la méthode GetExpectedAttributes permet d'extraire tous les attributs de l'élément book.

Si vous appelez la méthode GetExpectedAttributes immédiatement après la méthode ValidateElement, elle retourne tous les attributs pouvant apparaître dans le document XML. Toutefois, si vous appelez la méthode GetExpectedAttributes après un ou plusieurs appels à la méthode ValidateAttribute, elle retourne les attributs qui n'ont pas encore été validés pour l'élément actuel.

Notes

Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel en cours de validation. Pour plus d’informations, voir la section « Contexte de validation » de cette rubrique.

Pour un exemple de la méthode GetExpectedAttributes, voir l'exemple donné dans l'introduction. Pour plus d'informations sur la méthode GetExpectedAttributes, voir la documentation de référence sur la classe XmlSchemaValidator.

Extraction des attributs par défaut non spécifiés

La méthode GetUnspecifiedDefaultAttributes remplit l'objet ArrayList spécifié avec des objets XmlSchemaAttribute pour tous les attributs ayant des valeurs par défaut qui n'ont pas encore été validés à l'aide de la méthode ValidateAttribute dans le contexte de l'élément. La méthode GetUnspecifiedDefaultAttributes doit être appelée après la méthode ValidateAttribute pour chaque attribut du contexte de l'élément. La méthode GetUnspecifiedDefaultAttributes doit être utilisée pour déterminer les attributs par défaut à insérer dans le document XML en cours de validation.

Pour plus d'informations sur la méthode GetUnspecifiedDefaultAttributes, voir la documentation de référence sur la classe XmlSchemaValidator.

Gestion des événements de validation de schéma

Les avertissements et erreurs de validation de schéma rencontrés pendant la validation sont gérés par l’événement ValidationEventHandler de la classe XmlSchemaValidator.

Les avertissements de validation de schéma ont une valeur XmlSeverityType de Warning ; les erreurs de validation de schéma ont une valeur XmlSeverityType de Error. Si aucun événement ValidationEventHandler n’a été assigné, un objet XmlSchemaValidationException est levé pour toutes les erreurs de validation de schéma ayant XmlSeverityType comme valeur Error. Toutefois, cet objet XmlSchemaValidationException n’est pas levé pour les avertissements de validation de schéma dont l’objet XmlSeverityType a pour valeur Warning.

L'exemple suivant illustre un objet ValidationEventHandler qui reçoit des avertissements et erreurs de validation de schéma pendant une validation de schéma, provenant de l'exemple donné dans l'introduction.

Shared Sub SchemaValidationEventHandler(sender As Object, e As ValidationEventArgs)

    Select Case e.Severity
        Case XmlSeverityType.Error
            Console.WriteLine(vbCrLf & "Error: {0}", e.Message)
            Exit Sub
        Case XmlSeverityType.Warning
            Console.WriteLine(vbCrLf & "Warning: {0}", e.Message)
            Exit Sub
    End Select
End Sub
static void SchemaValidationEventHandler(object sender, ValidationEventArgs e)
{
    switch (e.Severity)
    {
        case XmlSeverityType.Error:
            Console.WriteLine("\nError: {0}", e.Message);
            break;
        case XmlSeverityType.Warning:
            Console.WriteLine("\nWarning: {0}", e.Message);
            break;
    }
}

Pour un exemple complet de l'objet ValidationEventHandler, voir l'exemple donné dans l'introduction. Pour plus d’informations, consultez la documentation de référence sur la classe XmlSchemaInfo.

Transition d'état de XmlSchemaValidator

La classe XmlSchemaValidator a une transition d'état définie qui veille à la séquence et l'occurrence des appels effectués à chacune des méthodes utilisées pour valider des éléments, des attributs et du contenu dans un jeu d'informations XML.

Le tableau suivant décrit la transition d'état de la classe XmlSchemaValidator, ainsi que la séquence et l'occurrence des appels de méthode qui peuvent être effectués dans chaque état.

State Transition
Valider Initialize (ValidateAttribute | TopLevel*) EndValidation
TopLevel ValidateWhitespace | ValidateText | Element
Élément ValidateElementValidateAttribute* (ValidateEndOfAttributes Content*)? ValidateEndElement |

ValidateElement ValidateAttribute* SkipToEndElement |

ValidateElementValidateAttribute* ValidateEndOfAttributes Content* SkipToEndElement |
Contenu ValidateWhitespace | ValidateText | Element

Notes

Un objet InvalidOperationException est levé par chacune des méthodes dans le tableau ci-dessus lorsque l'appel à la méthode est effectué dans l'ordre incorrect d'après l'état actuel d'un objet XmlSchemaValidator.

Le tableau de transition d'état ci-dessus utilise des signes de ponctuation pour décrire les méthodes et d'autres états qui peuvent être appelés pour chaque état de la transition d'état de la classe XmlSchemaValidator. Les symboles utilisés sont les mêmes que ceux qui se trouvent dans la référence Standards XML concernant la DTD (définition de type de document).

Le tableau suivant décrit la façon dont les signes de ponctuation trouvés dans le tableau de transition d'état ci-dessus affectent les méthodes et autres états qui peuvent être appelés pour chaque état de la transition d'état de la classe XmlSchemaValidator.

Symbole Description
| La méthode ou l'état au choix (celui qui se trouve devant la barre ou après la barre) peut être appelé.
? La méthode ou l'état qui précède le point d'interrogation est facultatif mais, s'il est appelé, il ne peut l'être qu'une fois.
* La méthode ou l'état qui précède le signe * est facultatif et peut être appelé plusieurs fois.

Contexte de validation

Les méthodes de la classe XmlSchemaValidator permettant de valider des éléments, des attributs et du contenu dans un jeu d'informations XML modifient le contexte de validation d'un objet XmlSchemaValidator. Par exemple, la méthode SkipToEndElement ignore la validation du contenu de l'élément actuel et prépare l'objet XmlSchemaValidator à la validation du contenu dans le contexte de l'élément parent ; elle équivaut à ignorer la validation pour tous les enfants de l'élément actuel, puis à appeler la méthode ValidateEndElement.

Les résultats des méthodes GetExpectedParticles, GetExpectedAttributes et AddSchema de la classe XmlSchemaValidator dépendent du contexte actuel en cours de validation.

Le tableau suivant décrit les résultats de l'appel de ces méthodes après l'une des méthodes de la classe XmlSchemaValidator utilisée pour valider des éléments, des attributs et du contenu dans un jeu d'informations XML.

Méthode GetExpectedParticles GetExpectedAttributes AddSchema
Initialize Si la méthode Initialize par défaut est appelée, la méthode GetExpectedParticles retourne un tableau contenant tous les éléments globaux.

Si la méthode Initialize surchargée, qui prend un objet XmlSchemaObject comme paramètre, est appelée pour initialiser une validation partielle d'un élément, la méthode GetExpectedParticles ne retourne que l'élément auquel l'objet XmlSchemaValidator a été initialisé.
Si la méthode Initialize par défaut est appelée, la méthode GetExpectedAttributes retourne un tableau vide.

Si la méthode Initialize surchargée, qui prend un objet XmlSchemaObject comme paramètre, est appelée pour initialiser une validation partielle d’un attribut, la méthode GetExpectedAttributes ne retourne que l’attribut auquel l’objet XmlSchemaValidator a été initialisé.
Ajoute le schéma à l'objet XmlSchemaSet de l'objet XmlSchemaValidator s'il n'a pas d'erreurs de pré-traitement.
ValidateElement Si l'élément de contexte est valide, la méthode GetExpectedParticles retourne la séquence d'éléments attendus comme enfants de l'élément de contexte.

Si l'élément de contexte n'est pas valide, la méthode GetExpectedParticles retourne un tableau vide.
Si l'élément de contexte est valide et si aucun appel à la méthode ValidateAttribute n'a été effectué précédemment, la méthode GetExpectedAttributes retourne une liste de tous les attributs définis pour l'élément de contexte.

Si certains attributs ont déjà été validés, la méthode GetExpectedAttributes retourne une liste des attributs restant à valider.

Si l'élément de contexte n'est pas valide, la méthode GetExpectedAttributes retourne un tableau vide.
Identique à ce qui précède.
ValidateAttribute Si l'attribut de contexte est un attribut de niveau supérieur, la méthode GetExpectedParticles retourne un tableau vide.

Sinon, la méthode GetExpectedParticles retourne la séquence d'éléments attendus comme premier enfant de l'élément de contexte.
Si l'attribut de contexte est un attribut de niveau supérieur, la méthode GetExpectedAttributes retourne un tableau vide.

Sinon, la méthode GetExpectedAttributes retourne la liste des attributs restant à valider.
Identique à ce qui précède.
GetUnspecifiedDefaultAttributes La méthode GetExpectedParticles retourne la séquence d'éléments attendus comme premier enfant de l'élément de contexte. La méthode GetExpectedAttributes retourne une liste des attributs obligatoires et facultatifs qui doivent encore être validés pour l'élément de contexte. Identique à ce qui précède.
ValidateEndOfAttributes La méthode GetExpectedParticles retourne la séquence d'éléments attendus comme premier enfant de l'élément de contexte. La méthode GetExpectedAttributes retourne un tableau vide. Identique à ce qui précède.
ValidateText Si le contentType de l'élément de contexte est Mixed, la méthode GetExpectedParticles retourne la séquence d'éléments attendus à la position suivante.

Si le contentType de l'élément de contexte est TextOnly ou Empty, la méthode GetExpectedParticles retourne un tableau vide.

Si le contentType de l’élément de contexte est ElementOnly, la méthode GetExpectedParticles retourne la séquence d’éléments attendus à la position suivante, mais une erreur de validation s’est déjà produite.
La méthode GetExpectedAttributes retourne la liste d'attributs non validés de l'élément de contexte. Identique à ce qui précède.
ValidateWhitespace Si l'espace blanc de contexte est un espace blanc de niveau supérieur, la méthode GetExpectedParticles retourne un tableau vide.

Sinon, le comportement de la méthode GetExpectedParticles est le même que dans ValidateText.
Si l'espace blanc de contexte est un espace blanc de niveau supérieur, la méthode GetExpectedAttributes retourne un tableau vide.

Sinon, le comportement de la méthode GetExpectedAttributes est le même que dans ValidateText.
Identique à ce qui précède.
ValidateEndElement La méthode GetExpectedParticles retourne la séquence d'éléments attendus après l'élément de contexte (frères possibles). La méthode GetExpectedAttributes retourne la liste d'attributs non validés de l'élément de contexte.

Si l'élément de contexte n'a pas de parent, la méthode GetExpectedAttributes retourne une liste vide (l'élément de contexte est le parent de l'élément actuel pour lequel la méthode ValidateEndElement a été appelée).
Identique à ce qui précède.
SkipToEndElement Comme pour ValidateEndElement. Comme pour ValidateEndElement. Identique à ce qui précède.
EndValidation Retourne un tableau vide. Retourne un tableau vide. Identique à ce qui précède.

Notes

Les valeurs retournées par les diverses propriétés de la classe XmlSchemaValidator ne sont pas altérées par un appel à l'une des méthodes du tableau ci-dessus.

Voir aussi