2012-07-24 68 views
1

我在使用C#将元素添加到XML文件时遇到了问题。我在我的diff目录中有我的App.config文件。所以我使用LINQ来检索我想要的值并从TextBoxes中设置值。使用C#添加键值XML元素

<appSettings> 
    <add key="Something" value="false" /> 
    <add key="UserName" value="user0001" /> 
    <add key="Password" value="123456" /> 
    <add key="Environment" value="" /> 
    <add key="DBUserName" value="DBname23" /> 
    <add key="DBPassword" value="12345678" /> 
</appSettings> 

以上是我的XML文件。我能够检索UserNamePassword的值并将其设置为加密的值。下面我做的方式显示:

var doc1 = XDocument.Load(appConfigFile1); 

var list1 = from appNode in doc1.Descendants("appSettings").Elements() 
      where appNode.Attribute("key").Value == "UserName" 
      select appNode; 
var list2 = from appNode in doc1.Descendants("appSettings").Elements() 
      where appNode.Attribute("key").Value == "Password" 
      select appNode; 
var list3 = from appNode in doc1.Descendants("appSettings").Elements() 
      where appNode.Attribute("key").Value == "DBUserName" 
      select appNode; 
var list4 = from appNode in doc1.Descendants("appSettings").Elements() 
      where appNode.Attribute("key").Value == "DBPassword" 
      select appNode; 
var element1 = list1.FirstOrDefault(); 
var element2 = list2.FirstOrDefault(); 
var element3 = list3.FirstOrDefault(); 
var element4 = list4.FirstOrDefault(); 
element1.Attribute("value").SetValue(txtbox1); 
element2.Attribute("value").SetValue(txtbox2); 
element3.Attribute("value").SetValue(txtbox3); 
element4.Attribute("value").SetValue(txtbox4); 
doc1.Save(appConfigFile1); 

的要求是这样的,如果从XML文件中的元素之一被删除时,我应该能够创建具有键和值相同的元素。

实施例:请与下面比较上面的XML:

<appSettings> 
    <add key="HasUI" value="false" /> 
    <add key="Password" value="123456" /> 
    <add key="Environment" value="" /> 
    <add key="DBUserName" value="DBname23" /> 
    <add key="DBPassword" value="12345678" /> 
</appSettings> 

上方元件用户名缺失。那么,如何创建一个XML元素,如 <add key="UserName" value="" />并将其设置为XML文件中的相同位置?

我在C#中加载XML文件时遇到的错误是NullReferenceException。

请帮帮我。

+0

为什么它必须是为了?我只是在我的XML戳(我实际上做我的PowerShell的这一点) – jcolebrand 2012-07-24 21:16:14

+0

你想改变app.config或只是把一个默认值,当你没有在app.config中的值? – Clueless 2012-07-24 21:18:36

+0

@jcolebrand嘿!我不需要这样做,我已经编辑了这个问题 – user1410658 2012-07-24 21:20:28

回答

3

为了上帝的缘故,任何你多次做的事都应该是一个功能!

function UpdateOrCreateAppSetting(XMLDocument doc, string key, string value) 
{ 
    var list = from appNode in doc.Descendants("appSettings").Elements() 
      where appNode.Attribute("key").Value == key 
      select appNode; 
    var e = list.FirstOrDefault(); 

    // If the element doesn't exist, create it 
    if (e == null) { 
     e = doc.CreateElement("add") 
     e.Attributes.Append("key", key); 
     e.Attributes.Append("value", value); 
     doc.Descendants("appSettings").AppendChild(e); 

    // If the element exists, just change its value 
    } else { 
     e.Attribute("value").SetValue(value); 
    } 
} 

现在调用函数四次,你很好。 ;)

+0

太棒了...谢谢:) – user1410658 2012-07-25 10:41:38

+0

修复了函数中的拼写错误。 – 2012-07-25 16:48:28

+0

@TedSpence如果我想使用Xdocument,该怎么办? – FaizanRabbani 2015-10-12 13:00:32

1

,如果你只想把默认值时,在app.config不能如您所愿,你可以做这样的事情:

var doc1 = XDocument.Load(appConfigFile1); 

       var list1 = from appNode in doc1.Descendants("appSettings").Elements() 
          where appNode.Attribute("key").Value == "UserName" 
          select appNode; 
       var list2 = from appNode in doc1.Descendants("appSettings").Elements() 
          where appNode.Attribute("key").Value == "Password" 
          select appNode; 
       var list3 = from appNode in doc1.Descendants("appSettings").Elements() 
          where appNode.Attribute("key").Value == "DBUserName" 
          select appNode; 
       var list4 = from appNode in doc1.Descendants("appSettings").Elements() 
          where appNode.Attribute("key").Value == "DBPassword" 
          select appNode; 
       // the values of missing elements are null so you can use the "??" operator            //hat put something else when you have null 
       var element1 = list1.FirstOrDefault() ?? "your default value"; 
       var element2 = list2.FirstOrDefault() ?? "your default value"; 
       var element3 = list3.FirstOrDefault() ?? "your default value"; 
       var element4 = list4.FirstOrDefault() ?? "your default value"; 
       element1.Attribute("value").SetValue(txtbox1); 
       element2.Attribute("value").SetValue(txtbox2); 
       element3.Attribute("value").SetValue(txtbox3); 
       element4.Attribute("value").SetValue(txtbox4); 
       doc1.Save(appConfigFile1); 
+0

对不起巴迪!我想改变appconfig.Not只是把defualt ...我的坏....我得到一个空引用例外 element1.Attribute(“value”)。SetValue(txtbox1); – user1410658 2012-07-24 22:17:14

0

的NullReference是在

element1.Attribute("value").SetValue(txtbox1);

未来

声明,不是吗?上面的FirstOrDefault已将element1留为空。我想你想在访问Attribute属性之前测试null;如果未通过该测试,则可以提供默认值。

+0

是的......绝对多数民众赞成在发生......是的,我是dng的......但我正在检查元素1中的null。在这种情况下,我想写的ac#脚本,可以添加属性为该AppSettings – user1410658 2012-07-24 22:13:14