Cómo crear un archivo XML con los datos de un objeto DataSet |
Por Enrique Martínez Montejo |
Última revisión: 24/06/2006 |
La versatilidad que nos ofrece el objeto DataSet para contener datos de cualquier origen, lo hace idóneo para exportar los datos contenidos en el mismo, ofreciéndonos la posibilidad de crear un documento perteneciente al Lenguaje de Marcado Extensible (XML) mediante su método público WriteXML. Una vez creado el documento, posteriormente lo podremos importar a una aplicación de Microsoft Office System, entre otras, o bien, abrirlo directamente en nuestro propio navegador.
De las varias sobrecargas que presenta el método WriteXML, hay una que nos permite pasar a su constructor, bien un objeto TextWriter (del espacio de nombres System.IO), como XMLTextWrite (incluido en el espacio de nombres System.XML). Este último objeto es el que voy a utilizar en el procedimiento que presento en ésta ocasión, debido a que nos proporciona un método rápido de escritura, con desplazamiento sólo hacia delante y sin almacenamiento en caché, para generar secuencias o archivos con datos XML compatible con las recomendaciones relativas a espacios de nombres en XML y Extensible Markup Language (XML) 1.0 efectuadas por el World Wide Consortium (W3C) el 10 de febrero de 1998 (aunque ya su tercera edición es de fecha 04 de febrero de 2004), y que podrá consultarlas en los enlaces indicados anteriormente.
Como al constructor del objeto XMLTextWrite se le puede pasar un objeto Stream, utilizaré un objeto FileStream para crear el documento XML con el nombre que hayamos pasado en el argumento fileNameXML. Asimismo, si deseamos vincular el documento XML con una hoja de estilos del lenguaje extensible, podrá pasar igualmente la ruta y el nombre del archivo en el parámetro fileNameStyleSheetXSL, de ésta forma, si abrimos el documento XML en un navegador, podremos ver la información en un formato tabular en lugar de visualizarla en la típica estructura jerárquica de los documentos XML. Si no deseamos utilizar una hoja de estilo, deberá de pasar como valor del parámetro, una cadena de longitud cero, porque de pasarle la ruta de un archivo inexistente, podemos tener problemas a la hora de visualizar el documento XML. Por último, el parámetro overWrite se encargará de advertir la existencia de un archivo con idéntico nombre que el que deseamos crear; en caso de pasar el valor True, el archivo se sobrescribirá sin ningún aviso previo.
Obviamente, el primer parámetro del procedimiento, requerirá un objeto DataSet válido, que contenga al menos un objeto DataTable, si nuestra intención es traspasar los datos al documento XML. Si no existe ningún objeto DataTable, el documento XML solamente albergará el encabezado del documento.
Private
Sub CreateXMLFile(ByVal
ds As DataSet, _
ByVal fileNameXML As
String, _
ByVal fileNameStyleSheetXSL
As
String, _
ByVal overWrite
As
Boolean)
'*******************************************************************
' Nombre: CreateXMLFile
' por Enrique Martínez Montejo - 24/06/2006
'
' Versión: 1.0 (Compatible con
Framework 1.0, 1.1 y 2.0)
'
' Finalidad: Crear un archivo XML con el contenido existente
'
en un objeto DataSet.
'
' Entradas:
'
' ds: DataSet. Un objeto DataSet
válido.
'
' fileNameXML:
' String. Ruta y nombre
del archivo XML de salida.
'
' fileNameStyleSheetXSL:
' String.
Ruta y nombre, si procede, de la hoja de
' de estilo
del lenguaje extensible a la cual se
' vinculará
el archivo XML.
' Si no desea
especificar ninguna hoja de estilo, pase
' al
procedimiento una cadena de longitud cero ("").
'
' overWrite:
' Boolean. De
ser False, y existir el archivo XML,
' se pedirá
confirmación para sobrescribir el archivo.
'
'*******************************************************************
' Verificamos los parámetros
pasados al procedimiento.
'
If ((ds
Is
Nothing)
OrElse (fileNameXML =
""))
Then
MessageBox.Show("Parámetros
incorrectos.", _
"Crear XML", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return
End
If
' Si el archivo existe, pedimos
confirmación para sobrescribirlo,
' siempre y cuando no se haya especificado explícitamente.
'
If ((overWrite =
False)
AndAlso (System.IO.File.Exists(fileNameXML) =
True))
Then
If MessageBox.Show("Ya
existe un archivo con el mismo nombre " & _
"en la ruta indicada. " & vbCrLf & vbCrLf & _
"¿Desea sobrescribirlo?", _
"Crear XML", MessageBoxButtons.YesNo, _
MessageBoxIcon.Question) = Windows.Forms.DialogResult.No
Then
Return
End
If
End
If
' A fin de controlar la posible
excepción que se puede
' dar al no poder obtener acceso al archivo.
'
Try
' Creamos
un objeto FileStream para escritura.
'
Dim fs
As
New
System.IO.FileStream(fileNameXML,System.IO.FileMode.Create)
' Creamos
un objeto XmlTextWriter para el
' objeto FileStream.
'
Dim xtw
As
New System.Xml.XmlTextWriter(fs,
System.Text.Encoding.Unicode)
'
Procesamos las instrucciones, indicando la hoja de estilos,
' si procede, al comienzo del archivo
XML.
'
With xtw
.WriteProcessingInstruction("xml",
"version='1.0'")
.WriteProcessingInstruction("xml-stylesheet", _
"type='text/xsl' href='" & _
fileNameStyleSheetXSL & _
"'")
' Escribimos los datos del objeto DataSet en el archivo XML.
'
ds.WriteXml(xtw)
' Cerramos el objeto
'
.Close()
End
With
MessageBox.Show("Se
ha creado con éxito el archivo XML.", _
"Crear XML", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex
As IO.IOException
MessageBox.Show(ex.Message, _
"Crear XML", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Catch ex
As Exception
MessageBox.Show(ex.Message, _
"Crear XML", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End
Try
End Sub
Cómo crear un archivo XML con los datos de un objeto DataSet
Si abre con el Bloc de Notas el documento XML creado, puede que observe que el nodo principal del documento se llama NewDatSet, y el nodo secundario Table. Esto es así porque dicho nodos llevarán el nombre de los objetos DataSet, y DataTable respectivamente, que son los valores predeterminados de las propiedades DataSetName y TableName. Si desea que aparezcan otro nombres, simplemente tiene que especificarlos en su oportuno momento.
Si el documento XML se encuentra vinculado a una hoja de estilos del lenguaje extensible, es importante que los nombres que le haya dado a los objetos DataSet y DataTable, sean idénticos a los que figuren en la etiqueta
<xsl:for-each select="Nombre_DataSet/Nombre_DataTable">
del archivo de hoja de estilo, porque de no coincidir, no observará ningún dato en el documento XML.
Otros enlaces de interés:
Cómo crear un archivo de texto delimitado con los datos existentes en un DataSet
Enrique Martínez Montejo - 2006
NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.
NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.