Цикл через проблему XPathNodeIterator - PullRequest
0 голосов
/ 23 сентября 2011

Я создал 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 Ответ

0 голосов
/ 26 сентября 2011

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

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

...