C# 使用Linq合并具有重复条目的XML

C# 使用Linq合并具有重复条目的XML,c#,xml,linq,C#,Xml,Linq,我有两个XML配置文件,一个位于web上的全局XML文件,另一个存在于本地。每个都可能包含唯一的元素。本地配置文件可能包含全局配置中存在的项的其他属性。我希望将这两个列表合并在一起,以便本地配置比全局配置更精确。例如 本地配置文件: <Applications> <Application name="Mozilla Firefox 24.2.0" default="true"/> <Application name="Cisco AnyConne

我有两个XML配置文件,一个位于web上的全局XML文件,另一个存在于本地。每个都可能包含唯一的元素。本地配置文件可能包含全局配置中存在的项的其他属性。我希望将这两个列表合并在一起,以便本地配置比全局配置更精确。例如

本地配置文件:

  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0"/>
    <Application name="Google Chrome 31.0"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Google Chrome 31.0"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
全局配置文件:

  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0"/>
    <Application name="Google Chrome 31.0"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Google Chrome 31.0"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
合并的配置文件:

  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0"/>
    <Application name="Google Chrome 31.0"/>
  </Applications>
  <Applications>
    <Application name="Mozilla Firefox 24.2.0" default="true"/>
    <Application name="Google Chrome 31.0"/>
    <Application name="Cisco AnyConnect VPN Client"/>
  </Applications>
有效我想我要做一个并集,然后合并任何重复的元素。我不知道这是否有帮助,但是全局配置基本上是静态的,所以默认属性只存在于本地配置中。我实际上不需要输出XML文件,我只需要能够以某种方式结束合并内容。我可以把它们都输入到我的程序中,并手动比较,但似乎必须有一种更有效的方法。我发现很多例子都非常接近我想要做的,但没有一个完全符合我的要求

下面是一个我现在拥有的代码的例子,它确实按照我想要的方式工作,但它看起来一定是相当低效的

    public ObservableCollection<CheckableItem<string>> getAvailableApplications()
    {
        IEnumerable<String> apps = from e in config.Descendants("Application") orderby e.Attribute("name").Value select e.Attribute("name").Value;
        IEnumerable<String> localApps = from e in defaults.Descendants("Application") orderby e.Attribute("name").Value select e.Attribute("name").Value;
        apps = apps.Union(localApps);
        ObservableCollection<CheckableItem<string>> collection = new ObservableCollection<CheckableItem<string>>();

        foreach (string app in apps)
        {
            bool isDef = false;
            IEnumerable<String> defs = from x in defaults.Descendants("Application") where x.Attribute("name").Value.Equals(app) select x.Attribute("default").Value;
            try
            {
                isDef = System.Convert.ToBoolean(defs.SingleOrDefault());
            }
            catch (NullReferenceException)
            {
                Console.WriteLine("Default for {0} not specified", app);
            }
            catch (FormatException)
            {
                Console.WriteLine("Invalid default value specified for app {0}", app);
            }
            CheckableItem<string> item = new CheckableItem<string>(app);
            if (isDef)
                item.IsChecked = true;
            collection.Add(item);
        }
        return collection;
    }

你可能忘了粘贴你的代码我粘贴了我目前拥有的代码。如果我找不到更好的方法,我可以用它来做我想做的事情。这没什么大不了的,但我宁愿用正确的方法。