La validación y el Modelo de objetos de esquemas
Durante la validación de esquemas, se pueden producir dos eventos de excepción: advertencias y errores. Las advertencias se producen cuando el analizador encuentra un elemento que no entiende y, por lo tanto, no puede validarlo. El analizador puede continuar procesando el documento de instancia después de que se produzca una advertencia. Por otra parte, los errores ocurren cuando el analizador no puede finalizar la tarea debido a una situación no válida.
Advertencias
En general, una advertencia suele producirse cuando el analizador encuentra elementos para los que no aparece información de esquema con la que validar.
En el ejemplo siguiente, XmlValidatingReader emite advertencias acerca de elementos que no comprende, como html
, p
, br
, b
e i
. La clase XmlValidatingReader no genera errores cuando encuentra estos elementos, porque el elemento any indica que el elemento subject
puede tener una cantidad ilimitada de marcado de cualquier espacio de nombres en el documento XML.
En el siguiente esquema XML se describe el contenido de Warning.xsd.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xs:element name="content" type="contentType" />
<xs:complexType name="contentType">
<xs:sequence>
<xs:element name="subject" type="subjectType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="subjectType" >
<xs:sequence>
<xs:any namespace="##any" processContents="skip" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="skip" />
</xs:complexType>
</xs:schema>
A continuación, se describe el contenido de Warning.xml, que se compila en Warning.xsd.
<?xml version="1.0" ?>
<content xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation="Warning.xsd">
<subject>
<html>
<p>sdfsdf</p>
<br/>
<b> bold or <i> italic </i> or strong </b>
</html>
</subject>
</content>
Errores
Un error es un evento que impide que el analizador continúe procesando el documento XML que se está validando. Un error se puede producir si un elemento se coloca incorrectamente en el modelo de contenido de su elemento primario.
En el ejemplo siguiente se genera un error porque el elemento extension no es un elemento secundario válido para el elemento complexType.
<xs:complexType>
<xs:extension base='xs:decimal'>
<xs:attribute name='sizing' type='xs:string' />
</xs:extension>
</xs:complexType" />
Controlar eventos de validación
Para controlar errores y advertencias, SOM (Schema Object Model, Modelo de objetos de esquemas) admite el uso de un delegado ValidationEventHandler, que es una devolución de llamada diseñada expresamente. Esta devolución de llamada se llama cuando se produce un error o una advertencia durante la validación.
Si se registra ValidationEventHandler, el analizador puede recuperarse de los errores si descarta la información no válida y pasa la información acerca del error a ValidationEventHandler. Si no se especifica ValidationEventHandler, el procesamiento se detiene en lugar de recuperarse de los errores.
Cuando se produce un evento de validación, ValidationEventHandler pasa un objeto ValidationEventArgs con una propiedad Severity que se puede utilizar para determinar la gravedad de un evento de validación. Además, ValidationEventArgs tiene una propiedad Message que contiene el mensaje de error, así como una propiedad Exception que contiene la excepción que se habría iniciado si no se hubiera especificado ValidationEventHandler.
En la tabla siguiente se muestra la relación existente entre los errores, las advertencias y ValidationEventHandler.
ValidationEventHandler | Sin ValidationEventHandler | |
---|---|---|
Advertencia | Si se llama a ValidationEventHandler y se pasa ValidationEventArgs.Severity equivalente a XmlSeverityType.Warning, el procesamiento de los documentos continúa. | No se inicia ninguna excepción y el procesamiento del documento de esquema continúa. |
Error | Si se llama a ValidationEventHandler y se pasa un ValidationEventArgs.Severity equivalente a XmlSeverityType.Error, el procesamiento del documento continúa y los datos no válidos se descartan. | Se inicia una excepción y el procesamiento del documento de esquema se detiene. |
En el ejemplo siguiente se utiliza ValidationEventHandler para controlar los errores de validación en el archivo de esquema XML. Observe que aunque haya errores de validación en el archivo, se valida todo el archivo en lugar de iniciarse una excepción al encontrar un error por primera vez.
Imports System.IO
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Text
Class ReadWriteSample
Public Shared Sub ValidationCallbackOne(sender As Object, args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write("WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write("ERROR: ")
End If
End If
Console.WriteLine(args.Message) ' Prints the error to the screen.
End Sub 'ValidationCallbackOne
Public Shared Sub Main()
Try
Dim reader As New XmlTextReader("Bad_example.xsd")
Dim myschema As XmlSchema = XmlSchema.Read(reader, New ValidationEventHandler(AddressOf ValidationCallbackOne))
myschema.Write(Console.Out)
Dim file As New FileStream("New.xsd", FileMode.Create, FileAccess.ReadWrite)
Dim xwriter As New XmlTextWriter(file, New UTF8Encoding())
xwriter.Formatting = Formatting.Indented
myschema.Write(xwriter)
Catch e As Exception
Console.WriteLine(e)
End Try
End Sub 'Main
End Class 'ReadWriteSample
[C#]
using System.IO;
using System;
using System.Xml;
using System.Xml.Schema;
using System.Text;
class ReadWriteSample {
public static void ValidationCallbackOne(object sender, ValidationEventArgs args) {
if(args.Severity == XmlSeverityType.Warning)
Console.Write("WARNING: ");
else if(args.Severity == XmlSeverityType.Error)
Console.Write("ERROR: ");
Console.WriteLine(args.Message); // Print the error to the screen.
}
public static void Main() {
try{
XmlTextReader reader = new XmlTextReader ("Bad_example.xsd");
XmlSchema myschema = XmlSchema.Read(reader, new ValidationEventHandler(ValidationCallbackOne));
myschema.Write(Console.Out);
FileStream file = new FileStream ("New.xsd", FileMode.Create, FileAccess.ReadWrite);
XmlTextWriter xwriter = new XmlTextWriter (file, new UTF8Encoding());
xwriter.Formatting = Formatting.Indented;
myschema.Write (xwriter);
}catch(Exception e){
Console.WriteLine(e);
}
}/* Main() */
}//ReadWriteSample
En el esquema XML siguiente se describe el contenido del archivo de entrada, Bad_example.xsd.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Play"
targetNamespace="http://tempuri.org/Play.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/Play.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='myShoeSize'>
<xs:complexType>
<xs:extension base='xs:decimal'>
<xs:attribute name='sizing' type='xs:string' />
<xs:extension />
</xs:extension>
</xs:complexType>
</xs:element>
<player></player>
</xs:schema>
Vea también
Modelo de objetos de esquemas XML (SOM) | Validación de XML con esquemas