#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:
Вы не можете просто изменить имя уже существующего узла. Что вам нужно сделать, это.
- Создайте новый узел с желаемым именем.
- Установите все атрибуты, которые существовали на исходном узле, на новый узел.
- Добавьте новый узел к исходному документу или туда, где вы этого хотите.
- Выберите все дочерние элементы в предыдущем узле и добавьте их к новому узлу.
- Удалите старый узел.
Я должен также сказать вам, что вы не можете переименовать корневой узел, если вы хотите это сделать, вам либо нужно переключить 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