我创建了一个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。
答案 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;
上面的代码是在接收段作为参数的方法中。