Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El evento ValidationEventHandler se utiliza para establecer un controlador de eventos que reciba información acerca de errores de validación de esquemas de lenguaje XSD (Schema Definition, definición de esquemas), XDR (XML-Data Reduced, reducido de datos XML) y DTD (Document Type Definition, definición de tipo de documento).
Se informa de las advertencias y los errores de validación mediante la devolución de llamada de ValidationEventHandler. Si no se suministra ValidationEventHandler y se produce un error de análisis, se informa del error mediante XmlException. Si se produce un error de validación, se inicia una excepción XmlSchemaException. Si se inicia una excepción, no se puede reiniciar XmlValidatingReader.
Usar ValidationEventHandler
Los eventos de validación con ValidationEventHandler sólo ocurren si el valor de la propiedad ValidationType de XmlValidatingReader se establece como ValidationType.DTD, ValidationType.Schema, ValidationType.XDR o ValidationType.Auto durante una llamada a Read, ReadInnerXml, ReadOuterXml o Skip. De forma predeterminada, el valor de la propiedad ValidationType se establece como ValidationType.Auto.
La clase XmlSchemaCollection utiliza el evento ValidationEventHandler para controlar los errores de validación en esquemas XML y esquemas XDR cuando se agregan estos esquemas en XmlSchemaCollection.
En el ejemplo de código siguiente se demuestra el método ValidationCallback cuando se suministra un controlador de eventos de validación.
Sub ValidationCallback(sender As Object, args As ValidationEventArgs)
End Sub
[C#]
void ValidationCallback(object sender, ValidationEventArgs e)
{
}
La clase ValidationEventArgs tiene propiedades para un mensaje de texto, una enumeración XmlSeverityType que indica Error o Warning, y una excepción que contiene información de XmlSchemaException asociada a ese error de validación.
Si no se proporciona ningún controlador de eventos, se inicia una excepción para el primer error de validación con XmlSeverityType = Error. No se puede reiniciar XmlValidatingReader después de este error. Las excepciones no se inician para los errores de validación con XmlSeverityType = Warning. Se inicia una excepción XmlSchemaException si el error de validación se produjo durante la validación con un esquema o DTD.
Si un elemento o un atributo informa de un error de validez a través del método ValidationCallback porque el modelo de contenido no coincide, no se validará el resto del modelo para ese elemento. No obstante, se validarán los elementos secundarios del elemento o del atributo. Después de que XmlValidatingReader identifique un error de un elemento dado, dejará de validar ese elemento.
Comprobar el resultado de la validación
El evento ValidationEventHandler y la enumeración XmlSeverityType se pueden utilizar para comprobar el estado de validación de un documento XML de instancia. En los errores de validación graves, la propiedad Severity tiene el valor XmlSeverityType.Error, que indica que se ha producido un error grave. Para los errores de validación que no son graves (por ejemplo, los que se devuelven debido a la ausencia de información de esquema o DTD para validar los elementos y atributos), la propiedad Severity tiene el valor XmlSeverityType.Warning. Se pueden producir advertencias para todos los valores de ValidationType excepto ValidationType.None.
En el ejemplo de código siguiente se muestra el uso del evento ValidationEventHandler para validar un documento XML de instancia con un esquema XML en 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
[C#]
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);
}
}
}
A continuación se describe el contenido del archivo de entrada, BooksSchema.xml, que se va a validar.
<?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>
A continuación se describe el contenido del archivo de entrada, Books.xsd, que se va a usar para la validación.
<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>
En el ejemplo de código siguiente se muestra el uso del evento ValidationEventHandler. Los errores se escriben en la consola.
' 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
[C#]
// 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);
}
Vea también
Validación de XML con XmlValidatingReader | Validación de XML con esquemas