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


Проверка по XML-схеме (XSD) с помощью XmlValidatingReader

Проверка схем на языке XSD реализуется с помощью ограничений допустимости, определенных в рекомендации консорциума W3C по схемам XML.Платформа Microsoft .NET Framework поддерживает рекомендацию консорциума W3C по схемам XML 2001.Все схемы XML должны включать пространство имен http://www.w3c.org/2001/XMLSchema.

Каждая схема XML связана с URI-кодом пространства имен.Объект XmlValidatingReader может использовать атрибут schemaLocation схемы XML (XSD) в файле данных, который привязан к пространству имен http://www.w3.org/2001/XMLSchema-instance экземпляра схемы XML.Если схема помещена в коллекцию XmlSchemaCollection, объект XmlValidatingReader использует URI-код пространства имен, определенный при добавлении схемы в коллекцию.Обычно это целевое пространство имен схемы.

Объект XmlValidatingReader использует атрибут schemaLocation, чтобы определить схему XML.Например, следующий код показывает корневой элемент файла данных.

<bookstore xmlns="urn:bookstore-schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:bookstore-schema books.xsd">

Примечание

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

Пример

Следующий пример кода создает XmlValidatingReader, принимающий XmlTextReader.Входной файл HeadCount.xml проверен с помощью файла схемы XML HeadCount.xsd.

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema


Namespace ValidationSample
    
   Class Sample
      
      Public Shared Sub Main()
         Dim tr As New XmlTextReader("HeadCount.xml")
         Dim vr As New XmlValidatingReader(tr)
         
         vr.ValidationType = ValidationType.Schema
         AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
         
         While vr.Read()
            PrintTypeInfo(vr)
            If vr.NodeType = XmlNodeType.Element Then
               While vr.MoveToNextAttribute()
                  PrintTypeInfo(vr)
               End While
            End If
         End While
         Console.WriteLine("Validation finished")
      End Sub
      ' Main
      
      
      Public Shared Sub PrintTypeInfo(vr As XmlValidatingReader)
         If Not (vr.SchemaType Is Nothing) Then
            If TypeOf vr.SchemaType Is XmlSchemaDatatype Or TypeOf vr.SchemaType Is XmlSchemaSimpleType Then
               Dim value As Object = vr.ReadTypedValue()
               Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value)
            Else
               If TypeOf vr.SchemaType Is XmlSchemaComplexType Then
                  Dim sct As XmlSchemaComplexType = CType(vr.SchemaType, XmlSchemaComplexType)
                  Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name)
               End If
            End If
         End If
      End Sub
      ' PrintTypeInfo
       
      Public Shared Sub ValidationHandler(sender As Object, args As ValidationEventArgs)
         Console.WriteLine("***Validation error")
         Console.WriteLine("Severity:{0}", args.Severity)
         Console.WriteLine("Message:{0}", args.Message)
      End Sub
      ' ValidationHandler
   End Class
   ' Sample
End Namespace 
' ValidationSample
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

namespace ValidationSample
{
  class Sample
  {
    public static void Main()
    {
      XmlTextReader tr = new XmlTextReader("HeadCount.xml");
      XmlValidatingReader vr = new XmlValidatingReader(tr);

      vr.ValidationType = ValidationType.Schema;
      vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);

      while(vr.Read())
      {
        PrintTypeInfo(vr);
        if(vr.NodeType == XmlNodeType.Element)
        {
          while(vr.MoveToNextAttribute())
            PrintTypeInfo(vr);
        }
      }
      Console.WriteLine("Validation finished");
    }

    public static void PrintTypeInfo(XmlValidatingReader vr)
    {
      if(vr.SchemaType != null)
      {
        if(vr.SchemaType is XmlSchemaDatatype || vr.SchemaType is XmlSchemaSimpleType)
        {
          object value = vr.ReadTypedValue();
          Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value);
      }
        else if(vr.SchemaType is XmlSchemaComplexType)
            {
               XmlSchemaComplexType sct = (XmlSchemaComplexType)vr.SchemaType;
               Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name);
            }
         }
      }

      public static void ValidationHandler(object sender, ValidationEventArgs args)
      {
         Console.WriteLine("***Validation error");
         Console.WriteLine("\tSeverity:{0}", args.Severity);
         Console.WriteLine("\tMessage:{0}", args.Message);
      }
   }
}

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

<hc:HeadCount xmlns:hc='xsdHeadCount' xsi:schemaLocation='xsdHeadCount HeadCount.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
  <Name>Waldo Pepper</Name>
  <Name>Red Pepper</Name>
</hc:HeadCount>

Ниже описано содержимое проверяемого файла XML-схемы HeadCount.xsd.

<xs:schema xmlns="xsdHeadCount" targetNamespace="xsdHeadCount" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='HeadCount' type="HEADCOUNT"/>
  <xs:complexType name="HEADCOUNT">
    <xs:sequence>
      <xs:element name='Name' type='xs:string' maxOccurs='unbounded'/>
    </xs:sequence>
    <xs:attribute name='division' type='xs:int' use='optional' default='8'/>
  </xs:complexType>
</xs:schema>

См. также

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

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

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

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