2017-09-25 1 views
1

J'ai le fichier XML suivant. Je veux copier un nouveau "Test" et changer l'identifiant du test. Comment est-ce possible?Copier le noeud et modifier la valeur d'un attribut

Je peux déjà copier les nœuds, malheureusement pas sur la position correcte (voir images) et je ne peux pas non plus changer l'ID. Quelqu'un at-il une solution pour moi?

Avant:
XML Now

Après:
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

Voulez-vous dire la "Avant" est correct? Parce que le "Après" a plus de sens. – Crowcoder

+0

A la fin, je voulais le "Après". Donc le "Après" est correct. –

+0

J'ai compris. Mais voulez-vous vraiment que le "Test" augmente? Test1, Test2, etc.? Il serait compliqué de consommer vos données pour le faire, ils devraient tous être "Test". – Crowcoder

Répondre

0

Voici un exemple d'utilisation System.Xml.Linq.XDocument qui est une API beaucoup plus facile que XmlDocument:

//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

Merci pour votre solution, ça marche !! ;) Mais comment puis-je rechercher l'ID, si je n'ai pas un nombre exact? J'ai donc un numéro aléatoire dans l'ID, comment puis-je trouver le bon endroit? –

+0

Si vous voulez dire que vous voulez que le nouveau nœud soit en bas, alors utilisez 'Last()' au lieu de 'First (d => d ......)'. Si vous devez rechercher un nœud, vous devrez en connaître quelque chose qui est unique à chacun d'entre eux. – Crowcoder