1

I have a problem with adding an element to an XML file using C#. I have my App.config files somewhere in my diff directory. So I am using LINQ to retrieve the values I want and to set the value from TextBoxes.

<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>

The above is my XML file. I am able to retrieve the values of UserName and Password and set it with the encrypted ones. The way I am doing is shown below:

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);

The requirements are such that if one of the elements from the XML file is deleted, I should be able to create a same element with key and value.

Example: Please compare the above xml with the below:

<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>

Above the element Username is missing. So how can I create an XML element like <add key="UserName" value="" /> and set that to that same place in XML file?

The error I am getting when I load the XML file in C# is NullReferenceException.

Please help me.

4

3 回答 3

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);
    }
}

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

于 2012-07-24T22:45:59.243 回答
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);
于 2012-07-24T21:22:22.920 回答
0

NullReference 即将到来

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

声明,不是吗?上面的 FirstOrDefault 使 element1 为空。我认为您想在访问 Attribute 属性之前测试 null ;未能通过该测试,然后您可以提供您的默认值。

于 2012-07-24T21:22:56.450 回答