【问题标题】:How to combine and update two xml files with LINQ c#如何使用 LINQ c# 合并和更新两个 xml 文件
【发布时间】:2016-02-02 15:58:34
【问题描述】:

我想合并这些简单的xml文件:

result2.xml:

<?xml version="1.0" encoding="utf-8"?>
<Sports>
  <Sport id="1">
  </Sport>
</Sports>

result3.xml

<?xml version="1.0" encoding="utf-8"?>
<Sports>
  <Sport id="1">
  </Sport>
  <Sport id="2">   
  </Sport>
</Sports>

我正在尝试使用该 C# 代码:

static void Main()
{
  XDocument xml1 = XDocument.Load("result2.xml");
  XDocument xml2 = XDocument.Load("result3.xml");

  var combinedUnique = xml1.Descendants("Sport")
                     .Union(xml2.Descendants("Sport"));

  foreach (var item in combinedUnique)
  {
     Console.WriteLine(item);
  }
}

我期望的结果是:

 <?xml version="1.0" encoding="utf-8"?>
    <Sports>
      <Sport id="1">
      </Sport>
      <Sport id="2">   
      </Sport>
    </Sports>

但我明白了:

 <?xml version="1.0" encoding="utf-8"?>
    <Sports>
      <Sport id="1">
      </Sport>                                                                                           
      <Sport id="1">
      </Sport>
      <Sport id="2">   
      </Sport>
    </Sports>

您能否建议如何使此 C# 代码适用于这种特殊情况? 我为数组尝试过,它正在工作 提前致谢!

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    因此,即使元素的id 属性共享相同的值,它们仍然是不同的对象,不会被Distinct 或Union 视为相等,因为某些任意属性值相等。

    如果你需要做一个“distinctBy”,你可以使用以下模式(对有问题的属性进行分组,然后从每个组中选择第一个元素):

    var combinedUnique = xml1.Descendants("Sport")
                             .Concat(xml2.Descendants("Sport"))
                             .GroupBy(xe => (int)xe.Attribute("id"))
                             .Select(g => g.First());
    

    请注意,我还将Union 替换为Concat,因为Union 完成的额外(基于集合的插入)工作在这种情况下无效,因此我们可以使用更高效的Concat(联合所有)。

    将其包装到扩展方法中可能是有意义的:

    public static class LinqEx
    {
        public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src, 
                                                         Func<T, TKey> keySelector)
        {
            return src.GroupBy(keySelector).Select(g => g.First());
        }
    }
    

    所以现在你可以:

    var combinedUnique = xml1.Descendants("Sport")
                             .Concat(xml2.Descendants("Sport"))
                             .DistinctBy(xe => (int)xe.Attribute("id"));
    

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2012-01-02
      相关资源
      最近更新 更多