2017-03-05 64 views
1

我希望刪除然後添加新的節點/值到Xml文件。使用XPath刪除和寫入C#中的新節點

這裏是XML內容的縮減版本:

<?xml version="1.0" encoding="utf-8"?> 
<NinjaTrader> 
    <OpenWorkspaces> 
     <OpenWorkspace>OldWorkspace1</OpenWorkspace> 
     <OpenWorkspace>OldWorkspace2</OpenWorkspace> 
    </OpenWorkspaces> 
</NinjaTrader> 

所以基本上我想刪除OpenWorkspaces的所有兒童:

<?xml version="1.0" encoding="utf-8"?> 
<NinjaTrader> 
    <OpenWorkspaces> 
    </OpenWorkspaces> 
</NinjaTrader> 

然後我想增加新的節點和值。 「NewWorkspace1到NewWorkspace4」的值將來自一個字符串數組。

<?xml version="1.0" encoding="utf-8"?> 
<NinjaTrader> 
    <OpenWorkspaces> 
     <OpenWorkspace>NewWorkspace1</OpenWorkspace> 
     <OpenWorkspace>NewWorkspace2</OpenWorkspace> 
     <OpenWorkspace>NewWorkspace3</OpenWorkspace> 
     <OpenWorkspace>NewWorkspace4</OpenWorkspace> 
    </OpenWorkspaces> 
</NinjaTrader> 

我想刪除的孩子再結交新朋友的原因是因爲我可能會從原來的不同數量的人如上面的例子所示。

var xdoc = XDocument.Load(myPath); 
xdoc.XPathSelectElements("//OpenWorkspaces").Descendants("OpenWorkspace").Remove(); 

所有這一切確實是這樣的:

所以,我一直在使用 '刪除' 下手試圖

<NinjaTrader> 
    <OpenWorkspaces /> 
</NinjaTrader> 

我在C#中,但不是XML還算稱職。我花了幾個小時試驗XPath擴展,但對結果感到有些沮喪。所以向正確的方向推動將是非常受歡迎的。謝謝。

回答

0

由於您已完成刪除部分,因此可以通過將字符串數組投影到一系列XElement s並將結果傳遞給XElement.Add()方法來完成添加新元素。下面是一個最小的,但完整的例子:

var raw = @"<NinjaTrader> 
    <OpenWorkspaces> 
     <OpenWorkspace>OldWorkspace1</OpenWorkspace> 
     <OpenWorkspace>OldWorkspace2</OpenWorkspace> 
    </OpenWorkspaces> 
</NinjaTrader>"; 
var xdoc = XDocument.Parse(raw); 
List<string> newValues = new List<string>{"NewWorkspace1","NewWorkspace2","NewWorkspace3"}; 

var ow = xdoc.XPathSelectElement("//OpenWorkspaces"); 

ow.Descendants("OpenWorkspace").Remove(); 
ow.Add(newValues.Select(o => new XElement("OpenWorkspace", o))); 

Console.WriteLine(xdoc.ToString()); 

dotnetfiddle demo

+0

作品一種享受,謝謝! – Sim22

+0

我簡單地替換:var xdoc = XDocument.Load(myPath);爲var生。我標出了你的答案,但由於我沒有足夠的聲望,它不會顯示給我。 – Sim22

+0

沒問題。勾選複選標記就足夠了。如果你願意的話,一旦你有足夠的代表,你總是可以回到upvote – har07