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.
Actualización: November 2007
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 de definición de esquema (XSD), de esquema reducido de datos (XDR) y de definición de tipo de documento (DTD)
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.
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. |
Utilizar ValidationEventHandler
Los eventos de validación con ValidationEventHandler ocurren sólo si la propiedad ValidationType se establece en ValidationType.DTD, ValidationType.Schema, ValidationType.XDR, o ValidationType.Auto. De manera predeterminada la propiedad ValidationType se establece en ValidationType.Auto.
La clase XmlSchemaCollection utiliza el evento ValidationEventHandler para controlar los errores de validación en esquemas XML y esquemas XDR cuando estos esquemas se añaden a 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
void ValidationCallback(object sender, ValidationEventArgs e)
{
}
La clase ValidationEventArgs tiene propiedades para un mensaje de texto, una enumeración XmlSeverityType que indica un error de validación o advertencia, y una excepción que contiene información XmlSchemaException relacionada con el error de validación particular.
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 ValidationEventArgs.Severity tiene el valor XmlSeverityType.Error que indica que se ha producido un error irrecuperable. Para todos los errores de validación no fatales (por ejemplo, aquellos devueltos porque no hay esquema o información DTD disponible para validar los elementos y atributos), la propiedad Severity tiene el valor XmlSeverityType.Warning. Las advertencias pueden tener lugar para todos los valores ValidationType excepto ValidationType.None.
Nota: |
|---|
La llamada a cualquier método que cambie el estado del lector dentro de ValidationEventHandler no es compatible. Por ejemplo, no se puede garantizar el estado del lector cuando se llama a Read(), implícita o explícitamente, en el lector en un controlador de eventos. |
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
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, .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 código de ejemplo 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
// 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
Conceptos
Leer fragmentos de XML con XmlReader
Nota: