Modos de cargar y usar XML y XSD

0
358

Es importante para todo programador saber persistir y leer archivos XML con o sin sus XSD, porque tiene importancia para muchas aplicaciones.

Un ejemplo de esto son las aplicaciones para Pocket PC, ya que muchas veces ocupamos que estos aparatos “móviles” estén desconectados de las bases de datos pero aún así podamos trabajar en las aplicaciones, persistiendo datos localmente para luego sincronizar cambios con la base de datos.

Esto también aplica para aplicaciones Windows en las cuales ocupamos que los usuarios puedan trabajar desconectados, ya sean vendedores o cualquier ejecutivo que viaje con su laptop y no siempre pueda tener conexión directa con la LAN de la empresa para poder trabajar.

Posteriormente estaré publicando artículos sobre varios modelos para poder hacer que las aplicaciones de nosotros funcionen en modo “offline” y “online”. Pero por el momento es importante que sepamos como cargar y persistir de diferentes formas los XML y sus esquemas (XSD).

Cada uno de los siguientes fragmentos de código están en VB.NET, vamos a suponer q cada fragmento está dentro el Evento Click de un botón, que es el que dispara el evento. También suponemos que el objeto ds es un DataSet y el objeto dg1 es un DataGrid, solo para desplegar los resultados de la carga de los XML.

El siguiente fragmento explica como cargar en el dataset un esquema (XSD) desde un archivo:

Private Sub cmdLoadXSDFromFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLoadXSDFromFile.Click
With OpenFiledlg
.Filter = “*.xsd|*.xsd”
.ShowDialog()
If .FileName <> String.Empty Then
Me.Text = .FileName
Try
Dim ds As New DataSet
ds.ReadXmlSchema(.FileName)
dg1.DataSource = ds
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End If
End With
End Sub

Tenemos un OpenFileDialog el cuál nos muestra la ruta seleccionada por el usuario donde se encuentra el archivo XML a cargar, desde el dataset ds llamamos al método ReadXmlSchema y le pasamos por parámetro la ruta del archivo a cargar.

El siguiente ejemplo es parecido al anterior pero en vez de cargar el esquema desde un archivo lo hacemos desde un StreamReader:

Private Sub cmdLoadFromStream_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLoadFromStream.Click
With OpenFiledlg
.Filter = “*.xsd|*.xsd”
.ShowDialog()
If .FileName <> String.Empty Then
Me.Text = .FileName
Dim myStreamReader As System.IO.StreamReader = Nothing
Try
myStreamReader = New System.IO.StreamReader(.FileName)
Dim ds As New DataSet
ds.ReadXmlSchema(myStreamReader)
dg1.DataSource = ds
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End If
End With
End Sub

Ahora vamos a aprender como persistir al disco un esquema sacado de un dataset por medio de un StreamWriter:

Private Sub cmdWrite2Stream_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdWrite2Stream.Click
With SaveFiledlg
.Filter = “XSD|*.xsd”
.ShowDialog()
If .FileName <> String.Empty Then
Me.Text = .FileName
Dim myStreamwriter As System.IO.StreamWriter = Nothing

Try
myStreamwriter = New System.IO.StreamWriter(.FileName)

Dim ds As DataSet = Me.dg1.DataSource
ds.WriteXml(myStreamwriter, XmlWriteMode.WriteSchema)
myStreamwriter.Flush()
myStreamwriter.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End If
End With
End Sub

A continuación vamos a aprender a persistir un archivo XML pero guardando todas sus propiedades, ya sea si una fila es tipo inserted, update o deleted, para hacer esto guardamos el xml con una propiedad especial que se llama DiffGram, esto nos permite que no solo se guarde el XML sino que también se guarden las propiedades correspondientes a cada fila de información, ya sea q hayan sido insertadas, modificadas o eliminadas.

Private Sub cmdWriteDifgram_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdWriteDifgram.Click
With SaveFiledlg
.Filter = “XML|*.xml”
.ShowDialog()
If .FileName <> String.Empty Then
Me.Text = .FileName
Dim myStreamwriter As System.IO.StreamWriter = Nothing
Try
myStreamwriter = New System.IO.StreamWriter(.FileName)
' Dim ds As DataSet = Me.dg1.DataSource
Me.dg1.DataSource.WriteXml(myStreamwriter, XmlWriteMode.DiffGram)
myStreamwriter.Flush()
myStreamwriter.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End If
End With
End Sub

El siguiente ejemplo nos muestra como cargar un XML y un XSD, para así aplicarle ese esquema al XML y cargarlo en el dataset:

Private Sub LadXSDyXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadXSDyXML.Click
Dim file, ezquema As String

With OpenFiledlg
.Filter = “*.xsd|*.xsd”
.Title = “Indique el esquma XSD”
.ShowDialog()
If .FileName <> String.Empty Then
ezquema = .FileName
Else
Exit Sub
End If
.Title = “Archivo de datos XML”
.Filter = “XML|*.xml”
.ShowDialog()
If .FileName <> String.Empty Then
file = .FileName
Else
Exit Sub
End If
Try
Dim ds As New DataSet
ds.ReadXmlSchema(ezquema)
ds.ReadXml(file, XmlReadMode.Auto)
dg1.DataSource = ds
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End With
End Sub

El siguiente es un ejemplo muy simple de como persistir un dataset, pero con este método solo guardamos la información en un XML obviando las propiedades que se pueden guardar utilizando el modo DiffGram, anteriormente mencionado:

Private Sub cmdPersistirDS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPersistirDS.Click
Dim d As DataSet = dg1.DataSource
With SaveFiledlg
.Filter = “XML|*.xml”
.ShowDialog()
If .FileName <> String.Empty Then
d.WriteXml(.FileName)
End If
End With
End Sub

El último ejemplo es parecido al de arriba pero solo q en vez de guardar el XML guardamos el XSD:

Private Sub cmdPersistirXSD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPersistirXSD.Click
Dim d As DataSet = dg1.DataSource
With SaveFiledlg
.Filter = “XSD|*.xsd”
.ShowDialog()
If .FileName <> String.Empty Then
d.WriteXmlSchema(.FileName)
End If
End With
End Sub

Con eso los dejo, hay muchas otras formas de hacerlo, pero eso sirve como base para cualquier proyecto con XML.

Dejar respuesta

Please enter your comment!
Please enter your name here