cambiar el nombre del nodo en XML usando XmlDocument

Tengo este xml

<genral>
 <mynode id="1">
    <first id="1.1">
          <nodechild-first id="1.1.1"></nodechild-first>
          <nodechild-seconed id="1.1.2"></nodechild-seconed>
    </first>
    </mynode>
</genral>

Necesito cambiar el nombre de uno de los nodos, por ejemplo, cambiar el nombre de <first> a <f> o las <nodechild-first> a <c-f>

¿Cómo puedo hacerlo usando asp.net (XmlDocument)?

los valores del nodo de nombre de destino y el nodo de nombre nuevo están representados por dos variables de cadena.

Gracias por cualquier ayuda

preguntado el 08 de noviembre de 11 a las 15:11

3 Respuestas

No puede simplemente cambiar el nombre de un nodo ya existente. Lo que debes hacer es.

  1. Cree un nuevo nodo con el nombre deseado.
  2. Establezca todos los atributos que existían en el nodo original en el nuevo nodo.
  3. Agregue el nuevo nodo al documento original o donde lo desee.
  4. Seleccione todos los hijos del nodo anterior y añádalos al nuevo nodo.
  5. Quite el nodo antiguo.

También debo decirle que no puede cambiar el nombre del nodo raíz, si desea hacerlo, debe cambiar make 3. después de 5. o debe insertarlo en un nuevo XMLDocument porque no le permitirá tener dos nodos raíz.

saludos

respondido 08 nov., 11:20

Si no necesita el atributo ID y ningún otro atributo, puede ahorrar mucho trabajo. Lo que puedo ver del atributo ID es que es redundante. Puede obtener esa identificación por lógica. Y si crea una función agradable para "RenameNode ()" que cubra la transferencia de atributos y todos los hijos, creo que mucha gente se alegraría si la compartiera. - Tobías

@baaroz, si te gustan mis respuestas, considera aceptarlas cuando hayas terminado :) - Tobías

Claro, estoy trabajando en eso ahora mismo y en cuanto termine, lo publicaré aquí y luego marcaré tu respuesta. - baaroz

Lo siento malentendido .... Pensando en ello.

Por lo que parece, no se puede cambiar el nombre de un nodo. Puede intentar crear un nuevo archivo XML y darles nombres diferentes allí o crear nuevos nodos.

VIEJO *

Use esto en la clase donde desea hacerlo:

Private Shared ReadOnly XMLFile As String = "LinkToYourXML"
Dim mappingDataXml As System.Xml.XmlDocument = New System.Xml.XmlDocument mappingDataXml.Load(XMLFile)

For Each node As System.Xml.XmlNode In mappingDataXml.SelectNodes("/genral/mynode/first")

node.SelectSongleNode("nodechild-first").InnerText = "The text you want to have in there."

Next

Espero que esto pueda ser de alguna ayuda :)

VIEJO *

respondido 08 nov., 11:19

OK, esta es mi solución para el problema, soy mi xml, no hay el mismo nombre de nodo dos veces (por lo que cada uno debe hacer sus propios cambios, pero la idea principal es la misma

  Sub btnc_click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnc.Click



                Dim xmldoc As XmlDocument = New XmlDocument()
                xmldoc.Load(Server.MapPath("yuor xml path"))



                Dim nodee As XmlNodeList = xmldoc.GetElementsByTagName(tempstr)//path to node

                ' parent element of the element we want to replace
                Dim parentElement As XmlNode = nodee(0).ParentNode


                ' element we want to replace
                Dim oldXmlNode As XmlNode = nodee(0)

                ' new element
                Dim newXmlElement As XmlElement = xmldoc.CreateElement(txtdes.Value)

                Dim temp As XmlAttribute = oldXmlNode.Attributes("id")//adding attirbute old->new


                newXmlElement.Attributes.Append(temp)


                Dim node As XmlNode = oldXmlNode.FirstChild node

                buildtree(newXmlElement, xmldoc, node)//copy first child to new 

                node = node.NextSibling /taking next Sibling 
                While Not IsNothing(node)//while node has brothers

                    buildtree(newXmlElement, xmldoc, node)/copy Sibling old->new
                    node = node.NextSibling //next Sibling 

                End While


                parentElement.ReplaceChild(newXmlElement, oldXmlNode)// making the switch




                xmldoc.Save(Server.MapPath("path"))




            End Sub


            Sub buildtree(ByVal newnode As XmlNode, ByVal xmldoc As XmlDocument, ByVal oldxmlnode As XmlNode)

                newnode.AppendChild(xmldoc.ImportNode(oldxmlnode, True))




            End Sub

respondido 09 nov., 11:19

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.