循环遍历XPathNodeIterator问题

时间:2011-09-23 07:42:16

标签: c# .net xml loops xpathnodeiterator

我创建了一个XPathNodeIterator,它包含一些简短的XML段(每个段都带有文件描述):

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);
}

当使用Watch或Quickwatch查看循环中的单个片段时,它看起来应该如此,一次选择一个所有不同的片段 - 但最终结果是“文件”包含第一个片段的多个副本。

这是XPathNodeIterator的正常行为吗?或者这里缺少什么?我目前正在使用.NET Framework 3.5。

1 个答案:

答案 0 :(得分:0)

问题出在GetSingleFileDataFromSegment -method中,它使用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;

上面的代码是在接收段作为参数的方法中。