我有一些类似于下面的
的XML<DriveLayout>
<Drive totalSpace="16" VolumeGroup="dg01" />
<Drive totalSpace="32" VolumeGroup="dg01" />
<Drive totalSpace="64" VolumeGroup="dg02" />
<Drive totalSpace="64" VolumeGroup="dg02" />
<VolumeGroups>
<VolumeGroup VolumeGroup="dg01" storageTier="1" />
<VolumeGroup VolumeGroup="dg02" storageTier="2" />
</VolumeGroups>
</DriveLayout>
我需要一种方法来返回XML并将属性storageTier添加到每个单独的Drive节点。有没有办法遍历每个驱动器节点并获取VolumeGroup然后从VolumeGroup节点中的XML中获取相应的storageTier?然后,我需要将正确的storageTier注入XML驱动器节点。我正在使用C#中的System.XML。
由于
非常感谢任何帮助
答案 0 :(得分:7)
使用LINQ to XML可以非常简洁地完成此任务。更重要的是,它使用简单的LINQ查询和字典来提供在线性时间内运行的算法。
var storageTiers = doc.Root.Element("VolumeGroups").Elements().ToDictionary(
el => (string)el.Attribute("VolumeGroup"),
el => (string)el.Attribute("storageTier"));
foreach (var driveElement in doc.Root.Elements("Drive"))
{
driveElement.SetAttributeValue("storageTier",
storageTiers[(string)driveEl.Attribute("VolumeGroup")]);
}
如果您使用的是C#3.0,那么毫无疑问这是最好的方法(除非您的XML文件非常庞大并且您需要高效率,这似乎不太可能)。
答案 1 :(得分:0)
我认为你需要XPath(check this out)
var doc = new XmlDocument();
var xml =
@"<DriveLayout>
<Drive totalSpace='16' VolumeGroup='dg01' />
<Drive totalSpace='32' VolumeGroup='dg01' />
<Drive totalSpace='64' VolumeGroup='dg02' />
<Drive totalSpace='64' VolumeGroup='dg02' />
<VolumeGroups>
<VolumeGroup VolumeGroup='dg01' storageTier='1' />
<VolumeGroup VolumeGroup='dg02' storageTier='2' />
</VolumeGroups>
</DriveLayout>
";
doc.LoadXml(xml);
var volumeGroups = doc.SelectNodes("/DriveLayout/VolumeGroups/VolumeGroup");
var storageTiers = new Dictionary<string, string>();
if (volumeGroups != null)
{
foreach (var volumeGroup in volumeGroups)
{
var volumeGroupElement = (XmlElement) volumeGroup;
storageTiers.Add(
volumeGroupElement.Attributes["VolumeGroup"].Value,
volumeGroupElement.Attributes["storageTier"].Value);
}
}
var nodes = doc.SelectNodes("/DriveLayout/Drive");
if (nodes == null)
{
return;
}
foreach (XmlNode node in nodes)
{
var element = (XmlElement) node;
var volumeGroupAttribute = element.Attributes["VolumeGroup"];
if (volumeGroupAttribute == null)
{
continue;
}
var volumeGroup = volumeGroupAttribute.Value;
var newStorageTier = doc.CreateAttribute("storageTier");
newStorageTier.Value = storageTiers[volumeGroup];
element.Attributes.Append(newStorageTier);
}
答案 2 :(得分:0)