使用Linq将XML与重复条目合并

时间:2014-07-09 00:11:12

标签: c# xml linq

我有两个XML配置文件,一个位于Web上的全局XML文件和一个本地存在的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>

有效我想我想做一个联合然后合并任何重复的元素。我不知道这是否有帮助,但全局配置基本上是静态的,因此默认属性仅存在于本地配置中。我实际上并不需要输出我只需要能够以某种方式结束合并内容的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;
    }

0 个答案:

没有答案