C# 处理XML更新的更好方法
我有一个DataGridView控件,其中一些值是弹出的。 我还有一个xml文件。用户可以更改DataGridView的警告列中的值。这需要保存在xml文件中 下面的程序就是这样做的C# 处理XML更新的更好方法,c#,winforms,linq-to-xml,C#,Winforms,Linq To Xml,我有一个DataGridView控件,其中一些值是弹出的。 我还有一个xml文件。用户可以更改DataGridView的警告列中的值。这需要保存在xml文件中 下面的程序就是这样做的 XDocument xdoc = XDocument.Load(filePath); //match the record foreach (var rule in xdoc.Descendants("Rule")) { foreach (var row in dgRulesMaster.R
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);
XDocument xdoc=XDocument.Load(文件路径);
//符合记录
foreach(xdoc.subjects中的var规则(“规则”))
{
foreach(dgRulesMaster.Rows.Cast()中的变量行)
{
if(rule.Attribute(“id”).Value==row.Cells[0].Value.ToString())
{
rule.Attribute(“action”).Value=row.Cells[3].Value.ToString();
}
}
}
//保存记录
保存(文件路径);
将网格值与XML文档匹配,并为匹配的值更新所需的XML属性
有没有更好的编码方法
谢谢您可以这样做:
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;
var rules=dgRulesMaster.Rows.Cast()
.选择(x=>new{
RuleId=x.Cells[0]。Value.ToString(),
IsWarning=x.Cells[3].Value.ToString()});
变量tuples=xdoc.子体中的n(“规则”)
从规则中的r
其中n.Attribute(“id”).Value==r.RuleId
选择新{Node=n,Rule=r};
foreach(元组中的变量元组)
tuple.Node.Attribute(“action”).Value=tuple.Rule.IsWarning;
这基本上是一样的,只是稍微有点疯狂。这是否“更好”还有争议。我删除的一件事是将
IsWarning
首先转换为string,然后转换为int,最后再转换回string。现在只需将其转换为字符串一次,就可以了。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);
来源:“System.Windows.Forms.DataGridViewRowCollection”不包含“Select”的定义,并且没有接受“System.Windows.Forms.DataGridViewRowCollection”类型的第一个参数的扩展方法“Select”可以使用System.Linq找到Add
到您的cs FiledRulesMaster是DataGridView…它没有“Select”@priyanka.sarkar:Select
是LINQ扩展方法。请参阅更新。我错过了对Cast()
的调用。XML文档是与DataGridView的1:1关系,还是XML文档中存在DataGridView中不存在的其他数据?存在1:1关系那么我的问题是,为什么需要更新文档中的一个或多个值?您可以简单地执行焦土策略,删除现有的xml文档,将DataGridView序列化为xml并保存到文件系统。值应相同否?