2012-07-30 128 views
0

我正在向我的分幅添加一個新的複選框,並且需要將其值保存到設置文件中。 我想用下面的代碼來做到這一點:如果XML元素不存在,則添加XML元素

private void CloseDisconnectedCbx_CheckedChanged(object sender, EventArgs e) 
{ 
    XDocument doc = XDocument.Load(BotsFile); 
    var savedBots = doc.Descendants("SavedBots") 
     .Where(p => p.Element("BotName").Value.ToLower() 
        == SelectBotBox.SelectedItem.ToString().ToLower()) 
     .Elements("CloseDisconnected").FirstOrDefault(); 
    if (savedBots == null) 
    { 
     try 
     { 
      doc.Descendants("SavedBots") 
       .Where(p => p.Element("BotName").Value.ToLower() 
          == SelectBotBox.SelectedItem.ToString().ToLower()) 
       .FirstOrDefault() 
       .Add(new XElement("CloseDisconnected", 
        Convert.ToInt32(CloseDisconnectedCbx.Checked))); 
      doc.Save(BotsFile); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
} 

它確實增加了新的元素,但是,它看起來像這樣:

<CloseDisconnected/> VALUE 

它永遠不會結束元素的結束。 我的代碼錯了嗎,還是我忘記了一些東西?

只有在XML文件中找不到元素時,纔會觸發此代碼。 如果是,更改將由另一個按鈕處理。

+0

顯示,增​​加了closedisconnected請 – HatSoft 2012-07-30 14:00:48

+3

真的很難讀那些oneliners的代碼,我認爲將有助於可讀性低,如果它被分成幾個線(如提取搜索值分離變量,要添加的元素,等等。 )。 – Giedrius 2012-07-30 14:02:30

+0

@HatSoft用於添加CloseDisconnected的代碼位於Try子句內。 – Rickard 2012-07-30 14:06:35

回答

0
Check parenthesis in your code 

XElement xElem = new XElement("root"); 
xElem.Add(new XElement("CloseDisconnected", "123")); // generates what you expect 
xElem.Add(new XElement("CloseDisconnected"), "123"); // generates what you see 
+0

那麼那些線上人員做了他們的惡作業:) – Giedrius 2012-07-30 14:13:24

+0

@Giedrius Ideed。獲得的經驗:p – Rickard 2012-07-30 14:24:15

+0

@ L.B謝謝! :) – Rickard 2012-07-30 14:24:31