miércoles, 3 de febrero de 2010

Validar XML con XSD y VB.NET

En este post, explicaré como un documento XML es validado por un documento XSD y como a través de VB.NET puedo ocupar estos documentos para validar a traves de código.

Bueno empecemos...

El lenguaje XML es un lenguaje de marca muy parecido a un documento HTML, pero hay una diferencia principal y es que el HTML no indica lo que se está representando, tiene datos mal definidos con elementos de formato, mientras que el XML contiene datos que se autodefinen: describe el contenido de lo que etiquetan.

Veamos un ejemplo:

La primera linea sólo nos dice al version del XML y la codificación, esta linea es necesaria en todos los documentos XML.

Después tengo una etiqueta “Documento” con un atributo DocID, esta etiqueta es “compleja”, ya que tiene etiquetas dentro, en nuestro caso Nombre, por lo tanto, una etiqueta es compleja o simple, si tiene o no etiquetas dentro.

Ahora se nos hace necesario validar este docuemento, para ello utilizamos los archivos con extensión XSD.

Cabe aclarar que un documento puede estar bien formado y válido, bien formado es cuando su sintaxis es correcta, por ejemplo todas las etiquetas tienen sus respectivos cierres, y válido cuando pasar por la revisión del XSD.

Acá hay un xsd para el documento xml anterior:




OJO: “este XSD valida que solo exista una etiqueta nombre, si queremos que exista más de una etiqueta Nombre entonces hay que agregar en “element nombre”, el atributo “maxoccurs=10”, de esa manera podrán haber hasta 10 etiquetas Nombre”

La primera línea define el NameSpace, estos se utilizan para proporcionar a los elementos un nombre único, en este caso xsd Después hay una etiqueta element, que representa una etiqueta en un documento XML, en este caso el elemento es "Documento", como la etiqueta es compleja, osea tiene etiquetas dentro, entonces se escribe la linea complextype, para enumerar todas las etiquetas que tiene dentro, en este caso sólo es "Nombre", como "Nombre" es una etiqueta simple, no lleva esta etiqueta. La etiqueta sequence sirve para enumerar los elementos anidados.

Ahora como documentos tiene atributos estos se deben declarar con la etiqueta attribute, donde definimos el nombre, el uso si es requerido o no y el tipo de datos, si es número o texto. Esta etiqueta siempre va luego del cierre de la etiqueta sequence.

Para asociar un documento XML con un XSd se debe agregar una etiqueta xsi:noNamespaceSchemaLocation="DocIngreso.xsd"

Ahora lo más interesante, ¿cómo hago para que mi sistema valide mis documentos XML con los documentos XSD?.


Bueno muy facíl, dare un pequeño ejemplo en VB.NET, si quieren un ejemplo en otro lenguaje sólo tienen que pedirlo.

Ahi va..

Lo primero es importar las librerias necesarias

Imports System.Xml

Imports System.Xml.Schema

Sub Main()

Luego creamos un objeto XmlTextReader, este objeto es un lector de un documento XML

Dim tr As New XmlTextReader("c:\DocIngreso.xml")

Luego cramos un objeto XmlValidatingreader y lo asociamos al objeto XmlTextReader

Dim vr As New XmlValidatingReader(tr)

Abrimos el documento xsd

vr.Schemas.Add("", "c:\DocIngreso.xsd")

y lo validamos por tipo Schema que es el tipo XSD

vr.ValidationType = ValidationType.Schema

luego leemos el documento xml, si se produce un error lo capturamos, sino es porque el documento es valido

AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler

While vr.Read()

End While

Console.WriteLine("Documento es válido")

Console.Read()

End Sub

Haber probemos el codigo!!!

El xsd me dice que el atributo DocID es un numero entero

Entonces probarpe con el DocId con un tipo numero y otro tipo texto.

Primer ejemplo con DocID=”123” (tipo numero)

Como era de esperarse el documento es válido según el xsd.

Segundo ejemplo con DocID=”alguna palabra” (tipo texto)

Acá nos sale el error y el mensaje, que el tipo de datos no es valido para el atributo DocID

Funciona!!!

Bueno espero les sirva…..

Aquí va el codigo completo...........................................

Imports System.Xml

Imports System.Xml.Schema

Module Module1

Sub Main()

Dim tr As New XmlTextReader("c:\DocIngreso.xml")

Dim vr As New XmlValidatingReader(tr)

vr.Schemas.Add("", "c:\DocIngreso.xsd")

vr.ValidationType = ValidationType.Schema

AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler

While vr.Read()

End While

Console.WriteLine("Documento es válido")

Console.Read()

End Sub

Public Sub ValidationHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)

Console.WriteLine("***Validation error")

Console.WriteLine("Severity:{0}", args.Severity)

Console.WriteLine("Message:{0}", args.Message)

Console.Read()

End Sub

End Module

3 comentarios:

Anónimo dijo...

Facil y concreto. Muy buen aporte.

Anónimo dijo...

Buen aporte, ahora necesito hacerlo al revés, crear archivos xml a partir de un esquema xsd he buscado como hacer esto con visual estudio pero no encuentro nada de utilidad

Anónimo dijo...

Hola podrías explicarme a hacer el programa en C# mediante el uso de un formulario? Gracias y buen aporte!

Emprendedores: ¿Quién es tu cliente?

“Hay dos tipos de personas en el mundo: hay personas que inventan excusas, y hay empresarios” Hace poco termine de leer el libro  Disc...