Freigeben über


Rückruf des Ereignishandlers für die XmlValidatingReader-Validierung

Das ValidationEventHandler-Ereignis wird für das Festlegen eines Ereignishandlers zum Empfangen von Informationen über DTDs (Document Type Definitions), XDR (XML-Data Reduced) und XSD-Schemavalidierungsfehler (XML Schema Definition Language) verwendet.

Validierungsfehler und Warnungen werden durch den ValidationEventHandler-Rückruf ausgegeben. Wenn kein ValidationEventHandler angegeben wird und ein Analysefehler auftritt, wir der Fehler durch Auslösen einer XmlException ausgegeben. Wenn ein Validierungsfehler auftritt, wird eine XmlSchemaException ausgelöst. Wenn eine Ausnahme ausgelöst wird, kann XmlValidatingReader nicht neu gestartet werden.

HinweisHinweis

Die XmlValidatingReader-Klasse ist in .NET Framework, Version 2.0 veraltet.Mit der XmlReaderSettings-Klasse und der Create-Methode können Sie eine XmlReader-Instanz zur Validierung erstellen.Weitere Informationen finden Sie unter Validieren von XML-Daten mit "XmlReader".

Verwenden des "ValidationEventHandler"

Validierungsereignisse mit ValidationEventHandler treten nur auf, wenn die ValidationType-Eigenschaft auf ValidationType.DTD, ValidationType.Schema, ValidationType.XDR oder ValidationType.Auto festgelegt ist. In der Standardeinstellung ist die ValidationType-Eigenschaft auf ValidationType.Auto festgelegt.

Die XmlSchemaCollection-Klasse verwendet das ValidationEventHandler-Ereignis, um Validierungsfehler in XML-Schemata und in XDR-Schemata zu behandeln, wenn diese der XmlSchemaCollection hinzugefügt werden.

Im folgenden Codebeispiel wird die ValidationCallback-Methode bei Angabe eines Ereignishandlers für die Validierung veranschaulicht.

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

Die ValidationEventArgs-Klasse verfügt über Eigenschaften für eine Textnachricht, eine XmlSeverityType-Enumeration, die einen Validierungsfehler oder eine Warnung angibt, sowie eine Ausnahme, die dem bestimmten Validierungsfehler zugeordnete XmlSchemaException-Informationen enthält.

Wenn kein Ereignishandler angegeben wird, wird für den ersten Validierungsfehler mit XmlSeverityType = Error eine Ausnahme ausgelöst. Nach Auftreten dieses Fehlers kann der XmlValidatingReader nicht neu gestartet werden. Für Validierungsfehler mit XmlSeverityType = Warning werden keine Ausnahmen ausgelöst. Wenn der Validierungsfehler während der Validierung mit einem Schema oder einer DTD aufgetreten ist, wird eine XmlSchemaException ausgelöst.

Wenn ein angegebenes Element oder ein angegebenes Attribut mit der ValidationCallback-Methode einen Validierungsfehler meldet, da das Inhaltsmodell nicht übereinstimmt, wird der verbleibende Teil des Inhaltsmodells für dieses Element nicht validiert. (Die untergeordneten Elemente des angegebenen Elements oder des angegebenen Attributs werden jedoch validiert.) Nach dem Bestimmen eines Fehlers für ein angegebenes Element durch den XmlValidatingReader wird die Validierung dieses Elements beendet.

Überprüfen des Validierungsergebnisses

Das ValidationEventHandler-Ereignis und die XmlSeverityType-Enumeration können zur Überprüfung des Validierungsstatus eines XML-Instanzdokuments verwendet werden. Bei schwerwiegenden Validierungsfehlern weist die ValidationEventArgs.Severity-Eigenschaft den Wert XmlSeverityType.Error auf; dadurch wird ein schwerwiegender Validierungsfehler angegeben. Bei allen nicht schwerwiegenden Validierungsfehlern (z. B. bei Fehlern, die zurückgegeben werden, weil keine Schema- oder DTD-Informationen zur Validierung von Elementen und Attributen vorhanden sind), weist die Severity-Eigenschaft den Wert XmlSeverityType.Warning auf. Warnungen können für alle ValidationType-Werte mit Ausnahme von ValidationType.None auftreten.

HinweisHinweis

Das Aufrufen einer beliebigen Methode, die den Zustand des Readers im ValidationEventHandler ändert, wird nicht unterstützt.So kann z. B. der Zustand des Readers beim impliziten oder expliziten Aufruf von Read() für den Reader in einem Ereignishandler nicht garantiert werden.

Im folgenden Codebeispiel wird die Verwendung des ValidationEventHandler-Ereignisses zur Validierung eines XML-Instanzdokuments mit einem XML-Schema in einer XmlSchemaCollection veranschaulicht.

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

        }
    }
}

Im folgenden Beispiel wird der Inhalt der zu validierenden Eingabedatei BooksSchema.xml dargestellt.

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

Im folgenden Beispiel wird der Inhalt der zu validierenden Eingabedatei Books.xsd dargestellt.

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

Im folgenden Codebeispiel wird die Verwendung des ValidationEventHandler-Ereignisses veranschaulicht. Wenn Fehler auftreten, werden diese in die Konsole geschrieben.

' 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);
}

Siehe auch

Konzepte

Lesen von XML mit dem "XmlReader"

Weitere Ressourcen

Verwenden der "XmlReader"-Klasse