2011-09-23 89 views
0

我已經創建了一個包含短短的XML段(每一個文件的描述)一個創建XPathNodeIterator循環:通過創建XPathNodeIterator問題

XPathNodeIterator segments = node.SelectDescendants("Segment", node.NamespaceURI, false); 

現在,試圖環路他們的時候,似乎只有第一段每次都被挑選出來。下面是我試過(僅適用於例如文件/文件類)環路的兩個版本:

while (segments.MoveNext()) 
{ 
    File f = GetSingleFileDataFromSegment(segments.Current); 

    files.Add(f); 
} 

闖闖:

foreach (XPathNavigator seg in segments) 
{ 
    File f = GetSingleFileDataFromSegment(seg); 

    files.Add(f); 
} 

當與監視或快速監視一個循環查看單個段,看起來應該是這樣,一次只選擇一個不同的片段 - 但最終結果是「文件」包含第一個片段的多個副本。

這是XPathNodeIterator的正常行爲嗎?還是在這裏失蹤?我目前正在使用.NET Framework 3.5。

+0

你能展示一個簡短但完整的程序來演示問題,包括你的XML文件嗎? –

+0

想,但NDA阻止。 –

+1

NDA不會阻止您用單獨的示例文件編寫單獨的簡短但完整的程序來演示相同的事情。你不需要在這裏透露任何知識產權。當然,完成一個簡短但完整的程序是完全有可能的,你會發現你的真實應用程序出了什麼問題。 –

回答

0

問題出在GetSingleFileDataFromSegment方法中,它使用XPath獲取正確的段。段屬性中有名稱空間,並且需要使用NamespaceManager。

故障XPath表達式:

f.Location = seg.XPathSelectElement("//*[local-name()='Location']").Value; 

更正版本:上述

System.Xml.XmlNamespaceManager nsmanager = new System.Xml.XmlNamespaceManager(seg.ToXmlDocument().NameTable); 
nsmanager.AddNamespace("ns", seg.Elements().FirstOrDefault().GetDefaultNamespace().NamespaceName); 
f.Location = seg.XPathSelectElement("./ns:Location", nsmanager).Value; 

碼是在接收到該段作爲參數的方法。