Partager via


Validation par rapport à un schéma XML (XSD) à l'aide de XmlValidatingReader

La validation de schéma de langage XSD (XML Schema Definition) est implémentée à l'aide de contraintes de validité définies dans la recommandation du World Wide Web Consortium (W3C) sur les schémas XML. Le .NET Framework Microsoft prend en charge la recommandation du W3C sur les schémas XML 2001. Tous les schémas XML doivent inclure la déclaration d'espaces de noms http://www.w3c.org/2001/XMLSchema.

Chaque schéma XML est associé à un espace de noms URI (Uniform Resource Identifier). L'objet XmlValidatingReader peut utiliser l'attribut schemaLocation du schéma XML (XSD) dans le fichier de données lié à l'espace de noms de l'instance du schéma XML http://www.w3.org/2001/XMLSchema-instance. Si le schéma est stocké dans un objet XmlSchemaCollection, l'objet XmlValidatingReader utilise l'URI d'espace de noms spécifié lors de l'ajout du schéma à la collection. Il s'agit généralement de l'espace de noms cible du schéma.

L'objet XmlValidatingReader utilise l'attribut schemaLocation pour identifier le schéma XML. L'exemple suivant montre l'élément racine du fichier de données.

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

La classe XmlValidatingReader est obsolète dans le .NET Framework version 2.0.Vous pouvez créer une instance de l'objet XmlReader de validation à l'aide de la classe XmlReaderSettings et de la méthode Create.Pour plus d'informations, voir Validation de données XML avec XmlReader.

Exemple

L'exemple de code suivant crée un objet XmlValidatingReader qui prend un objet XmlTextReader. Le fichier d'entrée, HeadCount.xml, est validé par rapport au fichier HeadCount.xsd de schéma XML.

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

Le code suivant présente le contenu du fichier d'entrée, HeadCount.xml, à valider.

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

Le code suivant présente le contenu du fichier de schéma XML, HeadCount.xsd, par rapport auquel la validation doit s'effectuer.

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

Voir aussi

Concepts

Lecture de XML avec XmlReader

Autres ressources

Utilisation de la classe XmlReader