我有一个DataGridView控件,其中一些值被弹出。 而且我还有一个xml文件。用户可以更改DataGridView.And的警告列中需要保存在xml文件中的值。
以下程序只是完成工作
XDocument xdoc = XDocument.Load(filePath);
//match the record
foreach (var rule in xdoc.Descendants("Rule"))
{
foreach (var row in dgRulesMaster.Rows.Cast<DataGridViewRow>())
{
if (rule.Attribute("id").Value == row.Cells[0].Value.ToString())
{
rule.Attribute("action").Value = row.Cells[3].Value.ToString();
}
}
}
//save the record
xdoc.Save(filePath);
将网格值与XML文档匹配,并匹配匹配的值,更新所需的XML属性。
有更好的方法对此进行编码吗?
由于
答案 0 :(得分:1)
你可以这样做:
var rules = dgRulesMaster.Rows.Cast<DataGridViewRow>()
.Select(x => new {
RuleId = x.Cells[0].Value.ToString(),
IsWarning = x.Cells[3].Value.ToString() });
var tuples = from n in xdoc.Descendants("Rule")
from r in rules
where n.Attribute("id").Value == r.RuleId
select new { Node = n, Rule = r };
foreach(var tuple in tuples)
tuple.Node.Attribute("action").Value = tuple.Rule.IsWarning;
这基本相同,只是LINQ-y多一点。这是否“更好”是值得商榷的。我删除的一件事是首先将IsWarning
转换为字符串,然后转换为int,最后转换回字符串。它现在被转换为字符串一次并离开那条路。
答案 1 :(得分:-1)
XPath允许您使用很多功能来定位xml中的节点。 Microsoft使用XPathNavigator修改XML文件的示例如下:
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
if (nav.Value == "11.99")
{
nav.SetValue("12.99");
}
}
Console.WriteLine(navigator.OuterXml);
来源:http://msdn.microsoft.com/en-us/library/zx28tfx1(v=vs.80).aspx