2017-09-25 46 views
1

私は以下のXMLファイルを持っています。私は新しい "テスト"をコピーして、テストのIDを変更したいと思います。どのように可能ですか?ノードのコピーと属性値の変更

私は既にノードをコピーできますが、残念ながら正しい位置にはありません(画像を参照)。またIDを変更することもできません。 誰でも私の解決策がありますか?後
XML Now

::前

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

あなたが言っています"Before"は正しいですか? "After"は意味があるからです。 – Crowcoder

+0

最後に、私は "After"を望んでいました。だから、 "後"が正しいです。 –

+0

入手しました。しかし、あなたは本当に "テスト"を増やしたいですか? Test1、Test2など。それを行うためにデータを消費するのは難しく、すべてが「テスト」でなければなりません。 – Crowcoder

答えて

0

XmlDocumentよりもはるかに簡単APIであるSystem.Xml.Linq.XDocumentを使用した例です。

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

あなたのおかげで解決策は、それは動作します! ;)しかし、正確な番号を持っていないと、IDを検索するにはどうしたらいいですか? IDに乱数があるので、どうすれば正しい場所を見つけることができますか? –

+0

新しいノードを下にしたい場合は、 'First(d => d ......)'の代わりに 'Last()'を使います。ノードを検索する必要がある場合は、そのノードのすべてに固有のものを知る必要があります。 – Crowcoder

関連する問題