Compartir a través de


Validación de XSD con XmlSchemaCollection

Puede utilizar XmlSchemaCollection para validar un documento XML con respecto a esquemas de lenguaje XSD (XML Schema Definition, definición de esquemas XML). XmlSchemaCollection mejora el rendimiento al almacenar los esquemas en la colección de manera que no se carguen en la memoria cada vez que se produce una validación. Si el esquema se encuentra en la colección de esquemas, se utiliza el atributo schemaLocation para buscarlo.

En el ejemplo siguiente se muestra el elemento raíz de un archivo de datos.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

Para este ejemplo, el valor del atributo targetNamespace es urn:bookstore-schema, que es el mismo espacio de nombres utilizado al agregar el esquema a XmlSchemaCollection.

En el ejemplo de código siguiente se agrega un esquema XML a XmlSchemaCollection.

Dim xsc As New XmlSchemaCollection()
' XML Schema.
xsc.Add("urn:bookstore-schema", schema) 
reader = New XmlTextReader(filename)
vreader = New XmlValidatingReader(reader)
vreader.Schemas.Add(xsc)
[C#]
XmlSchemaCollection xsc = new XmlSchemaCollection();
// XML Schema.
xsc.Add("urn:bookstore-schema", schema);
reader = new XmlTextReader (filename);
vreader = new XmlValidatingReader (reader);
vreader.Schemas.Add(xsc);

El atributo targetNamespace se suele utilizar cuando se agrega la propiedad namespaceURI en el método Add para la colección XmlSchemaCollection. Puede especificar una referencia nula antes de agregar el esquema a XmlSchemaCollection. Se debe utilizar una cadena vacía ("") para los esquemas sin espacio de nombres. XmlSchemaCollection sólo puede tener un esquema sin espacio de nombres.

En el ejemplo de código siguiente se agrega un esquema XML, HeadCount.xsd, a la colección XmlSchemaCollection y se valida HeadCount.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.Schemas.Add("xsdHeadCount", "HeadCount.xsd")
         vr.ValidationType = ValidationType.Schema
         AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
         
         While vr.Read()
         End While
         Console.WriteLine("Validation finished")
      End Sub
      ' Main
      
      
      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
[C#]
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.Schemas.Add("xsdHeadCount", "HeadCount.xsd");
         vr.ValidationType = ValidationType.Schema;
         vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);

         while(vr.Read());
         Console.WriteLine("Validation finished");
      }

      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.

<!--Load HeadCount.xsd in SchemaCollection for Validation-->
<hc:HeadCount xmlns:hc='xsdHeadCount'>
   <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>

En el ejemplo de código siguiente se crea un XmlValidatingReader que acepta un XmlTextReader. El archivo de entrada, sample4.xml, se valida con respecto al esquema XML, sample4.xsd.

Dim tr As New XmlTextReader("sample4.xml")
Dim vr As New XmlValidatingReader(tr)
vr.ValidationType = ValidationType.Schema
vr.Schemas.Add("datatypesTest", "sample4.xsd")
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallBack
While vr.Read()
   Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
[C#]
XmlTextReader tr = new XmlTextReader("sample4.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.Schema;
        vr.Schemas.Add("datatypesTest", "sample4.xsd");
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
while(vr.Read()) {
    Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
    }

A continuación se describe el contenido del archivo de entrada, sample4.xml, que se va a validar.

<datatypes xmlns="datatypesTest">
    <number>
        <number_1>123</number_1>
    </number>
</datatypes>

A continuación se describe el contenido del archivo de esquema XML, sample4.xsd, que se usará como referencia para la validación.

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="datatypesTest" 
    targetNamespace="datatypesTest"
    elementFormDefault="qualified">

<xs:element name = "datatypes">
  <xs:complexType>
    <xs:all>
        <xs:element name="number">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="number_1" type="xs:decimal" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:all>
  </xs:complexType>
</xs:element>
</xs:schema>

Vea también

XmlSchemaCollection como caché del esquema | Validación de XML con esquemas | XmlParserContext (Clase) | XmlValidatingReader.ValidationEventHandler (Evento) | XmlValidatingReader.Schemas (Propiedad)