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:
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)
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:
Facil y concreto. Muy buen aporte.
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
Hola podrías explicarme a hacer el programa en C# mediante el uso de un formulario? Gracias y buen aporte!
Publicar un comentario