Цикл через проблему XPathNodeIterator

Я создал 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.

1 ответ

Решение

Проблема была в методе 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;

Код выше был в методе, который получил сегмент в качестве параметра.

Другие вопросы по тегам