2017-09-25 2 views
1

Ich habe die folgende XML-Datei. Ich möchte einen neuen "Test" kopieren und die ID des Tests ändern. Wie ist es möglich?Knoten kopieren und Wert eines Attributs ändern

Ich kann die Knoten schon kopieren, leider nicht an der richtigen Stelle (siehe Bilder) und ich kann auch die ID nicht ändern. Hat jemand eine Lösung für mich?

Vorher:
XML Now

Nach:
XML After

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(Before.xml"); 

XmlNode Set = xmldoc.DocumentElement; 
string strXmlQuery = "/Toolings/Testing/Test1"; 

XmlNode NodeToCopy = Set.SelectSingleNode(strXmlQuery); 
XmlNode NewNode = NodeToCopy.CloneNode(true); 

NodeToCopy.AppendChild(NewNode); 

Set.InsertAfter(NewNode, Set.LastChild); 

XPathNavigator navigator = xmldoc.CreateNavigator(); 

navigator.MoveToRoot(); 
navigator.MoveToFirstChild(); 
navigator.MoveToFirstChild(); 
navigator.MoveToFirstChild(); 
navigator.MoveToFirstChild(); 
navigator.SetValue("5678"); 

xmldoc.Save(After.xml"); 
+0

Behaupten Sie, die "Vorher" ist richtig? Weil das "After" mehr Sinn macht. – Crowcoder

+0

Am Ende wollte ich das "After". Also das "Nachher" ist richtig. –

+0

Bekam es. Aber willst du wirklich den "Test" erhöhen? Test1, Test2, etc ..? Es wäre kompliziert, Ihre Daten zu verbrauchen, um dies zu tun, sollten sie alle nur "Test" sein. – Crowcoder

Antwort

0

Hier ist ein Beispiel System.Xml.Linq.XDocument mit denen eine viel einfachere API als XmlDocument ist:

//You can also use Load(), this is just so I didn't have to make a file 
XDocument doc = XDocument.Parse("<Toolings><Testing><Test><ID>1234</ID></Test></Testing></Toolings>"); 

//Grab the first Test node (change the predicate if you have other search criteria) 
var elTest = doc.Descendants().First(d => d.Name == "Test"); 

//Copy the node, only necessary if you don't know the structure at design time 
XElement el = new XElement(elTest); 

el.Element("ID").Value = "5678"; 

//inject new node 
elTest.AddAfterSelf(el); 

doc.Save("After.xml"); 
+0

Danke für deine Lösung, es funktioniert !! ;) Aber wie kann ich nach der ID suchen, wenn ich keine genaue Nummer habe? Also habe ich eine Zufallszahl in der ID, wie kann ich den richtigen Ort finden? –

+0

Wenn Sie meinen, dass Sie den neuen Knoten am unteren Rand haben wollen, dann verwenden Sie 'Last()' anstelle von 'First (d => d ......)'. Wenn Sie einen Knoten durchsuchen müssen, müssen Sie etwas darüber wissen, das für alle von ihnen einzigartig ist. – Crowcoder

Verwandte Themen