Callback del gestore dell'evento di convalida di XmlValidatingReader

L'evento ValidationEventHandler viene utilizzato per impostare un gestore eventi per la ricezione di informazioni sugli errori di convalida degli schemi DTD (document type definition), XDR (XML-Data Reduced) e del linguaggio XSD (XML Schema Definition).

Gli errori di convalida e gli avvisi vengono segnalati attraverso il callback ValidationEventHandler. Se non viene fornita alcuna ValidationEventHandler e si verifica un errore di analisi, l'errore verrà segnalato generando una XmlException. Se si verifica un errore di convalida, verrà generata una XmlSchemaException. Se viene generata un'eccezione, non sarà possibile riavviare XmlValidatingReader.

Utilizzo di ValidationEventHandler

Gli eventi di convalida con ValidationEventHandler si verificano solo se la proprietà ValidationType di XmlValidatingReader è impostata su ValidationType.DTD, ValidationType.Schema, ValidationType.XDR o ValidationType.Auto durante una chiamata Read, ReadInnerXml, ReadOuterXml o Skip. Per impostazione predefinita, la proprietà ValidationType è impostata su ValidationType.Auto.

La classe XmlSchemaCollection utilizza l'evento ValidationEventHandler per gestire gli errori di convalida nello schema XML o nello schema XDR quando questi schemi vengono aggiunti a XmlSchemaCollection.

Nell'esempio di codice che segue viene dimostrato il metodo ValidationCallback quando viene fornito un gestore eventi della convalida.

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

La classe ValidationEventArgs ha delle proprietà per un messaggio di testo, un'enumerazione XmlSeverityType che indica Error o Warning e un'eccezione contenente le informazioni di XmlSchemaException associate a quel determinato errore di convalida.

Se non viene fornito alcun gestore eventi, verrà generata un'eccezione per il primo errore di convalida con XmlSeverityType = Error. XmlValidatingReader non può più essere riavviata dopo questo errore. Le eccezioni non vengono generate per gli errori di convalida con XmlSeverityType = Warning. Una XmlSchemaException viene generata se l'errore di convalida si è verificato durante la convalida rispetto a uno schema o DTD.

Se un determinato elemento o attributo riporta un errore di validità attraverso il metodo ValidationCallback in quanto il modello di contenuto non corrisponde, il resto del modello relativo a quell'elemento non verrà convalidato. Verranno invece convalidati gli elementi figli di quel determinato elemento o attributo. Dopo che XmlValidatingReader identifica un errore per un determinato elemento, ne interrompe la convalida.

Controllo del risultato della convalida

L'evento ValidationEventHandler e l'enumerazione XmlSeverityType possono essere utilizzati per verificare lo stato della convalida di un documento di istanza XML. Per errori di convalida irreversibili, la proprietà Severity ha il valore XmlSeverityType.Error, che indica che si è verificato un errore irreversibile. Per tutti gli errori di convalida non irreversibili, ad esempio quelli che si sono verificati perché non erano disponibili informazioni sullo schema o su DTD per convalidare gli elementi e gli attributi, la proprietà Severity ha il valore XmlSeverityType.Warning. Gli avvisi possono essere restituiti per tutti i valori di ValidationType tranne che per ValidationType.None.

Nel codice di esempio che segue viene illustrato l'uso dell'evento ValidationEventHandler per la convalida di un documento di istanza XML rispetto a uno schema XML in uno 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);

        }
    }
}

Di seguito viene indicato il contenuto del file di input, BooksSchema.xml, da convalidare.

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

Di seguito viene indicato il contenuto del file di input, Books.xsd, rispetto al quale eseguire la convalida.

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

Nell'esempio di codice che segue viene mostrato l'uso dell'evento ValidationEventHandler. Gli eventuali errori verranno scritti nella 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);
}

Vedere anche

Convalida del linguaggio XML con XmlValidatingReader | Convalida del linguaggio XML con schemi