Partager via


Validation XmlSchemaValidator de type push

La XmlSchemaValidator classe fournit un mécanisme efficace et hautes performances pour valider les données XML par rapport aux schémas XML de manière push. Par exemple, la XmlSchemaValidator classe vous permet de valider un ensemble d’informations XML sur place sans avoir à le sérialiser en tant que document XML, puis à réparer le document à l’aide d’un lecteur XML de validation.

La XmlSchemaValidator classe peut être utilisée dans des scénarios avancés tels que la création de moteurs de validation sur des sources de données XML personnalisées ou comme moyen de générer un enregistreur XML de validation.

Voici un exemple d’utilisation de la XmlSchemaValidator classe pour valider le contosoBooks.xml fichier par rapport au contosoBooks.xsd schéma. L’exemple utilise la XmlSerializer classe pour désérialiser le contosoBooks.xml fichier et passer la valeur des nœuds aux méthodes de la XmlSchemaValidator classe.

Remarque

Cet exemple est utilisé dans 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: '{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 '{schemaInfo.SchemaElement.Name}' with type '{schemaInfo.SchemaType}' is '{schemaInfo.Validity}'");
            }
            else if (schemaInfo.SchemaAttribute != null)
            {
                Console.WriteLine($"Attribute '{schemaInfo.SchemaAttribute.Name}' with type '{schemaInfo.SchemaType}' is '{schemaInfo.Validity}'");
            }
        }

        static void SchemaValidationEventHandler(object sender, ValidationEventArgs e)
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    Console.WriteLine($"\nError: {e.Message}");
                    break;
                case XmlSeverityType.Warning:
                    Console.WriteLine($"\nWarning: {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 considère également 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 des données XML à l’aide de XmlSchemaValidator

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

Le XmlSchemaValidator constructeur accepte XmlNameTable, XmlSchemaSetet XmlNamespaceManager les objets en tant que paramètres, ainsi qu’une XmlSchemaValidationFlags valeur en tant que paramètre. L’objet XmlNameTable est utilisé pour atomiser des chaînes d’espace de noms connues telles que l’espace de noms de schéma, l’espace de noms XML, et ainsi de suite, et est passé à la méthode ParseValue en validant le contenu simple. L’objet XmlSchemaSet contient les schémas XML utilisés pour valider l’ensemble d’informations XML. L’objet XmlNamespaceManager est utilisé pour résoudre les espaces de noms rencontrés lors de la validation. La XmlSchemaValidationFlags valeur est utilisée pour désactiver certaines fonctionnalités de validation.

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

Initialisation de la validation

Une fois qu’un XmlSchemaValidator objet a été construit, il existe deux méthodes surchargées Initialize utilisées pour initialiser l’état de l’objet XmlSchemaValidator . Voici les deux Initialize méthodes.

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

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

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

Validation partielle

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

Dans l'exemple suivant, un XmlSchemaObject est initialisé pour une validation partielle à l'aide de la méthode XmlSchemaValidator.Initialize. L'élément de schéma orderNumber est passé en sélectionnant l'élément de schéma XmlQualifiedName dans la collection XmlSchemaObjectTable renvoyé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 Initialize méthode, consultez la documentation de référence de XmlSchemaValidator classe.

Ajout de schémas supplémentaires

La AddSchema méthode de la XmlSchemaValidator classe est utilisée pour ajouter un schéma XML au jeu de schémas utilisés lors de la validation. La AddSchema méthode peut être utilisée pour simuler l’effet de la rencontre d’un schéma XML inline dans l’ensemble d’informations XML validé.

Remarque

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

Si la XmlSchemaValidationFlags.ProcessInlineSchema valeur n’a pas été passée en tant que paramètre au XmlSchemaValidator constructeur, la AddSchema méthode ne fait rien.

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

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

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

La XmlSchemaValidator classe fournit plusieurs méthodes utilisées pour valider des éléments, des attributs et du contenu dans un ensemble d’informations XML sur des schémas XML. Le tableau suivant décrit chacune de ces méthodes.

Méthode Descriptif
ValidateElement Valide le nom de l’élément dans le contexte actuel.
ValidateAttribute Valide l’attribut dans le contexte d’élément actuel ou par rapport à l’objet XmlSchemaAttribute passé en tant que paramètre à la Initialize méthode.
ValidateEndOfAttributes Vérifie si tous les attributs requis dans le contexte d’élément sont présents et prépare l’objet XmlSchemaValidator pour valider le contenu enfant de l’élément.
ValidateText Vérifie si le texte est autorisé dans le contexte de l’élément actuel et accumule le texte pour la validation si l’élément actuel a du contenu simple.
ValidateWhitespace Vérifie si l’espace blanc est autorisé dans le contexte d’élément actuel et accumule l’espace blanc pour la validation si l’élément actuel a du contenu simple.
ValidateEndElement Vérifie si le contenu texte de l’élément est valide en fonction de son type de données pour les éléments avec du contenu simple et vérifie si le contenu de l’élément actuel est complet pour les éléments avec du contenu complexe.
SkipToEndElement Ignore la validation du contenu de l’élément actuel et prépare l’objet XmlSchemaValidator pour valider le contenu dans le contexte de l’élément parent.
EndValidation Termine la validation et vérifie les contraintes d’identité pour l’intégralité du document XML si l’option ProcessIdentityConstraints de validation est définie.

Remarque

La XmlSchemaValidator classe a une transition d’état définie qui applique la séquence et l’occurrence des appels effectués à chacune des méthodes décrites dans le tableau précédent. La transition d’état spécifique de la XmlSchemaValidator classe est décrite dans la section « XmlSchemaValidator State Transition » de cette rubrique.

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

Validation du contenu à l’aide d’un XmlValueGetter

Les XmlValueGetterdelegate peuvent être utilisés pour convertir la valeur des nœuds d’attribut, de texte ou d’espace blanc en types CLR (Common Language Runtime) compatibles avec le type XSD (XML Schema Definition Language) de l’attribut, du texte ou du nœud d’espace blanc. 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 en tant que string ou XmlValueGetterdelegate.

Les méthodes suivantes de la XmlSchemaValidator classe acceptent un XmlValueGetterdelegate paramètre.

Voici un exemple XmlValueGetterdelegate extrait de l’exemple de classe XmlSchemaValidator présenté dans l’introduction. Renvoie XmlValueGetterdelegate la valeur d’un attribut en tant qu’objet DateTime . Pour valider cet DateTime objet retourné par le XmlValueGetter, l’objet XmlSchemaValidator le convertit d’abord en ValueType (ValueType est le mappage CLR par défaut pour le type XSD) pour le type de données de l’attribut, puis vérifie les facettes sur 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 obtenir un exemple complet de l’exemple XmlValueGetterdelegate, consultez l’exemple dans l’introduction. Pour plus d’informations sur les XmlValueGetterdelegate, consultez la documentation de référence sur les classes XmlValueGetter et XmlSchemaValidator.

Informations de post-validation de schéma

La classe XmlSchemaInfo représente certains éléments du post-schéma-Validation-Information d’un nœud XML validé par la classe XmlSchemaValidator. Différentes méthodes de la XmlSchemaValidator classe acceptent un XmlSchemaInfo objet comme paramètre facultatif (null). out

Une fois la validation réussie, les propriétés de l’objet XmlSchemaInfo sont définies avec les résultats de la validation. Par exemple, lors de la validation réussie d’un attribut à l’aide de la méthode ValidateAttribute, les propriétés de l'objet XmlSchemaInfo (si spécifiées) SchemaAttribute, SchemaType, MemberType, et Validity sont définies avec les résultats de la validation.

Les méthodes de classe suivantes XmlSchemaValidator acceptent un XmlSchemaInfo objet en tant que paramètre out.

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

Récupération des particules attendues, des attributs et des attributs par défaut non spécifiés

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

Récupération des particules attendues

La GetExpectedParticles méthode retourne un tableau d’objets XmlSchemaParticle contenant les particules attendues dans le contexte d’é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 compositeur du modèle de contenu est un xs:sequence, seule la particule suivante de 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.

Remarque

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

Par exemple, dans le schéma XSD (XML Schema Definition Language) et le document XML qui suivent, après avoir validé l’élément book , l’élément book est le contexte d’élément actuel. La GetExpectedParticles méthode retourne un tableau contenant un seul XmlSchemaElement objet représentant l’élément title . Lorsque le contexte de validation est l’élément title , la GetExpectedParticles méthode retourne un tableau vide. Si la GetExpectedParticles méthode est appelée après la validation de l’élément title , mais avant la validation de l’élément description , elle retourne un tableau contenant un seul XmlSchemaElement objet représentant l’élément description . Si la GetExpectedParticles méthode est appelée après la validation de l’élément description , elle retourne un tableau contenant un seul XmlSchemaAny objet 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>

Remarque

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

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

Récupération des attributs attendus

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

Par exemple, dans l’exemple de l’introduction, la GetExpectedAttributes méthode est utilisée pour récupérer tous les attributs de l’élément book .

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

Remarque

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

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

Récupération d’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 GetUnspecifiedDefaultAttributes méthode doit être appelée après avoir appelé la ValidateAttribute méthode sur chaque attribut dans le contexte d’élément. La GetUnspecifiedDefaultAttributes méthode doit être utilisée pour déterminer quels attributs par défaut doivent être insérés dans le document XML en cours de validation.

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

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 XmlSchemaValidator classe.

Les avertissements de validation de schéma ont une valeur XmlSeverityType de Warning, et 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.

Voici un exemple d’un ValidationEventHandler qui reçoit des avertissements et des erreurs rencontrés lors de la validation de schéma, extrait de l’exemple mentionné 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 obtenir un exemple complet de l’exemple ValidationEventHandler, consultez l’exemple dans l’introduction. Pour plus d’informations, consultez la documentation de référence de XmlSchemaInfo classe.

Transition d'état du validateur de schéma XML

La XmlSchemaValidator classe a une transition d’état définie qui applique 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 ensemble d’informations XML.

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

État Transition
Valider Initialize (ValidateAttribute | TopLevel*) EndValidation
Niveau Supérieur ValidateWhitespace | ValidateText | Élément
Élément ValidateElement ValidateAttribute* (ValidateEndOfAttributes Contenu*) ? ValidateEndElement |

ValidateElement ValidateAttribute * SkipToEndElement |

ValidateElement ValidateAttribute * ValidateEndOfAttributes Contenu* SkipToEndElement |
Contenu ValidateWhitespace | ValidateText | Élément

Remarque

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.

La table de transition d’état ci-dessus utilise des symboles 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 XmlSchemaValidator classe. Les symboles utilisés sont les mêmes que ceux trouvés dans la référence de normes XML pour la définition de type de document (DTD).

Le tableau suivant décrit comment les symboles de ponctuation trouvés dans la table de transition d’état ci-dessus affectent les méthodes et d’autres états qui peuvent être appelés pour chaque état dans la transition d’état de la XmlSchemaValidator classe.

Symbole Descriptif
| 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 être appelé qu’une seule fois.
* La méthode ou l’état qui précède le symbole * est facultatif et peut être appelé plusieurs fois.

Contexte de validation

Les méthodes de la XmlSchemaValidator classe utilisées pour valider des éléments, des attributs et du contenu dans un jeu d’informations XML, modifient le contexte de validation d’un XmlSchemaValidator objet. Par exemple, la méthode SkipToEndElement ignore la validation du contenu de l’élément actuel et prépare l’objet XmlSchemaValidator à valider le contenu dans le contexte de l’élément parent ; cela é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 à valider.

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

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

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

Si la surcharge de la méthode Initialize prenant un paramètre XmlSchemaObject est appelée pour initialiser la validation partielle d’un attribut, GetExpectedAttributes retourne uniquement l’attribut auquel l'objet XmlSchemaValidator a été initialisé.
Ajoute le schéma à l’objet XmlSchemaSetXmlSchemaValidator si aucune erreur de prétraitement n'est présente.
ValidateElement Si l’élément de contexte est valide, GetExpectedParticles retourne la séquence d’éléments attendus en tant qu’enfants de l’élément de contexte.

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

Si certains attributs ont déjà été validés, GetExpectedAttributes retourne une liste des attributs restants à valider.

Si l’élément de contexte n’est pas valide, GetExpectedAttributes retourne un tableau vide.
Identique à ce qui précède.
ValidateAttribute Si l’attribut de contexte est un attribut de niveau supérieur, 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, GetExpectedAttributes retourne un tableau vide.

Sinon GetExpectedAttributes , retourne la liste des attributs restants à valider.
Identique à ce qui précède.
GetUnspecifiedDefaultAttributes GetExpectedParticles retourne la séquence d’éléments attendus comme premier enfant de l’élément de contexte. GetExpectedAttributes retourne une liste des attributs obligatoires et facultatifs qui ne sont pas encore validés pour l’élément de contexte. Identique à ce qui précède.
ValidateEndOfAttributes GetExpectedParticles retourne la séquence d’éléments attendus comme premier enfant de l’élément de contexte. GetExpectedAttributes retourne un tableau vide. Identique à ce qui précède.
ValidateText Si le contentType de l’élément de contexte est mixte, 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, GetExpectedParticles retourne un tableau vide.

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

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

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

Si l’élément de contexte n’a pas de parent, GetExpectedAttributes retourne une liste vide (l’élément de contexte est le parent de l’élément actuel sur lequel ValidateEndElement il a été appelé).
Identique à ce qui précède.
SkipToEndElement Identique à ValidateEndElement. Identique à ValidateEndElement. Identique à ce qui précède.
EndValidation Retourne un tableau vide. Retourne un tableau vide. Identique à ce qui précède.

Remarque

Les valeurs retournées par les différentes propriétés de la XmlSchemaValidator classe ne sont pas modifiées en appelant l’une des méthodes du tableau ci-dessus.

Voir aussi