2011-09-23 92 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; 

码是在接收到该段作为参数的方法。