Partager via


Rappel du gestionnaire d'événements de validation avec XmlValidatingReader

L'événement ValidationEventHandler permet de définir un gestionnaire d'événements chargé de recevoir des informations relatives aux erreurs rencontrées lors des validations de schéma XDR (XML-Data Reduced), de schéma de langage XSD (XML Schema Definition) ou de définition de type de document (DTD).

Les erreurs et avertissements liés à une validation sont signalés par le rappel ValidationEventHandler. Si aucun ValidationEventHandler n'est fourni et qu'une erreur d'analyse se produit, l'erreur est signalée par une exception XmlException. Si une erreur de validation se produit, une exception XmlSchemaException est levée. Si une exception est levée, l'objet XmlValidatingReader ne peut pas être redémarré.

RemarqueRemarque

La classe XmlValidatingReader est obsolète dans le .NET Framework version 2.0.Vous pouvez créer une instance de l'objet XmlReader de validation à l'aide de la classe XmlReaderSettings et de la méthode Create.Pour plus d'informations, voir Validation de données XML avec XmlReader.

Utilisation de ValidationEventHandler

La validation d'événements avec ValidationEventHandler n'a lieu que si la propriété ValidationType a la valeur ValidationType.DTD, ValidationType.Schema, ValidationType.XDR ou ValidationType.Auto. Par défaut, la propriété ValidationType a la valeur ValidationType.Auto.

La classe XmlSchemaCollection utilise l'événement ValidationEventHandler pour gérer des erreurs de validation des schémas XML et XDR lorsque ces schémas sont ajoutés à l'objet XmlSchemaCollection.

L'exemple de code suivant illustre la méthode ValidationCallback lorsqu'un gestionnaire d'événements de validation est fourni.

Sub ValidationCallback(sender As Object, args As ValidationEventArgs)
End Sub
void ValidationCallback(object sender, ValidationEventArgs e)
{
}

La classe ValidationEventArgs possède les propriétés pour un message de texte, une énumération XmlSeverityType signalant une erreur ou un avertissement de validation et une exception contenant des informations sur l'objet XmlSchemaException associées à l'erreur de validation particulière.

Si aucun gestionnaire d'événements n'est fourni, une exception est levée pour la première erreur de validation du type XmlSeverityType = Error. La classe XmlValidatingReader ne peut pas être redémarrée après cette erreur. Des exceptions ne sont pas levées pour les erreurs de validation du type XmlSeverityType = Warning. Une exception XmlSchemaException est levée si l'erreur de validation s'est produite pendant la validation par rapport à un schéma ou une DTD.

Si un élément ou un attribut donné signale une erreur de validité par le biais de la méthode ValidationCallback parce que le modèle de contenu ne correspond pas, le reste du modèle de contenu de cet élément n'est pas validé. (Toutefois, les éléments enfants de l'élément ou de l'attribut en question sont validés.) Dès que l'objet XmlValidatingReader identifie une erreur pour un élément donné, il arrête la validation de cet élément.

Vérification des résultats de validation

L'événement ValidationEventHandler et l'énumération XmlSeverityType permettent de vérifier l'état de validation d'une instance XML. S'agissant d'erreurs de validation irrécupérables, la propriété ValidationEventArgs.Severity a la valeur XmlSeverityType.Error, ce qui indique qu'une erreur irrécupérable est survenue. Pour toutes les erreurs de validation récupérables (par exemple, les erreurs dues à l'absence d'informations DTD ou de schéma nécessaires à la validation des éléments et des attributs), la propriété Severity a la valeur XmlSeverityType.Warning. Des avertissements peuvent se produire pour toutes les valeurs ValidationType, à l'exception de ValidationType.None.

RemarqueRemarque

L'appel d'une méthode qui modifie l'état du lecteur dans le ValidationEventHandler n'est pas pris en charge.Par exemple, nous ne pouvons pas garantir l'état du lecteur lorsque vous appelez Read(), implicitement ou explicitement, sur le lecteur dans un gestionnaire d'événements.

L'exemple de code suivant illustre l'utilisation de l'événement ValidationEventHandler pour valider une instance XML par rapport à un schéma XML dans un objet XmlSchemaCollection.

Private Shared reader As XmlValidatingReader = Nothing
Private Shared treader As XmlTextReader = Nothing
Private Shared filename As [String] = String.Empty
   
   Public Overloads Shared Sub Main()

      Dim xsc As New XmlSchemaCollection()
      
      Try
         xsc.Add(Nothing, New XmlTextReader("MySchema.xsd"))
         treader = New XmlTextReader("Myfilename.xml")
         reader = New XmlValidatingReader(treader)
         
         reader.Schemas.Add(xsc)
         reader.ValidationType = ValidationType.Schema
         

         AddHandler reader.ValidationEventHandler, AddressOf sample.ValidationCallback
         
         While reader.Read()
         End While
      Catch e As Exception
         If Not (reader Is Nothing) Then
            reader.Close()
         End If
         Console.WriteLine(e.ToString())
      End Try
   End Sub
   ' Main
   
Shared Sub ValidationCallback(sender As Object, args As ValidationEventArgs)
      If args.Severity = XmlSeverityType.Warning Then
         Console.WriteLine("No schema found to enforce validation.")
         Console.WriteLine((filename + "(" + treader.LineNumber + "," + treader.LinePosition + ")" + args.Message))
      End If
' ValidationCallback
End Sub
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

public class Sample
{
    static String filename = "BooksSchema.xml";
    static XmlTextReader treader = null;

    public static void Main()
    {

        XmlValidatingReader reader = null;
        
        XmlSchemaCollection xsc = new XmlSchemaCollection();
        ValidationEventHandler eventHandler = new ValidationEventHandler(Sample.ValidationCallback);

        try
        {
            xsc.Add(null, new XmlTextReader("Books.xsd"));
            treader = new XmlTextReader(filename);
            reader = new XmlValidatingReader(treader);

            reader.Schemas.Add(xsc);
            reader.ValidationType = ValidationType.Schema;

            reader.ValidationEventHandler += eventHandler;

            while (reader.Read())
            {
            }

            Console.WriteLine("Validation successful.");
        } 
        catch (Exception e)
        {
            if ( reader != null )
                reader.Close();
            Console.WriteLine(e.ToString());
        }

    }

    public static void ValidationCallback(object sender, ValidationEventArgs args )
    {
        if (args.Severity == XmlSeverityType.Warning)
        {
            Console.WriteLine("No schema found to enforce validation.");
            Console.WriteLine(filename + "(" + treader.LineNumber + "," + treader.LinePosition + ")" + args.Message);

        }
    }
}

Le code suivant présente le contenu du fichier d'entrée, BooksSchema.xml, à valider.

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
  <book genre="autobiography">
    <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">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
</bookstore>

Le code suivant présente le contenu du fichier d'entrée, Books.xsd, par rapport auquel la validation doit s'effectuer.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

 <xs:element name="bookstore" type="bookstoreType"/>

 <xs:complexType name="bookstoreType">
  <xs:sequence maxOccurs="unbounded">
   <xs:element name="book"  type="bookType"/>
  </xs:sequence>
 </xs:complexType>

 <xs:complexType name="bookType">
  <xs:sequence>
   <xs:element name="title" type="xs:string"/>
   <xs:element name="author" type="authorName"/>
   <xs:element name="price"  type="xs:decimal"/>
  </xs:sequence>
  <xs:attribute name="genre" type="xs:string"/>
 </xs:complexType>

 <xs:complexType name="authorName">
  <xs:sequence>
   <xs:element name="first-name"  type="xs:string"/>
   <xs:element name="last-name" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>

</xs:schema>

L'exemple de code suivant illustre l'utilisation de l'événement ValidationEventHandler. Toute erreur est envoyée à la console.

' Set the validation event handler.
AddHandler reader.ValidationEventHandler, AddressOf ValidationCallBack


Private Sub ValidationCallBack(sender As Object, args As ValidationEventArgs)
   Console.WriteLine("Validation CallBack: type: {0} message: {1}", args.Severity, args.Message)
' ValidationCallBack
End Sub
// Set the validation event handler.
reader.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

private void ValidationCallBack(object sender, ValidationEventArgs args )
{
  Console.WriteLine("Validation CallBack: type: {0} message: {1}", args.Severity, args.Message);
}

Voir aussi

Concepts

Lecture de XML avec XmlReader

Autres ressources

Utilisation de la classe XmlReader