使用C#添加键,值XML元素

时间:2012-07-24 21:15:13

标签: c# xml winforms linq

我在使用C#向XML文件添加元素时遇到问题。我在diff目录中的某个地方有App.config个文件。所以我使用LINQ来检索我想要的值并从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>

以上是我的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。

请帮帮我。

3 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分: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);

答案 2 :(得分:0)

NullReference正在

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

声明,不是吗?上面的FirstOrDefault将element1保留为null。我想你想在访问Attribute属性之前测试null;如果测试失败,您可以提供默认值。