C# 处理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

我有一个DataGridView控件,其中一些值是弹出的。 我还有一个xml文件。用户可以更改DataGridView的警告列中的值。这需要保存在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);
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并保存到文件系统。值应相同否?