我在使用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文件。我可以检索UserName
和Password
的值,并使用加密值设置它。我正在做的方式如下所示:
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 :(得分: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;如果测试失败,您可以提供默认值。