none
Como Modificar un nodo RRS feed

  • Pregunta

  • Buenas quiero modificar un nodo y no borrarlo y volverlo a grabar

    Tengo la estructura de esta manera quiero cambiar por ejemplo el que esta en negrita 

    Gracias

    <?xml version="1.0" encoding="WINDOWS-1252"?>
    <Dry_Hopping>
      <Columbus>
        <Items>
          <Fecha_Inicio>11/02/2018</Fecha_Inicio>
          <Fecha_Fin>17/02/2018</Fecha_Fin>
          <Peso>12</Peso>
          <Agregado>Primario</Agregado>
          <Df>1010</Df>
        </Items>
        <Items>
          <Fecha_Inicio>18/02/2018</Fecha_Inicio>
          <Fecha_Fin>24/02/2018</Fecha_Fin>
          <Peso>14</Peso>
          <Agregado>Primario</Agregado>
          <Df>1010</Df>
        </Items>
      </Columbus>
      <Amarillo>
        <Items>
          <Fecha_Inicio>19/02/2018</Fecha_Inicio>
          <Fecha_Fin>21/02/2018</Fecha_Fin>
          <Peso>12</Peso>
          <Agregado>Primario</Agregado>
          <Df>1010</Df>
        </Items>
      </Amarillo>

    martes, 20 de febrero de 2018 8:23

Respuestas

  • Como puedo saber [...] el numero del items

    Podrias recurrir a este truco:

    Dim numeroDeItems as Integer = XmlDocument_Dry_Hopping.SelectNodes("//Columbus/Items").Count

    • Marcado como respuesta Diablo_Rojo jueves, 22 de febrero de 2018 10:02
    miércoles, 21 de febrero de 2018 11:56

Todas las respuestas

  • ¿Cuál de las muchas tecnologías para manipular XML estás usando? Si lo estás haciendo con un XmlDocument, basta que hagas un SelectSingleNode para buscar el elemento deseado y luego le metas el nuevo valor en el InnerXml del nodo encontrado. Si no es así como estás trabajando, ponnos aquí el código que usas para manipular el XML y te indicamos cómo alterarlo para cambiar el nodo.
    martes, 20 de febrero de 2018 15:14
  • Gracias por responder alberto

    Este es el codigo que estoy usando

    Sub Graba_DryHopping()
            XmlDocument_Dry_Hopping = New XmlDocument
    
            Dim ruta As String = New Regex("[/]").Replace("RECETAS\" & Inicio.DataGridView1.CurrentRow.Cells(0).Value & "_" & Inicio.DataGridView1.CurrentRow.Cells(1).Value, "_") & "\DryHopping.xml"
            Dim Ruta2 As String = ruta.Replace("\", "/")
    
            Dim existe As String
            existe = My.Computer.FileSystem.FileExists(ruta)
            If existe = True Then
                Dim nodeToFind As XmlNode
                Dim nodelist As XmlNodeList
                XmlDocument_Dry_Hopping.Load(Ruta2)
                Dim root As XmlNode = XmlDocument_Dry_Hopping.DocumentElement
                Dim Nombre_Lupulo = String.Empty
                Nombre_Lupulo = New Regex("[ ().]").Replace(Receta_Nueva.DGV_Lupulos.CurrentRow.Cells(0).Value, "")
                Dim nombre As XmlElement = XmlDocument_Dry_Hopping.CreateElement(Nombre_Lupulo)
                nodelist = XmlDocument_Dry_Hopping.SelectNodes(root.Name & "/" & Nombre_Lupulo)
                nodeToFind = root.SelectSingleNode("//" & root.Name & "/" & Nombre_Lupulo)
                If (Not (nodeToFind) Is Nothing) Then
                    MessageBox.Show("Encontrado")
                Else
                    MessageBox.Show("NO encontrado")
                    root.AppendChild(nombre)
                    For Each DryHopping_Rows As DataGridViewRow In DGV_DryHopping.Rows
                        If DryHopping_Rows.IsNewRow Then
                        Else
                            Dim Items As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Items")
                            nombre.AppendChild(Items)
    
                            Dim elem1 As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Fecha_Inicio")
                            Dim elem2 As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Fecha_Fin")
                            Dim elem3 As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Peso")
                            Dim elem4 As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Agregado")
                            Dim elem5 As XmlElement = XmlDocument_Dry_Hopping.CreateElement("Df")
    
                            elem1.InnerText = DryHopping_Rows.Cells(0).Value
                            elem2.InnerText = DryHopping_Rows.Cells(1).Value
                            elem3.InnerText = DryHopping_Rows.Cells(2).Value
                            elem4.InnerText = DryHopping_Rows.Cells(3).Value
                            elem5.InnerText = DryHopping_Rows.Cells(4).Value
                            'Add the node to the document.
    
                            Items.AppendChild(elem1)
                            Items.AppendChild(elem2)
                            Items.AppendChild(elem3)
                            Items.AppendChild(elem4)
                            Items.AppendChild(elem5)
                            'Add the node to the document.
    
                        End If
                    Next
    
                    XmlDocument_Dry_Hopping.Save(Ruta2)
                End If
                
    
            Else
                Dim obj As Object
                Dim Archivo As Object
                obj = CreateObject("Scripting.FileSystemObject")
                Archivo = obj.CreateTextFile(ruta, True)
    
    
                Archivo.Writeline("<?xml version='1.0' encoding='WINDOWS-1252'?>")
                Archivo.Writeline("<Dry_Hopping>")
                Archivo.Writeline("</Dry_Hopping>")
                Archivo.Close()
    
                Call Graba_DryHopping()
            End If
        End Sub


    en este caso quiero modificar un nodo del segundo agregado de columbus, pero puede tener 3, 1 o mas como se ve en la imagen

    • Editado Diablo_Rojo martes, 20 de febrero de 2018 17:13
    martes, 20 de febrero de 2018 17:07
  • Bien, veo que efectivamente es un XmlDocument. Si no quieres modificar el dato sobre la marcha, según lo estás cargando, sino que quieres hacer cambios sobre el XML ya cargado, entonces lo primero es localizar el nodo que quieres modificar. Esto se puede hacer de muchas formas, pero una de ellas es con un XPATH:

    Dim nodo as XmlNode = XmlDocument_Dry_Hopping.SelectNodes("(//Columbus/Items)[2]/Df")

    Y después ya le cambias el valor:

    nodo.InnerXml="1234"

    martes, 20 de febrero de 2018 19:06
  • gracias por responde Alberto 

    hay alguna manera de saber si se a modificado algun nodo ?

    Gracias

    Y otra cosa si decido borrar el items 1 ?

    como se tendria que hacer ? 


    • Editado Diablo_Rojo martes, 20 de febrero de 2018 19:17
    martes, 20 de febrero de 2018 19:16
  • Hay manera de quitar los 2 item y volver a grabar lo que tenga en el datagridview 

    y lo mismo si agrego otra fila en el datagridview?

    Gracias

    martes, 20 de febrero de 2018 19:21
  • hay alguna manera de saber si se a modificado algun nodo ?

    [...]

    Y otra cosa si decido borrar el items 1 ?

    como se tendria que hacer ? 


    El XmlDocument no dispara ningún evento ni nada cuando se modifican los nodos. Pero dado que solo se pueden modificar cuando tú ejecutas algo que los modifique, la forma de saber si se han modificado es que te fijes en la parte del código en donde tú los modificas.

    Para borrar un item, primero lo buscas mediante su correspondiente XPATH, y una vez que tengas el item deseado, el truco para borrarlo es tomar su .Parent y llamar al Remove desde el Parent. Algo similar a lo siguiente:

    Dim nodo as XmlNode = XmlDocument_Dry_Hopping.SelectSingleNode("(//Columbus/Items)[1]")

    nodo.Parent.Remove(nodo)

    Por cierto, en la respuesta anterior te puse SelectNodes cuando debía ser SelectSingleNode. El SelectNodes es para buscar todos los que cumplan una condición, y el SelectSingleNode para buscar uno solo.

    • Marcado como respuesta Diablo_Rojo miércoles, 21 de febrero de 2018 9:51
    • Desmarcado como respuesta Diablo_Rojo miércoles, 21 de febrero de 2018 9:51
    martes, 20 de febrero de 2018 19:30
  • Gracias por responder Alberto 

    Tengo ya varios conceptos cogidos para terminar esta parte del codigo, pero tengo una duda

    <Dry_Hopping>
      <Columbus>
        <Items>
          <Fecha_Inicio>11/02/2018</Fecha_Inicio>
          <Fecha_Fin>17/02/2018</Fecha_Fin>
          <Peso>12</Peso>
          <Agregado>Primario</Agregado>
          <Df>1010</Df>
        </Items>
        <Items>
          <Fecha_Inicio>18/02/2018</Fecha_Inicio>
          <Fecha_Fin>24/02/2018</Fecha_Fin>
          <Peso>14</Peso>
          <Agregado>Primario</Agregado>
          <Df>1010</Df>
        </Items>
      </Columbus>
    Si quiero borrar este item pero resulta que corresponde en el datagridview a la fila 2 o sea 1 como obtengo el numero de items por que si los borro por nombre en este caso items me borraria todos 

    miércoles, 21 de febrero de 2018 9:46
  • Como puedo saber este dato automaticamente el que esta marcado en negrita el numero del items

    MsgBox(nodeToFind.ChildNodes(0).ToString)

    miércoles, 21 de febrero de 2018 9:50
  • Lo que busco es ahora mismo es 

    if  DataGridView1.CurrentRow.Index.ToString() = nodo.inde  no se como obtener el numero del nodo 

    busco el Index de items 


    • Editado Diablo_Rojo miércoles, 21 de febrero de 2018 10:55
    miércoles, 21 de febrero de 2018 10:37
  • Como puedo saber [...] el numero del items

    Podrias recurrir a este truco:

    Dim numeroDeItems as Integer = XmlDocument_Dry_Hopping.SelectNodes("//Columbus/Items").Count

    • Marcado como respuesta Diablo_Rojo jueves, 22 de febrero de 2018 10:02
    miércoles, 21 de febrero de 2018 11:56
  • Gracias por responder Alberto 

    Ya lo he probado y no me vale 

    tengo que obtener el Index de cada Items no el total de items 

    para poder comparar con cada index del datagridview por si elimino una fila elimiar el items corespondiente en el nodo

    No se si me he explicado bien y no se si se puede obtener 

    Un saludo y muchisimas gracias por tu ayuda

    miércoles, 21 de febrero de 2018 12:36
  • tengo que obtener el Index de cada Items no el total de items 

    Bueno, ya te he enseñado cómo obtener la colección de todos los Items. No tienes más que recorrerlos uno por uno con un bucle, y así el índice del bucle te va dando el Index de cada Item.
    miércoles, 21 de febrero de 2018 18:27
  • Gracias por la respuesta Alberto

    1000 gracias

    jueves, 22 de febrero de 2018 10:02