在.NET中循环使用XML?

时间:2009-07-21 19:26:14

标签: c# xml

我有一些类似于下面的

的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。

由于

非常感谢任何帮助

3 个答案:

答案 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)