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 dispositivos 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 cómo 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.
Cargar XSD
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 = .FileNameTryDim 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 cual 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
DataSet a XSD
Ahora vamos a aprender cómo 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 = NothingTry 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
Salvando XML con propiedades
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 que haya 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
Cargando XML
El siguiente ejemplo nos muestra cómo 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 StringWith 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 cómo 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.