Validation par rapport à un schéma XDR à l'aide de XmlSchemaCollection
Si le schéma XDR (XML-Data Reduced), par rapport auquel doit s'effectuer la validation, est stocké dans XmlSchemaCollection, il est associé à l'URI d'espace de noms qui a été spécifié lors de l'ajout du schéma à la collection. XmlValidatingReader fait correspondre l'URI d'espace de noms du document XML au schéma correspondant à cet URI dans la collection.
Par exemple, si l'élément racine du document XML est <bookstore xmlns="urn:newbooks-schema">
, lorsque le schéma est ajouté à XmlSchemaCollection il référence le même espace de noms comme suit :
xsc.Add("urn:newbooks-schema", "newbooks.xdr")
L'exemple de code ci-dessous crée une classe XmlValidatingReader qui prend XmlTextReader et ajoute un schéma XDR, HeadCount.xdr, à XmlSchemaCollection.
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.Schemas.Add("xdrHeadCount", "HeadCount.xdr")
vr.ValidationType = ValidationType.XDR
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)
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
[C#]
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.Schemas.Add("xdrHeadCount", "HeadCount.xdr");
vr.ValidationType = ValidationType.XDR;
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);
}
}
}
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 ci-dessous présente le contenu du fichier d'entrée, HeadCount.xml, à valider.
<!--Load HeadCount.xdr in SchemaCollection for Validation-->
<HeadCount xmlns='xdrHeadCount'>
<Name>Waldo Pepper</Name>
<Name>Red Pepper</Name>
</HeadCount>
Le code ci-dessous présente le contenu du fichier de schéma XDR, HeadCount.xdr, par rapport auquel la validation doit s'effectuer.
<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="Name" content="textOnly"/>
<AttributeType name="Bldg" default="2"/>
<ElementType name="HeadCount" content="eltOnly">
<element type="Name"/>
<attribute type="Bldg"/>
</ElementType>
</Schema>
Voir aussi
XmlSchemaCollection comme cache de schéma | Validation XML à l'aide de schémas | XmlValidatingReader.ValidationType, propriété | XmlValidatingReader.Schemas, propriété