0

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

4

1 回答 1

0

问题出在 GetSingleFileDataFromSegment 方法中,该方法使用 XPath 来获取正确的段。段属性中有命名空间,这需要使用命名空间管理器。

错误的 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;

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

于 2011-09-26T08:03:52.610 回答