2012-07-30 87 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