Foros del Web » Programación para mayores de 30 ;) » .NET »

Añadir datos al XML

Estas en el tema de Añadir datos al XML en el foro de .NET en Foros del Web. Hola a todos. Resulta que estoy guardando unos valores en XML, pero tengo un problema a la hora de añadir otro registro al XML ya ...
  #1 (permalink)  
Antiguo 24/03/2009, 10:49
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 0
Añadir datos al XML

Hola a todos.

Resulta que estoy guardando unos valores en XML, pero tengo un problema a la hora de añadir otro registro al XML ya hecho.

El problema es el siguiente:

Creo el XML por primera vez. - Funciona bien

Pero si quiero agregar un dato a ese XML, no lo hace.

Lo que hace es borrarme el xml anterior y me lo llena con los nuevos datos. Pero yo no quiero eso si no que en vez de sobreescribirlos, me los añada como en otro nodo.

Utilizo el siguiente código:

Código:
  Public Sub CrearXML(ByVal NombreXML As String, ByVal nombreAlbum As String, ByVal datos() As datosXML)
        Dim doc As New System.Xml.XmlDocument()

        Dim Albumes As System.Xml.XmlNode = doc.CreateElement("Albumes")



        doc.AppendChild(Albumes)

        Dim Album As System.Xml.XmlNode = doc.CreateElement("Album")
        Dim atr As System.Xml.XmlAttribute = doc.CreateAttribute("Nombre")
        Album.Attributes.Append(atr)
        atr.InnerText = nombreAlbum
        Dim i As Integer = 0
        For x As Integer = 0 To datos.Count - 1

            Dim Data As System.Xml.XmlNode = doc.CreateElement("Imagen")
            Dim atributo As System.Xml.XmlAttribute = doc.CreateAttribute("Nombre")
            Dim atributo2 As System.Xml.XmlAttribute = doc.CreateAttribute("Ruta")
            atributo.InnerText = datos(x).Nombre
            atributo2.InnerText = datos(x).path
            Data.Attributes.Append(atributo)
            Data.Attributes.Append(atributo2)
            Album.AppendChild(Data)
        Next
        i += 1
        Dim a As System.Xml.XmlNode = Album

        Albumes.AppendChild(Album)



        doc.Save("albumes.xml")
    End Sub
¿Me podríais ayudar o decir, como lo debo de hacer para que funcione bien?

Por cierto está en vb.NET

Gracias!
  #2 (permalink)  
Antiguo 24/03/2009, 15:34
Avatar de dadabit  
Fecha de Ingreso: febrero-2009
Ubicación: Coahuila, México
Mensajes: 145
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Añadir datos al XML

Cita:
Iniciado por Krato Ver Mensaje
Hola a todos.

Resulta que estoy guardando unos valores en XML, pero tengo un problema a la hora de añadir otro registro al XML ya hecho.

El problema es el siguiente:

Creo el XML por primera vez. - Funciona bien

Pero si quiero agregar un dato a ese XML, no lo hace.

Lo que hace es borrarme el xml anterior y me lo llena con los nuevos datos. Pero yo no quiero eso si no que en vez de sobreescribirlos, me los añada como en otro nodo.

Utilizo el siguiente código:

Código:
  Public Sub CrearXML(ByVal NombreXML As String, ByVal nombreAlbum As String, ByVal datos() As datosXML)
        Dim doc As New System.Xml.XmlDocument()

        Dim Albumes As System.Xml.XmlNode = doc.CreateElement("Albumes")



        doc.AppendChild(Albumes)

        Dim Album As System.Xml.XmlNode = doc.CreateElement("Album")
        Dim atr As System.Xml.XmlAttribute = doc.CreateAttribute("Nombre")
        Album.Attributes.Append(atr)
        atr.InnerText = nombreAlbum
        Dim i As Integer = 0
        For x As Integer = 0 To datos.Count - 1

            Dim Data As System.Xml.XmlNode = doc.CreateElement("Imagen")
            Dim atributo As System.Xml.XmlAttribute = doc.CreateAttribute("Nombre")
            Dim atributo2 As System.Xml.XmlAttribute = doc.CreateAttribute("Ruta")
            atributo.InnerText = datos(x).Nombre
            atributo2.InnerText = datos(x).path
            Data.Attributes.Append(atributo)
            Data.Attributes.Append(atributo2)
            Album.AppendChild(Data)
        Next
        i += 1
        Dim a As System.Xml.XmlNode = Album

        Albumes.AppendChild(Album)



        doc.Save("albumes.xml")
    End Sub
¿Me podríais ayudar o decir, como lo debo de hacer para que funcione bien?

Por cierto está en vb.NET

Gracias!

Yo diría que es más fácil así

Código:
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim path = Server.MapPath("~/futbolistas.xml")
        Dim settings As New XmlWriterSettings()
        settings.Indent = True
        settings.NewLineOnAttributes = True
        Using writer As XmlWriter = XmlWriter.Create(path, settings)

            'writer.Formatting = Formatting.Indented

            writer.WriteStartDocument()
            writer.WriteStartElement("futbolistas")

            writer.WriteStartElement("jugador")
            writer.WriteAttributeString("pais", "España")
            writer.WriteElementString("nombre", "David Villa")
            writer.WriteStartElement("equipo")
            writer.WriteString("Valencia C.F.")

            writer.WriteEndElement()
            writer.WriteEndElement()


            writer.WriteStartElement("jugador")
            writer.WriteAttributeString("pais", "Argentina")
            writer.WriteElementString("nombre", "Leo Messi")
            writer.WriteStartElement("equipo")
            writer.WriteString("Barcelona F.C.")

            writer.WriteEndElement()
            writer.WriteEndElement()
            writer.WriteEndElement()

            writer.WriteEndDocument()
            writer.Close()
        End Using
        MsgBox("XML de futbolistas creado")
    End Sub
StartElement es un nodo
AttributteElement es un atributo de ese nodo (entre Start y End)
puedes jugar con Start y EndElement para anidar nodos hijos...

espero que te ayude
  #3 (permalink)  
Antiguo 24/03/2009, 15:38
Avatar de dadabit  
Fecha de Ingreso: febrero-2009
Ubicación: Coahuila, México
Mensajes: 145
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Añadir datos al XML

Perdón, no lei lo de más abajo detenidamente...

mira yo digo, que entonces lo leas el xml, si la estructura no va acambiar
o ya sabes el nombre de los nodos y sus atributos...

entonces lo lees, cada nodo y atributo lo guardas en variables y
vuelves a crear otro xml añadiendole los nuevos datos...
  #4 (permalink)  
Antiguo 24/03/2009, 16:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 0
Respuesta: Añadir datos al XML

Si verdad? No hay otra manera.mmm

Me podrías explicar porfavor, como leer los datos del sub que me has enseñado?


Soy un noob en cuanto a XML xD

y una cosilla, con tu código me forma así el XML

Código:
<?xml version="1.0" encoding="utf-8"?>
<Albumes>
  <Album
    Nombre="Album1">
    <Imágenes>
      <NumImagen
        Número="0">
        <Ruta>c:\Casa.jpg</Ruta>
        <Imagen>Casa</Imagen>
      </NumImagen>
    </Imágenes>
  </Album>
</Albumes>
Habría alguna manera de ponerlo de ésta manera?

Código:
<?xml version="1.0" encoding="utf-8"?>
<Albumes>
  <Album Nombre="Album1">
    <Imágenes>
      <NumImagen  Número="0">
        <Ruta>c:\Casa.jpg</Ruta>
        <Imagen>Casa</Imagen>
      </NumImagen>
    </Imágenes>
  </Album>
</Albumes>
Gracias de nuevo.
  #5 (permalink)  
Antiguo 24/03/2009, 17:04
Avatar de dadabit  
Fecha de Ingreso: febrero-2009
Ubicación: Coahuila, México
Mensajes: 145
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Añadir datos al XML

Para leer el xml

Código:
Imports System.Xml
Imports Sistem.IO

Private Sub leerXML()
        'Lector xml
        Dim lector As XmlTextReader
        'Documento xml
        Dim Doc As XmlDocument = New XmlDocument

        'Leer datos del xml
        Try
            'Se crea el lector
            lector = New XmlTextReader(archivo.xml))
            'Se descartan espacios blancos
            lector.WhitespaceHandling = WhitespaceHandling.None
            lector.Read() 'Se posiciona en la directiva xml <?xml version....>
            lector.Read() ' Se posiciona en el primer elemento <Albumes>
            
            lector.Read() ' Se posiciona en el elemento <Album>
           'Leer atributos del elemento <Album>
            Dim nombre As String = lector.GetAttribute("Nombre")

            lector.Read() ' Se posiciona en el elemento <Imágenes>
            lector.Read() ' Se posiciona en el elemento <NumImagen>
       
            'Leer atributos del elemento <NumImagen>
            Dim numImg As String = lector.GetAttribute("Numero")

           lector.Read() ' Se posiciona en el elemento <Ruta>
           'Aqui es diferente, ya que no se trata de un atributo
           Dim ruta = lector.ReadElementString("Ruta")
           lector.Read() ' Se posiciona en el elemento </Ruta>

           lector.Read() ' Se posiciona en el elemento <Imagen>
           'Aqui es diferente, ya que no se trata de un atributo
           Dim imagen = lector.ReadElementString("Imagen")
           lector.Read() ' Se posiciona en el elemento </Imagen>

           lector.Read() ' Se posiciona en el elemento </Imágenes>
           lector.Read() ' Se posiciona en el elemento </Album>
           lector.Read() ' Se posiciona en el elemento </Albumes>
         
           lector.close() ' Se cierra el lector

        Catch ex As IO.IOException
            MsgBox("Imposible leer xml")
        End Try
    End Sub
Asi es para leer el xml, ya tienes todos los atributos guardados en las
variables, ahora con vuelves a construir el otro xml añadiendole lo que
quieras, con el código anterior que postie.

Apoyate con lector.localName (devuelve un String y te dice en que nodo se encuentra el lector) por si me equivoque y no se esta leyendo ese nodo.


El código que te pase te devió de haber puesto todo seguido, lo unico
raro pero que no tiene nada que ver, es que en el atributo Nombre brinco una línea. Pero a mi parecer no importa.

si quieres pasame tu correo y te envió la solución que generé yo.
Escribe: xml al vuelo, y desde los datos de una BD, y las puede leer y lo que lee
lo muestra en un grid.....básico de ahi aprendi a realizar otras cosas..

saludos
  #6 (permalink)  
Antiguo 25/03/2009, 06:15
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 0
Respuesta: Añadir datos al XML

Se supone que está bien el lector ese que me ha pasado, pero cuando va a pasar por la variable "Imagen" da el siguiente error:

'EndElement' es un XmlNodeType no válido. Línea 9, posición 20.

Que se refiere a la barra de cierre de la Nodo Imagen es decir a esto / en esto </imagen>

Y no entiendo porque.

Por cierto te he pasado mi correo por MP. Thanks
  #7 (permalink)  
Antiguo 25/03/2009, 10:01
Avatar de dadabit  
Fecha de Ingreso: febrero-2009
Ubicación: Coahuila, México
Mensajes: 145
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Añadir datos al XML

Ok, la verdad no sabría decirte. Intenta quitar acentos, no
es muy comun que el nombre de los nodos tengan caracteres raros.
Aunque no creo que por eso haya sido el error.
Hay que leer nodo, por nodo, vas avanzando con Read(), cada Read() te bricas
a otro nodo. Otra cosa sería que me haya equivocado yo, ya que no lo compile ni
nada, nomas te lo escribi así. Utiliza el atributo "localName" para que monitores
en que nodo realmente esta el lector.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:32.