none
Problemas al insertar nuevo nodo en un XML desde VB.NET RRS feed

  • Pregunta

  • Hola buenas tardes, deseo poder insertar un nodo en un archivo XML, consegui un ejemplito y lo estoy adaptando a mi programa, pero nada, les coloco el ejemplo:

    esta es la estructura de mi XML:


    <?xml version="1.0" encoding="UTF-8"?>
    <eventos>
      <evento>
        <sala>1</sala>
        <nombre_sala>Salón Aranjuez</nombre_sala>
        <fecha>08/11/2016</fecha>
        <hora>15/07/2017 18:00:00</hora>
        <horaFin>15/07/2017 19:30:00</horaFin>
        <titulo>Orales</titulo>
        <autor>dddd</autor>
        <comentario>&lt;p&gt;&lt;span style="background-color:#FF8C00"&gt;COMUNICACIONES ORALES: COLOPROCTOLOG&amp;Iacute;A - MISCEL&amp;Aacute;NEA III&lt;/span&gt;&lt;/p&gt;
    </comentario>
        <imagen>images/</imagen>
      </evento>
     
      <evento>
        <sala>1</sala>
        <nombre_sala>Salón Aranjuez</nombre_sala>
        <fecha>08/11/2016</fecha>
        <hora>18:00</hora>
        <horaFin>19:30</horaFin>
        <titulo>Orales Coloproctología Miscelánea III</titulo>
        <autor>
        </autor>
        <comentario><![CDATA[<p><span style="background-color:#FF8C00">COMUNICACIONES ORALES: COLOPROCTOLOG&Iacute;A - MISCEL&Aacute;NEA III</span></p>
    ]]></comentario>
        <imagen>images/</imagen>
      </evento>

    </eventos>

    Aqui la funcion que genera el nuevo nodo para mi XML:

    Private Function CrearNodoXml(Sala As String, strnombre_sala As String, strfecha As String, strhora As String, strhorafin As String, strTitulo As String, strautor As String, strComentarios As String, strimagen As String) As XmlNode
        
            Dim documento As New XmlDocument

            Dim Evento As XmlElement = documento.CreateElement("evento")

            'Creamos el elemento idEmpleado.
            Dim idSala As XmlElement = documento.CreateElement("sala")
            idSala.InnerText = Sala
            Evento.AppendChild(idSala)

            'Creamos el elemento nombre.
            Dim nombre_sala As XmlElement = documento.CreateElement("nombre_sala")
            nombre_sala.InnerText = strnombre_sala
            Evento.AppendChild(nombre_sala)

            'Creamos el elemento apellidos.
            Dim fecha As XmlElement = documento.CreateElement("fecha")
            fecha.InnerText = strfecha
            Evento.AppendChild(fecha)

            'Creamos el elemento numeroSS.
            Dim hora As XmlElement = documento.CreateElement("hora")
            hora.InnerText = strhora
            Evento.AppendChild(hora)

            'Creamos el elemento telefonos.
            Dim horafin As XmlElement = documento.CreateElement("horaFin")
            horafin.InnerText = strhorafin
            Evento.AppendChild(horafin)

            'Creamos el elemento fijo.
            Dim Titulo As XmlElement = documento.CreateElement("titulo")
            Titulo.InnerText = strTitulo
            Evento.AppendChild(Titulo)


            Dim autor As XmlElement = documento.CreateElement("autor")
            autor.InnerText = strTitulo
            Evento.AppendChild(autor)

            Dim comentarios As XmlElement = documento.CreateElement("comentario")
            comentarios.InnerText = strComentarios
            Evento.AppendChild(comentarios)

            Dim imagen As XmlElement = documento.CreateElement("imagen")
            imagen.InnerText = strimagen
            Evento.AppendChild(imagen)

            Return Evento
        End Function


    aqui esta el monento en que realizo o intento registrar el nodo, generandome un error "El nodo que desea insertar pertenece a otro contexto de documento.":

      Private Sub InsertarXml()
         
            Try
                Dim documento As New XmlDocument
                Dim archivo As String = Application.StartupPath & "\calendario.xml"
                documento.Load(archivo)


                Dim evento As XmlNode = Me.CrearNodoXml(txtnsala.Text, txtSala.Text, dtmFecha.Text, dtpHoraInicio.Text, dtpHoraFin.Text, txtTitulo.Text, txtAutor.Text, txtComentarios.Text, Label1.Text)


                Dim nodoRaiz As XmlNode = documento.DocumentElement


                nodoRaiz.InsertAfter(evento, nodoRaiz.LastChild)

                documento.Save(archivo)

            Catch ex As Exception

            End Try
        End Sub






    domingo, 16 de julio de 2017 18:37

Respuestas

  • Vale, entonces ya está clara la causa del error: En la línea mencionada intentas agregar un nuevo nodo que has creado dentro de CrearNodoXml. Pero ese nodo pertenece a otro documento, que se construye con "new XmlDocument" dentro de CrearNodoXml. Eso no es lícito con un XmlDocument. para añadir un nodo a un XmlDocument, es necesario que el CreateElement se ejecute sobre el mismo XmlDocument al que vamos a añadirlo, no vale ejecutarlo sobre otro XmlDocument distinto.

    La solución más directa consiste en pasar documento como argumento a CrearNodoXml, y usar ese XmlDocument en lugar de crear otro XmlDocument nuevo usando New.

    lunes, 17 de julio de 2017 14:42
  • ¿Un ejemplo? Si solo es algo tan tonto como esto:

    Donde tienes esto:

    Private Function CrearNodoXml(Sala As String, strnombre_sala As String, strfecha As String, strhora As String, strhorafin As String, strTitulo As String, strautor As String, strComentarios As String, strimagen As String) As XmlNode
          
    Cámbialo por esto:

    Private Function CrearNodoXml(Sala As String, strnombre_sala As String, strfecha As String, strhora As String, strhorafin As String, strTitulo As String, strautor As String, strComentarios As String, strimagen As String, documento As XmlDocument) As XmlNode

    y quita de dentro el Dim documento As New XmlDocument.

    Y luego, cuando lo llames, ponle al final ,documento:

    Dim evento As XmlNode = Me.CrearNodoXml(txtnsala.Text, txtSala.Text, dtmFecha.Text, dtpHoraInicio.Text, dtpHoraFin.Text, txtTitulo.Text, txtAutor.Text, txtComentarios.Text, Label1.Text, documento)

    Si te fijas con un poco de cuidado verás que eso es exactamente lo que decía la respuesta de "pasar documento como argumento a CrearNodoXml, y usar ese XmlDocument en lugar de crear otro XmlDocument nuevo usando New".

    lunes, 17 de julio de 2017 20:24

Todas las respuestas

  • Casi seguro que el error se debe estar ocurriendo dentro de CrearNodoXml. Quita provisionalmente el Try...Catch para que se te pare el debugger en el sitio exacto del error, y si no te resulta evidente la causa del mismo, señálanos aquí la línea exacta en la que ocurre y trataremos de solucionarlo.
    lunes, 17 de julio de 2017 6:03
  • la linea donde se inicial el error es donde esta el punto de interrupcion, es alli donde esta el problema
    lunes, 17 de julio de 2017 6:46
  • Vale, entonces ya está clara la causa del error: En la línea mencionada intentas agregar un nuevo nodo que has creado dentro de CrearNodoXml. Pero ese nodo pertenece a otro documento, que se construye con "new XmlDocument" dentro de CrearNodoXml. Eso no es lícito con un XmlDocument. para añadir un nodo a un XmlDocument, es necesario que el CreateElement se ejecute sobre el mismo XmlDocument al que vamos a añadirlo, no vale ejecutarlo sobre otro XmlDocument distinto.

    La solución más directa consiste en pasar documento como argumento a CrearNodoXml, y usar ese XmlDocument en lugar de crear otro XmlDocument nuevo usando New.

    lunes, 17 de julio de 2017 14:42
  • Oy gracias, pero no me lo puedes agregar un ejemplito a tu explicacion? ;-)
    lunes, 17 de julio de 2017 18:28
  • ¿Un ejemplo? Si solo es algo tan tonto como esto:

    Donde tienes esto:

    Private Function CrearNodoXml(Sala As String, strnombre_sala As String, strfecha As String, strhora As String, strhorafin As String, strTitulo As String, strautor As String, strComentarios As String, strimagen As String) As XmlNode
          
    Cámbialo por esto:

    Private Function CrearNodoXml(Sala As String, strnombre_sala As String, strfecha As String, strhora As String, strhorafin As String, strTitulo As String, strautor As String, strComentarios As String, strimagen As String, documento As XmlDocument) As XmlNode

    y quita de dentro el Dim documento As New XmlDocument.

    Y luego, cuando lo llames, ponle al final ,documento:

    Dim evento As XmlNode = Me.CrearNodoXml(txtnsala.Text, txtSala.Text, dtmFecha.Text, dtpHoraInicio.Text, dtpHoraFin.Text, txtTitulo.Text, txtAutor.Text, txtComentarios.Text, Label1.Text, documento)

    Si te fijas con un poco de cuidado verás que eso es exactamente lo que decía la respuesta de "pasar documento como argumento a CrearNodoXml, y usar ese XmlDocument en lugar de crear otro XmlDocument nuevo usando New".

    lunes, 17 de julio de 2017 20:24
  • Gracias, se nota! que sabes de lo que conoces muchisimo! y lo expresas con gran humildad! y humanidad.
    miércoles, 19 de julio de 2017 11:43