首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历XPathNodeIterator问题

遍历XPathNodeIterator问题
EN

Stack Overflow用户
提问于 2011-09-23 15:42:16
回答 1查看 413关注 0票数 0

我已经创建了一个XPathNodeIterator,其中包含几个简短的XML片段(每个片段都有一个文件描述):

代码语言:javascript
复制
XPathNodeIterator segments = node.SelectDescendants("Segment", node.NamespaceURI, false);

现在,当尝试循环它们时,似乎每次都只选择第一个段。下面是我尝试过的两个版本的循环(仅限File/Files类):

代码语言:javascript
复制
while (segments.MoveNext())
{
    File f = GetSingleFileDataFromSegment(segments.Current);

    files.Add(f);
}

再试一次:

代码语言:javascript
复制
foreach (XPathNavigator seg in segments)
{
    File f = GetSingleFileDataFromSegment(seg);

    files.Add(f);
}

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

这是XPathNodeIterator的正常行为吗?还是这里缺少了什么?我目前使用的是.NET Framework3.5。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-26 16:03:53

问题出在GetSingleFileDataFromSegment -method中,它使用XPath获取正确的段。段属性中有名称空间,这需要使用NamespaceManager。

错误的XPath表达式:

代码语言:javascript
复制
f.Location = seg.XPathSelectElement("//*[local-name()='Location']").Value; 

更正后的版本:

代码语言:javascript
复制
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;

上面的代码位于将段作为参数接收的方法中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7525785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档