处理XML更新的更好方法

时间:2013-06-03 08:43:49

标签: c# winforms linq-to-xml

我有一个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属性。

有更好的方法对此进行编码吗?

由于

2 个答案:

答案 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