none
No me crear 2 nodos del mismo contenido en nidadas diferentes RRS feed

  • Pregunta

  • Buenas quiero crear 2 nodos con el mismo nombre y contenido pero en nidadas diferentes pero no lo consigo 

    me lo crea asi

    <?xml version="1.0" encoding="WINDOWS-1252"?>
    <Cosechas>
      <Cosecha>
        <Fecha>17_08_2019</Fecha>
        <Muestra>
          <Nombre>Amarillo</Nombre>
          <Fecha_Muestra>17_08_2019</Fecha_Muestra>
          <MuestraA>10</MuestraA>
          <SecaA>2</SecaA>
          <Humedad>80.0</Humedad>
          <Materia>20.0</Materia>
        </Muestra>
      </Cosecha>
    </Cosechas>

    Cosecha_Check1.AppendChild(nombre_Lupulo)
    
    Muestra_Check1.AppendChild(nombre_Lupulo)

    nombre_Lupulo.InnerText = CB_Lupulo_Cosecha.Text
    Muestra_A.InnerXml = MuestraA
    Seca_A.InnerXml = SecaA
    Humedad_A.InnerText = Humedad
    Materia_A.InnerText = Materia
    Fecha.InnerText = fecha1
    Fecha_Muestra.InnerText = fecha1
    
    Cosecha_Check1.AppendChild(Fecha)
    Cosecha_Check1.AppendChild(nombre_Lupulo)
    
    Muestra_Check1.AppendChild(nombre_Lupulo)
    Muestra_Check1.AppendChild(Fecha_Muestra)
    Muestra_Check1.AppendChild(Muestra_A)
    Muestra_Check1.AppendChild(Seca_A)
    Muestra_Check1.AppendChild(Humedad_A)
    Muestra_Check1.AppendChild(Materia_A)
    
    Cosecha.AppendChild(Cosecha_Check1)
    Cosecha_Check1.AppendChild(Muestra_Check1)

    sábado, 17 de agosto de 2019 21:20

Respuestas

  • Cosecha_Check1.AppendChild(nombre_Lupulo)
    Muestra_Check1.AppendChild(nombre_Lupulo)

    No puedes hacer eso. Fíjate que estás pasando EL MISMO nodo dos veces al AppendChild para que lo añada en dos sitios distintos. El XmlNode no lo permite, un nodo solo puede tener un único padre.

    Tienes que construir dos clones de nombre_Lupulo y añadir uno de los clones en Cosecha y el otro clon en Muestra. No vale usar la misma referencia en los dos sitios.

    Al clonarlo, recuerda que tiene que ser un "deep clone", no un "shallow clone", es decir hay que clonar los elementos internos, no basta con copiar sus referencias porque sufren del mismo problema (cada uno solo puede tener un único padre). La forma más sencilla de hacer esto es llamar dos veces a la rutina que lo construye, para que te construya dos copias. O si lo quieres clonar de verdad, una forma sencilla de hacer un deep-clone de un nodo XML es crear un nuevo nodo vacío y luego copiarle dentro el .InnerText del nodo que estamos clonando.

    • Marcado como respuesta Diablo_Rojo viernes, 23 de agosto de 2019 19:22
    domingo, 18 de agosto de 2019 7:17

Todas las respuestas

  • Cosecha_Check1.AppendChild(nombre_Lupulo)
    Muestra_Check1.AppendChild(nombre_Lupulo)

    No puedes hacer eso. Fíjate que estás pasando EL MISMO nodo dos veces al AppendChild para que lo añada en dos sitios distintos. El XmlNode no lo permite, un nodo solo puede tener un único padre.

    Tienes que construir dos clones de nombre_Lupulo y añadir uno de los clones en Cosecha y el otro clon en Muestra. No vale usar la misma referencia en los dos sitios.

    Al clonarlo, recuerda que tiene que ser un "deep clone", no un "shallow clone", es decir hay que clonar los elementos internos, no basta con copiar sus referencias porque sufren del mismo problema (cada uno solo puede tener un único padre). La forma más sencilla de hacer esto es llamar dos veces a la rutina que lo construye, para que te construya dos copias. O si lo quieres clonar de verdad, una forma sencilla de hacer un deep-clone de un nodo XML es crear un nuevo nodo vacío y luego copiarle dentro el .InnerText del nodo que estamos clonando.

    • Marcado como respuesta Diablo_Rojo viernes, 23 de agosto de 2019 19:22
    domingo, 18 de agosto de 2019 7:17
  • Gracias por responder Alberto

    Yo lo que busco es esto, uno de ellos que lo tengo que hacer con deep clone?

    el mismo nombre en cosecha y en muestra

    <?xml version="1.0" encoding="WINDOWS-1252"?>
    <Cosechas>
      <Cosecha>
         <Nombre>Amarillo</Nombre>    
         <Fecha>17_08_2019</Fecha>
        <Muestra>
          <Nombre>Amarillo</Nombre>
          <Fecha_Muestra>17_08_2019</Fecha_Muestra>
          <MuestraA>10</MuestraA>
          <SecaA>2</SecaA>
          <Humedad>80.0</Humedad>
          <Materia>20.0</Materia>
        </Muestra>
      </Cosecha>
    </Cosechas>

    domingo, 18 de agosto de 2019 10:00
  • Yo lo que busco es esto, uno de ellos que lo tengo que hacer con deep clone?

    Sí, lo que pasa es que en este caso el deep clone es trivial y coincide con el shallow clone, porque el nodo no contiene dentro nada más que un texto. Si tuviera nodos anidados sería más complicado.

    Una forma muy sencilla de hacer los dos clones es simplemente crearlo dos veces:

    nombre_Lupulo = doc.CreateElement("Nombre")
    nombre_Lupulo.InnerText = CB_Lupulo_Cosecha.Text
    Cosecha_Check1.AppendChild(nombre_Lupulo) nombre_Lupulo = doc.CreateElement("Nombre") nombre_Lupulo.InnerText = CB_Lupulo_Cosecha.Text Muestra_Check1.AppendChild(nombre_Lupulo)

    Fíjate que aunque hemos repetido dos veces las mismas líneas, la variable se ha inicializado con dos elementos distintos, porque hemos llamado dos veces a CreateElement. Por lo tanto, cada uno de los AppenChild recibe como argumento un elemento distinto, aunque ambos elementos por dentro contengan el mismo texto.

    Por supuesto no hace falta que repitas las dos líneas; puedes extraerlas a una subrutina y llamar a la subrutina dos veces.

    domingo, 18 de agosto de 2019 11:45
  • Buenas Alberto lo he solucionado asi no se si es lo correcto pero funciona

     Muestra_Check1.AppendChild(nombre_Lupulo.Clone)

    nombre_Lupulo.InnerText = CB_Lupulo_Cosecha.Text
                        Muestra_A.InnerXml = MuestraA
                        Seca_A.InnerXml = SecaA
                        Humedad_A.InnerText = Humedad
                        Materia_A.InnerText = Materia
                        Fecha.InnerText = fecha1
                        Fecha_Muestra.InnerText = fecha1
    
                        Cosecha_Check1.AppendChild(Fecha)
                        Cosecha_Check1.AppendChild(nombre_Lupulo)
    
                        Muestra_Check1.AppendChild(nombre_Lupulo.Clone)
                        Muestra_Check1.AppendChild(Fecha_Muestra)
                        Muestra_Check1.AppendChild(Muestra_A)
                        Muestra_Check1.AppendChild(Seca_A)
                        Muestra_Check1.AppendChild(Humedad_A)
                        Muestra_Check1.AppendChild(Materia_A)
    
                        Cosecha.AppendChild(Cosecha_Check1)
                        Cosecha_Check1.AppendChild(Muestra_Check1)
                        'Cosecha.AppendChild(Fecha)
                        XmlDocument_Secado_Lupulo.Save("DATOS/Cosechas/Cosechas.xml")
                        MsgBox("La muestra se ha guardado correctamente", MsgBoxStyle.Information)
    !000 gracias

    domingo, 18 de agosto de 2019 21:48