我已经创建了一个XPathNodeIterator,其中包含几个简短的XML片段(每个片段都有一个文件描述):
XPathNodeIterator segments = node.SelectDescendants("Segment", node.NamespaceURI, false);现在,当尝试循环它们时,似乎每次都只选择第一个段。下面是我尝试过的两个版本的循环(仅限File/Files类):
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 Framework3.5。
发布于 2011-09-26 16:03:53
问题出在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;上面的代码位于将段作为参数接收的方法中。
https://stackoverflow.com/questions/7525785
复制相似问题