2012-01-18 46 views
0

我相信这是相对简单的。我想通过下面的XML循环,每次我点击一个新的名称空间,重置变种。通过xml循环重置每个循环上的var

XmlNodeList nodes = reports.SelectNodes("Reports/namespace"); 
     foreach (XmlNode NSpace in nodes) 
     { 
      List<string> newlist = new List<string>(); 

      //loop through checks one by one. 
      foreach (XmlElement element in reports.GetElementsByTagName("report")) 
      { 
       doStuff 
      } 
     } 

我知道这是错误的,因为它简单地通过将整个XML块4次(对每个命名空间),由于以下循环。

foreach (XmlElement element in reports.GetElementsByTagName("report")) 

有人可以建议我需要的xpath或正确的循环吗?

XML

<Reports> 
    <namespace Type="first"> 
    <report> 
    <name>first_1</name> 
    </report> 
    <report> 
    <name>first_2</name> 
    </report> 
    <report> 
    <name>first_3</name> 
    </report> 
    </namespace> 
    <namespace Type="Second"> 
    <report> 
    <name>Second_1</name> 
    </report> 
    </namespace> 
    <namespace Type="Third"> 
    <report> 
    <name>Third_1</name> 
    </report> 
    </namespace> 
    <namespace Type="Fourth"> 
    <report> 
    <name>Fourth_1</name> 
    </report> 
    </namespace> 
    </Reports> 

回答

1

那么你忽略了你的外部迭代变量。我怀疑你只是想你的内循环更改为:

XmlElement namespaceElement = (XmlElement) NSpace; 
foreach (XmlElement element in namespaceElement.GetElementsByTagName("report")) 
{ 
    // doStuff 
} 

或者,改变你的迭代变量的类型太:

foreach (XmlElement NSpace in nodes) 
{ 
    List<string> newlist = new List<string>(); 

    foreach (XmlElement element in NSpace.GetElementsByTagName("report")) 
    { 
     // ... 
    } 
} 

(我也会改变迭代变量的名字,但那又另当别论。)

如果您使用.NET 3.5或更高版本,你也可能要考虑使用LINQ to XML,我当然找到这样的事情更简单。

+0

错误\t \t 36“System.Xml.XmlNode”不包含关于“的getElementsByTagName”和没有扩展方法“的getElementsByTagName”接受类型“System.Xml.XmlNode”的第一个参数的定义可以找到(是否缺少using指令或程序集引用) – user1156000 2012-01-18 11:04:50

+0

@ user1156000:编辑...(这是一个原因,我更喜欢的LINQ to XML) – 2012-01-18 11:05:31

+0

这是完美的 - 感谢? – user1156000 2012-01-18 11:12:28