【发布时间】:2014-09-05 12:07:17
【问题描述】:
我有一个 XML 文件,其中包含有关特定计算机上安装了哪些组件以及属于每个组件的配置文件的一些信息。
文件的一个开发示例如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ConfigMappings>
<Host Name="Host1">
<Component Name="AlarmManager" Version="1.0.1.0" Enabled="True">
<Config Name="AlarmManager.Configuration.xml" Version="1.0.0.0" SubFolder=""/>
<Config Name="faultMapConfig.xml" Version="1.0.0.0" SubFolder=""/>
<Config Name="LoadsCalculatorConfig.xml" Version="1.0.0.0" SubFolder="Advisory"/>
</Component>
</Host>
<Host Name="Host2">
<Component Name="AdvisoryManager" Version="1.0.1.0" Enabled="True">
<Config Name="DeviceManager.Configuration.xml" Version="1.0.0.1" SubFolder=""/>
<Config Name="BasicData.xml" Version="1.0.0.2" SubFolder="Advisory"/>
<Config Name="BasicData.xsd" Version="1.0.0.3" SubFolder="Advisory"/>
<Config Name="Utilization.xml" Version="1.0.0.4" SubFolder=""/>
<Config Name="Utilization.xsd" Version="1.0.0.4" SubFolder=""/>
<Config Name="faultMapConfig.xsd" Version="1.0.0.4" SubFolder=""/>
<Config Name="faultMapConfig.xml" Version="1.0.0.4" SubFolder=""/>
</Component>
<Component Name="w32time" Version="1.0.1.0" Enabled="True">
<Config Name="DeviceManager.Configuration.xml" Version="1.0.0.1" SubFolder=""/>
</Component>
</Host>
</ConfigMappings>
我想做的是读取这个 XML 文件,并在其中找到与我的计算机主机名匹配的 Host 元素。我想创建一个包含名称、版本和启用属性的组件列表 + 其配置列表(名称、版本、子文件夹)。
我自己做到了这一点:
var xdoc = XDocument.Load(dlg.FileName);
var components =
from c in xdoc.Descendants("Component")
where
String.Equals(c.Parent.Attribute("Name").Value, Environment.MachineName, StringComparison.CurrentCultureIgnoreCase)
select new
{
Name = c.Attribute("Name").Value,
Enabled = c.Attribute("Enabled").Value,
version = c.Attribute("Version").Value,
};
ComponentList.Clear();
foreach (var component in components)
{
bool componentEnable = component != null && component.Enabled == "True";
ComponentList.Add(new Component(component.Name, componentEnable, component.version));
}
foreach (var component in ComponentList)
{
var configs =
from c in xdoc.Descendants("Config")
where
c.Parent.Parent.Name == "Host" &&
String.Equals(c.Parent.Parent.Attribute("Name").Value, Environment.MachineName, StringComparison.CurrentCultureIgnoreCase) &&
String.Equals(c.Parent.Attribute("Name").Value, component.Name, StringComparison.CurrentCultureIgnoreCase)
select new
{
Name = c.Attribute("Name").Value,
version = c.Attribute("Version").Value,
SubFolder = c.Attribute("SubFolder").Value,
};
foreach (var config in configs)
{
component.Configurations.Add(new Config(config.Name, config.version, config.SubFolder));
}
}
这里的 ComponentList 是一个组件列表。而 Component 是一个包含其属性(Name、Version 和 Enabled)+ 配置对象列表的类。
现在可以了。但这似乎是一种非常混乱和凌乱的方式,我需要一些帮助来改进这一点。
【问题讨论】: