我有两个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;
}