2012-01-18 75 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