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

Indice de Ejemplos de ADO .NET


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.