2012-07-24 86 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