martes, abril 23, 2024

Modos de cargar y usar XML y XSD

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.

 

Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub
Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub