Цикл через проблему 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;
Код выше был в методе, который получил сегмент в качестве параметра.