измените имя узла в XML с помощью XmlDocument

#asp.net #xml #xmldocument

#asp.net #xml #xmldocument

Вопрос:

У меня есть этот 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>
  

Мне нужно переименовать имя одного из узлов, например, изменить имя <first> на <f>
или <nodechild-first> для <c-f>

Как я могу это сделать с помощью asp.net (XmlDocument) .

значения узла с именем назначения и узла с новым именем представлены двумя строковыми переменными.

Спасибо за любую помощь

Ответ №1:

Вы не можете просто изменить имя уже существующего узла. Что вам нужно сделать, это.

  1. Создайте новый узел с желаемым именем.
  2. Установите все атрибуты, которые существовали на исходном узле, на новый узел.
  3. Добавьте новый узел к исходному документу или туда, где вы этого хотите.
  4. Выберите все дочерние элементы в предыдущем узле и добавьте их к новому узлу.
  5. Удалите старый узел.

Я должен также сказать вам, что вы не можете переименовать корневой узел, если вы хотите это сделать, вам либо нужно переключить make 3. после 5., либо вам нужно вставить его в новый XmlDocument, потому что это не позволит вам иметь два корневых узла.

С уважением

Комментарии:

1. Если вам не нужен атрибут ID и никакие другие атрибуты, вы можете сэкономить много работы. Что я вижу в атрибуте ID, так это то, что он избыточен. Вы можете получить этот идентификатор с помощью логики. И если вы создадите хорошую функцию для «RenameNode ()», которая охватывает передачу атрибута и всех дочерних элементов, я думаю, многие люди были бы рады, если бы вы поделились ею.

2. @baaroz если вам нравится мой answear, пожалуйста, подумайте о том, чтобы принять его, когда закончите 🙂

3. конечно, я работаю над этим прямо сейчас, и как только я закончу, я опубликую это здесь, а затем отмечу ваш ответ.

Ответ №2:

Извините, я неправильно понял…. Думаю об этом.

Судя по всему, вы не можете изменить имя узла. Вы могли бы попробовать создать новый XML-файл и дать им там другие имена или создать новые узлы.

СТАРЫЙ *

Используйте это в классе, в котором вы хотите это сделать:

 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
  

Надеюсь, это может быть какой-либо помощью 🙂

СТАРЫЙ *

Ответ №3:

Хорошо, это мое решение проблемы, в моем xml дважды не встречается одно и то же имя узла (так что каждый должен вносить свои собственные изменения, но основная идея та же

   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