遍历XPathNodeIterator问题

本文关键字:问题 XPathNodeIterator 遍历 | 更新日期: 2023-09-27 18:09:31

我创建了一个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 Framework 3.5。

遍历XPathNodeIterator问题

问题是在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;

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