Поделиться через


Обратный вызов обработчика событий проверки XmlValidatingReader

Событие ValidationEventHandler используется для настройки обработчика события на получение сведений об ошибках проверки определения DTD, схем XDR и XSD.

Ошибки и предупреждения проверки можно получить через ответный вызов ValidationEventHandler.Если объект ValidationEventHandler не предоставлен, и произошла ошибка синтаксического анализа, о ней сообщает возникшее исключение XmlException.При ошибке проверки вызывается исключение XmlSchemaException.При возникновении исключения нельзя перезапустить XmlValidatingReader.

Примечание

Класс XmlValidatingReader в версии .NET Framework 2.0 устарел.Экземпляр XmlReader для проверки можно создать с помощью класса XmlReaderSettings и метода Create.Дополнительные сведения см. в разделе Проверка XML-данных с помощью XmlReader.

Использование ValidationEventHandler

События проверки с ValidationEventHandler происходят, только если свойство ValidationType имеет значение ValidationType.DTD, ValidationType.Schema, ValidationType.XDR или ValidationType.Auto.По умолчанию свойство ValidationType имеет значение ValidationType.Auto.

Класс XmlSchemaCollection использует событие ValidationEventHandler для обработки ошибок проверки в схемах XML и XDR, когда они добавляются в объект XmlSchemaCollection.

В следующем примере кода показан метод ValidationCallback при наличии обработчика события проверки.

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

Класс ValidationEventArgs имеет свойства для текстового сообщения, перечисление XmlSeverityType, указывающее на ошибку или предупреждение проверки, и исключение, содержащее данные XmlSchemaException, связанные с конкретной ошибкой проверки.

Если обработчик события отсутствует, возникает исключение для первой ошибки проверки с XmlSeverityType = Error.После этой ошибки модуль чтения XmlValidatingReader может быть повторно запущен.Исключения не вызываются для ошибок проверки с XmlSeverityType = Warning.Исключение XmlSchemaException возникает, если ошибка проверки произошла при проверке по схеме или определению DTD.

Если определенный элемент или атрибут сообщает об ошибке проверки через метод ValidationCallback из-за несоответствия модели содержимого, оставшаяся часть модели содержимого этого элемента не проверяется.Однако дочерние элементы определенного элемента или атрибута проверяются. После того, как объект XmlValidatingReader обнаружил ошибку для определенного элемента, он прекращает проверять этот элемент.

Оценка результата проверки

Событие ValidationEventHandler и перечисление XmlSeverityType могут использоваться для оценки состояния проверки экземпляра XML-документа.При неустранимых ошибках проверки свойство ValidationEventArgs.Severity имеет значение XmlSeverityType.Error, указывая, что произошла неустранимая ошибка.При некритичных ошибках проверки (например, при отсутствии сведений о схеме или определении DTD, по которым проверяются элементы и атрибуты), свойство Severity имеет значение XmlSeverityType.Warning.Предупреждения могут возникнуть для всех значений ValidationType, за исключением ValidationType.None.

Примечание

Вызов любого метода, изменяющего состояние модуля чтения в объекте ValidationEventHandler, не поддерживается.Например, нельзя гарантировать состояние модуля чтения при явном или неявном вызове метода Read() для модуля чтения в обработчике события.

В следующем примере кода показано использование события ValidationEventHandler для проверки экземпляра XML-документа по схеме XML в коллекции 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);

        }
    }
}

Ниже показано содержимое проверяемого входного файла BooksSchema.xml.

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

Ниже показано содержимое проверяемого входного файла Books.xsd.

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

В следующем примере кода показано использование события ValidationEventHandler.Все ошибки выводятся на консоль.

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

См. также

Основные понятия

Чтение XML с помощью XmlReader

Другие ресурсы

Использование класса XmlReader