Partager via


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

L'événement ValidationEventHandler s'utilise afin 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, la classe XmlValidatingReader ne peut pas être redémarrée.

Utilisation de ValidationEventHandler

Les événements de validation sont signalés à l'aide de ValidationEventHandler uniquement si la propriété ValidationType de la classe XmlValidatingReader a la valeur ValidationType.DTD, ValidationType.Schema, ValidationType.XDR ou ValidationType.Auto lors d'un appel à une méthode Read, ReadInnerXml, ReadOuterXml ou Skip. La valeur par défaut de la propriété ValidationType est 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 à XmlSchemaCollection.

L'exemple de code ci-dessous 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
[C#]
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 Error ou Warning, et une exception contenant des informations 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 la classe XmlValidatingReader identifie une erreur pour un élément donné, elle 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 de document XML. S'agissant d'erreurs de validation irrécupérables, la propriété 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 être générés pour toutes les valeurs ValidationType à l'exception de la valeur ValidationType.None.

L'exemple de code ci-dessous illustre l'utilisation de l'événement ValidationEventHandler pour valider une instance de document XML par rapport à un schéma XML dans une collection 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
[C#]
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 ci-dessous 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 ci-dessous 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
[C#]
// 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

Validation XML à l'aide de XmlValidatingReader | Validation XML à l'aide de schémas