0

我有一个 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);

将网格值与 XML 文档匹配,对于匹配的值,更新所需的 XML 属性。

有没有更好的编码方法?

谢谢

4

2 回答 2

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,最后再转换为字符串。它现在被转换为字符串一次并以这种方式离开。

于 2013-06-03T08:55:45.537 回答
-1

XPath 允许您以强大的功能定位 xml 中的节点。微软使用 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

于 2013-06-03T09:00:06.343 回答