Validación frente a esquema XML (XSD) con XmlValidatingReader
La validación con un esquema de lenguaje de definición (XSD) de esquemas XML se implementa mediante las restricciones de validez definidas en la recomendación de XML Schema del W3C (World Wide Web Consortium). .NET Framework de Microsoft es compatible con la recomendación de XML Schema 2001 del W3C. Todos los esquemas XML deben incluir el espacio de nombres http://www.w3c.org/2001/XMLSchema.
Cada esquema XML está relacionado con un identificador de recursos uniforme (URI) de espacio de nombres. XmlValidatingReader puede utilizar el atributo del esquema XML (XSD) schemaLocation en el archivo de datos que está enlazado al espacio de nombres de la instancia del esquema XML http://www.w3.org/2001/XMLSchema-instance. Si el esquema está almacenado en XmlSchemaCollection, el XmlValidatingReader utiliza el identificador URI de espacio de nombres especificado cuando el esquema se agregó a la colección. Éste suele ser el espacio de nombres de destino del esquema.
XmlValidatingReader utiliza el atributo schemaLocation para identificar el esquema XML. En el ejemplo siguiente se muestra el elemento raíz del archivo de datos.
<bookstore xmlns="urn:bookstore-schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:bookstore-schema books.xsd">
Nota |
---|
La clase XmlValidatingReader es obsoleta en .NET Framework versión 2.0.Se puede crear una instancia de validación XmlReader mediante la clase XmlReaderSettings y el método Create.Para obtener más información, vea Validación de datos XML con XmlReader. |
Ejemplo
El siguiente ejemplo de código crea XmlValidatingReader que toma XmlTextReader. El archivo de entrada, HeadCount.xml, se valida con respecto a un archivo HeadCount.xsd del esquema 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);
}
}
}
A continuación se describe el contenido del archivo de entrada, HeadCount.xml, que se va a validar.
<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>
A continuación se describe el contenido del archivo de esquema XML, HeadCount.xsd, que se usará como referencia para la validación.
<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>
Vea también
Conceptos
Leer fragmentos de XML con XmlReader