Freigeben über


Ereignishandlerrückruf bei der XmlValidatingReader-Gültigkeitsprüfung

Durch das ValidationEventHandler-Ereignis wird ein Ereignishandler gesetzt, um Informationen über Fehler bei der DTD (Dokumenttypdefinition)-Überprüfung sowie der XDR (XML-Data Reduced)- und XSD (XML Schema definition language)-Schemaüberprüfung zu erhalten.

Überprüfungsfehler und Warnungen werden über den ValidationEventHandler-Rückruf gemeldet. Wird kein ValidationEventHandler bereitgestellt und tritt ein Parserfehler auf, wird der Fehler durch Auslösen von XmlException gemeldet. Bei Auftreten eines Überprüfungsfehlers wird XmlSchemaException ausgelöst. Nachdem die Ausnahme ausgelöst wurde, kann XmlValidatingReader nicht mehr gestartet werden.

Verwenden von "ValidationEventHandler"

Überprüfungsereignisse mit ValidationEventHandler treten nur auf, wenn die ValidationType-Eigenschaft von XmlValidatingReader während eines Aufrufs von Read, ReadInnerXml, ReadOuterXml oder Skip auf ValidationType.DTD, ValidationType.Schema, ValidationType.XDR oder ValidationType.Auto gesetzt wird. Standardmäßig ist die ValidationType-Eigenschaft auf ValidationType.Auto gesetzt.

Die XmlSchemaCollection-Klasse verwendet das ValidationEventHandler-Ereignis zur Behandlung von Überprüfungsfehlern in XML- und XDR-Schemas, wenn diese zu XmlSchemaCollection hinzugefügt wurden.

Im folgenden Codebeispiel wird die ValidationCallback-Methode bei der Bereitstellung eines Überprüfungsereignishandlers gezeigt.

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

Die ValidationEventArgs-Klasse verfügt über Eigenschaften für eine Textnachricht, eine XmlSeverityType-Enumeration für die Anzeige von Error oder Warning sowie eine Ausnahme, die dem jeweiligen Überprüfungsfehler zugeordnete XmlSchemaException-Informationen enthält.

Falls kein Ereignishandler bereitgestellt ist, wird durch den ersten Überprüfungsfehler der Art XmlSeverityType = Error eine Ausnahme ausgelöst. XmlValidatingReader kann nach diesem Fehler nicht erneut gestartet werden. Bei Überprüfungsfehlern der Art XmlSeverityType = Warning werden keine Ausnahmen ausgelöst. XmlSchemaException wird ausgelöst, wenn der Überprüfungsfehler bei der Überprüfung mit einem Schema oder einer DTD auftritt.

Wird durch ein Element oder Attribut über die ValidationCallback-Methode ein Überprüfungsfehler aufgrund eines nicht übereinstimmenden Inhaltsmodells gemeldet, wird der Rest des Inhaltsmodells für dieses Element nicht überprüft. (Die untergeordneten Elemente des jeweiligen Elements oder Attributs werden jedoch überprüft.) Nach Auffinden eines Fehlers durch XmlValidatingReader wird die Überprüfung des jeweiligen Elements gestoppt.

Kontrolle des Überprüfungsergebnisses

Das ValidationEventHandler-Ereignis und die XmlSeverityType-Enumeration können zur Feststellung des Überprüfungsstatus eines XML-Instanzendokuments verwendet werden. Bei schwerwiegenden Überprüfungsfehlern hat die Severity-Eigenschaft den Wert von XmlSeverityType.Error. Dadurch wird angezeigt, dass ein solcher Fehler aufgetreten ist. Bei allen nicht schwerwiegenden Überprüfungsfehlern (z. B. solchen, die aufgrund fehlender Schema- oder DTD-Informationen zur Überprüfung von Elementen und Attributen zurückgegeben wurden) hat die Severity-Eigenschaft den Wert XmlSeverityType.Warning. Warnungen können bei allen ValidationType-Werten auftreten, außer bei ValidationType.None.

Im folgenden Codebeispiel wird veranschaulicht, wie das ValidationEventHandler-Ereignis ein XML-Instanzendokument anhand eines XML-Schemas in einer XmlSchemaCollection überprüft.

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

        }
    }
}

Im folgenden Beispiel wird der Inhalt der zu überprüfenden 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 überprüfenden 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 dargestellt. Auftretende Fehler werden auf der Konsole ausgegeben.

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

Siehe auch

XML-Gültigkeitsprüfung mit XmlValidatingReader | Gültigkeitsprüfung von XML mit Schemas