2013-08-23 33 views
3

我有下面的XMLXML的SelectNodes然後SelectSingleNodes - 只檢索第一

<root> 
<Operations> 
    <OperationId>1</OperationId> 
    <OtherFields>...</OtherFields> 
</Operations> 
<Operations> 
    <OperationId>2</OperationId> 
    <OtherFields>...</OtherFields> 
</Operations> 
<Operations> 
    <OperationId>3</OperationId> 
    <OtherFields>...</OtherFields> 
</Operations> 
</root> 

使用C#和System.Xml命名空間,我得到使用此代碼的所有操作:

XmlNodeList operations= doc.SelectNodes("/root/Operations"); 

現在我需要遍歷每個操作並引用字段(OperationId,OtherFields)。

我試試這個:

foreach (XmlNode node in xnodes) 
{ 
    Console.WriteLine("Operation ID: {0}", node.SelectNodes("//OperationId")[0].InnerText); 
} 

然而,這只是重複第一OperationId - 1

有什麼不對?

感謝, 安德魯

回答

6

您最初的查詢選擇所有Operations節點關閉根像你期望。然而,你的循環中的內部查詢做了不同的事情。

通過以//開始查詢,您可以查詢相對於文檔的根目錄。所以你實際上選擇了文檔中所有的OperationId節點,而不僅僅是當前節點的後代子節點。然後,您爲每次迭代將結果中的第一個節點編入索引,這就是您看到第一個id重複的原因。

由於node指當前Operations節點,選擇相應的OperationId,您的查詢應該簡單地:

OperationId 

我應該指出,因爲你只是想選擇查詢的第一個元素,最好使用SelectSingleNode()而不是SelectNodes。如果選擇了任何節點,則會返回第一個節點。

node.SelectSingleNode("OperationId").InnerText 

但是因爲你只是想選擇一個直接子元素,我不會使用XPath查詢在那裏,這是不必要的。只需使用索引器直接訪問子元素。

var query = doc.SelectNodes("/root/Operations"); 
foreach (XmlNode node in query) 
{ 
    Console.WriteLine("Operation ID: {0}", node["OperationId"].InnerText); 
} 
+0

Jeff是正確的「// OperationId」)[0]告訴它選擇節點0,第一個節點。 – Dijkgraaf

+0

謝謝,內容豐富,我稍後需要添加的信息 – andrewb

+0

浪費了將近3個小時。非常感謝 – P5Coder

相關問題