Неявная проблема преобразования с объявлением XmlElement XmlNodeList

У меня есть документ Xml, который я хочу преобразовать в XnlNodeList с помощью запроса linq. Теперь ни Xml, ни Linq не являются чем-то хорошо известным. Я получаю сообщение об ошибке Cannot implicitly convert type 'System.Linq.IOrderedEnumerable<System.Xml.XmlElement>' to 'System.Xml.XmlNodeList'. An explicit conversion exists (are you missing a cast?).

XmlNodeList abTestDocx = abTestDoc.GetElementsByTagName("FS").OfType<XmlElement>().OrderBy(FS => FS.GetAttribute("label"));

Спасибо!


person Risho    schedule 04.02.2014    source источник


Ответы (1)


Обычно вы не создаете экземпляры XmlNodeList самостоятельно. Вам это действительно нужно? Если вам просто нужно перебрать узлы, просто назначьте его IEnumerable<XmlElement>:

IEnumerable<XmlElement> abTestDocx = abTestDoc
     .GetElementsByTagName("FS")
     .OfType<XmlElement>()
     .OrderBy(fs => fs.GetAttribute("label"));

Обратите внимание, что использование LINQ to XML, как правило, лучше, чем старый XmlDocument API. Тогда вам просто нужно:

IEnumerable<XElement> abTestDocx = doc
     .Descendants("FS")
     .OrderBy(fs => (string) fs.Attribute("label"));

... и все остальное тоже было бы проще. LINQ to XML прекрасен :)

person Jon Skeet    schedule 04.02.2014
comment
Мне нужно отсортировать XmlNodeList. Исходный код был XmlNodeList abTestFieldNodes = abTestDoc.SelectNodes("//foo/bar");, так как позже в коде мы ищем атрибуты XmlElement и т. д. Так что это казалось простым решением. - person Risho; 05.02.2014
comment
@Risho: Почему вы требуете, чтобы после этого было XmlNodeList? Что ты с этим делаешь? - person Jon Skeet; 05.02.2014
comment
Это в среде MVC, и у нас есть файл Xml, который используется как источник данных для создания и заполнения раскрывающихся списков. Мы перебираем XmlNodeList и сравниваем идентификатор и имя текущего узла с хеш-таблицей, содержащей данные. Если у нас есть совпадение, мы создаем элементы управления html и т. д. - person Risho; 05.02.2014
comment
@Risho: Ну, почему вы не можете вместо этого перебрать IEnumerable<XmlElement>? Это моя точка зрения - разве вам не нужна просто последовательность узлов? - person Jon Skeet; 05.02.2014
comment
Надо будет посмотреть, так как раньше с этим не работал. Спасибо за ваш вклад! - person Risho; 05.02.2014