martes, 30 de octubre de 2018

Módulo de Visual Basic .NET para leer, grabar, editar y eliminar contenido en un fichero xml. Ejemplo completo de gestión de un fichero xml.

Imports System.IO
Imports System.Xml

Module ModCadenasConexionesXml
    'Gestionar fichero xml que almacena en este caso cadenas de conexion
    'Leer, Grabar, Editar y Eliminar valores de cadenas de conexion
    '
    'Ejemplo fichero:
    '<?xml version="1.0" encoding="utf-8"?>
    '<CadenasConexiones>
    ' <CadenaConexion ID = "1" >
    '    <Valor>Server=.\SQLEXPRESS;Database=PRUEBAS;Trusted_Connection=True;</Valor>
    ' </CadenaConexion>
    ' <CadenaConexion ID = "2" >
    '    <Valor>Server=.\SQLEXPRESS;Database=PRUEBAS2;Trusted_Connection=True;</Valor>
    ' </CadenaConexion>
    '</CadenasConexiones>

    Const PATHFICHERO = ".\CadenasConexion.xml"
    Const NOMBRERAIZ = "CadenasConexiones"
    Const NOMBRENODO = "CadenaConexion"
    Const NOMBREATRIBUTONODO1 = "ID"
    Const NOMBREVALORNODO1 = "Valor"

    Public Class clsCadenaConexion
        Public _ID As String
        Public _Valor As String

        Public Sub New()
            Me._ID = ""
            Me._Valor = ""
        End Sub

        Public Sub New(DescConexion As String, CadConexion As String)
            Me._ID = DescConexion
            Me._Valor = CadConexion
        End Sub

        Public Function GrabarCadenaConexionXml() As Boolean
            Try
                If Not File.Exists(PATHFICHERO) Then
                    'Crear XmlWriterSttings.
                    Dim settings As XmlWriterSettings = New XmlWriterSettings()
                    settings.Indent = True

                    'Crear XmlWriter
                    Dim writer As XmlWriter
                    writer = XmlWriter.Create(PATHFICHERO, settings)

                    'Inicio escritura documento xml
                    writer.WriteStartDocument()
                    writer.WriteStartElement(NOMBRERAIZ) ' Raíz.

                    'Grabar nodo
                    writer.WriteStartElement(NOMBRENODO)
                    writer.WriteAttributeString(NOMBREATRIBUTONODO1, Me._ID)
                    writer.WriteElementString(NOMBREVALORNODO1, Me._Valor)
                    'Fin grabar nodo
                    writer.WriteEndElement()

                    'Fin escritura documento xml
                    writer.WriteEndElement()
                    writer.Close()
                Else
                    ActualizarGrabarNodo()
                End If

                Return True

            Catch ex As Exception
                Debug.Print(ex.Message)
                Return False
            End Try
        End Function

        Private Function ActualizarGrabarNodo() As Boolean
            Dim resb As Boolean = False

            Try
                'Cargar fichero xml
                Dim xd As New XmlDocument
                xd.Load(PATHFICHERO)

                'Buscar NODO por el atributo ID
                For Each e As XmlElement In xd.GetElementsByTagName(NOMBRENODO)
                    resb = (Me._ID = e.GetAttribute(NOMBREATRIBUTONODO1))
                    If resb Then
                        'ID encontrado. Actualizar valor
                        e.Item(NOMBREVALORNODO1).InnerText = Me._Valor
                        xd.Save(PATHFICHERO)
                        Exit For
                    End If
                Next e

                If Not resb Then
                    'ID no encontrado. Grabar nuevo valor

                    'Creamos nuevo nodo con sus atributos y elementos
                    Dim nCadCon As XmlElement = xd.CreateElement(NOMBRENODO)
                    nCadCon.SetAttribute(NOMBREATRIBUTONODO1, Me._ID)
                    Dim nValor As XmlElement = xd.CreateElement(NOMBREVALORNODO1)
                    nValor.InnerText = Me._Valor
                    nCadCon.AppendChild(nValor)

                    'Añadir nuevo nodo al xml y grabar los cambios al fichero
                    xd.DocumentElement.AppendChild(nCadCon)
                    xd.Save(PATHFICHERO)

                    resb = True
                End If

                Return resb
            Catch ex As Exception
                Debug.Print(ex.Message)
                Return False
            End Try

        End Function

        Public Function EliminarCadenaConexionXml() As Boolean
            Dim resb As Boolean = False

            Try
                'Cargar fichero xml
                Dim xd As New XmlDocument
                xd.Load(PATHFICHERO)

                'Buscar NODO por ID
                For Each e As XmlElement In xd.GetElementsByTagName(NOMBRENODO)
                    resb = (Me._ID = e.GetAttribute(NOMBREATRIBUTONODO1))
                    If resb Then
                        'ID encontrado. Eliminar NODO
                        'obtenemos el nodo del elemento
                        Dim xn As XmlNode = e
                        'obtenemos la raiz e indicamos borrar el nodo
                        xn.ParentNode.RemoveChild(xn)
                        'grabamos los cambios en el fichero xml
                        xd.Save(PATHFICHERO)

                        Exit For
                    End If
                Next e

                Return resb
            Catch ex As Exception
                Debug.Print(ex.Message)
                Return False
            End Try

        End Function

        Public Function LeerCadenasConexionesXml() As DataSet
            Try
                Dim ds As New DataSet
                ds.Tables().Add(NOMBRERAIZ)
                ds.Tables(NOMBRERAIZ).Columns.Add(NOMBREATRIBUTONODO1)
                ds.Tables(NOMBRERAIZ).Columns.Add(NOMBREVALORNODO1)

                Dim xd As New XmlDocument
                xd.Load(PATHFICHERO)

                For Each e As XmlElement In xd.GetElementsByTagName(NOMBRENODO)
                    Dim dr As DataRow
                    dr = ds.Tables(NOMBRERAIZ).Rows.Add
                    dr(NOMBREATRIBUTONODO1) = e.GetAttribute(NOMBREATRIBUTONODO1)
                    dr(NOMBREVALORNODO1) = e.Item(NOMBREVALORNODO1).InnerText
                    dr.AcceptChanges()
                Next e

                Return ds

            Catch ex As Exception
                Debug.Print(ex.Message)
                Return Nothing
            End Try
        End Function

    End Class

End Module

VBA Access. Redondeo de números decimales con el método medio redondeo. Alternativa a la función Round (bankers round)

 Private Function Redondeo(ByVal Numero As Variant, ByVal Decimales As Integer) As Double     'Aplica método medio redondeo (half round ...