2009-07-21 49 views
1

我有一些XML,看起来像下面在.NET中循环访问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添加到每个单独的驱动器节点。有没有办法循环访问每个驱动器节点并获取VolumeGroup,然后从VolumeGroup节点的XML中获取相应的storageTier?然后我需要将正确的storageTier注入到XML驱动器节点中。我使用的是C#中的System.XML。

感谢

任何帮助,将不胜感激

+1

是否有你不能在3.5使用新的XML类的理由(即的XDocument,的XElement,XAttribute) – Stephan 2009-07-21 19:28:15

+0

我做了功能要求的一个网站,它运行了2.5 – Splashlin 2009-07-21 21:44:22

回答

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

“你要完成这个例子? “ – 2009-07-21 19:33:53

+0

也许在我离开我的工作后,随时可以跳入并编辑.. – BigBlondeViking 2009-07-21 19:37:46

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文件是巨大的,你需要高效率,这似乎不太可能)的最佳方式。