Compartir a través de


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