Индексиран достъп до дъщерните възли на XElement

Анализирам XML документ с помощта на LINQ към XML и XDocument. Има ли начин XElement/XContainer да получи дъщерен възел по индекса (в реда на документа)? За да мога да получа nтия възел на елемента?

Знам, че вероятно мога да направя това, като получа всички дъщерни възли на този елемент и преобразувам това IEnumerable в List, но това вече звучи така, сякаш ще добави много излишни режийни разходи (тъй като се интересувам само от единичен дъщерен възел).

Има ли нещо, което съм пропуснал в документацията?


person poke    schedule 24.03.2011    source източник


Отговори (3)


Не, няма индексиран достъп до дъщерен елемент с помощта на XElement или XContainer. Ако искате индексиран достъп, имате две възможности.

Първият е да извикате метода Elements на XContainer (който връща < a href="http://msdn.microsoft.com/en-us/library/9eekhta0.aspx" rel="nofollow">IEnumerable<T> от XElement екземпляри в ред на документи) и след това използвайте Skip метод на разширение, за да прескочите елементите, за да достигнете до конкретното дете.

Ако искате да осъществявате достъп до дъщерните елементи често чрез индекс, тогава трябва да ги поставите в IList<T> (който има индексиран достъп), което е достатъчно лесно с ToList метод на разширение:

IList<XElement> indexedElements = element.Elements().ToList();
person casperOne    schedule 24.03.2011
comment
Благодаря ви, така че няма по-лесен начин :) – реших да преработя малко структурата си от данни. Вместо да работя върху XML през цялото време, ще анализирам XML веднъж в специална структура от данни (съхранена в списък, така че имам произволен достъп) и след това ще използвам LINQ, за да работя върху тези обекти вместо XML. Това вероятно е по-добре за по-нататъшната ми работа. - person poke; 24.03.2011
comment
@poke: Това вероятно е по-добре, като се има предвид, че XML е само представяне на някаква друга концепция. Обикновено носителите за съхранение и представянето на концепциите не винаги са в съответствие, така че винаги е добре да има трансформации като тази, така че да не се огъвате винаги около ограниченията на това, към което упорствате. - person casperOne; 24.03.2011

какво ще кажете за операторите Skip(n).Take(1).

person Nasmi Sabeer    schedule 24.03.2011

Може би директивата Take(topN) LINQ може да помогне? Правя предположение въз основа на някакъв опит, свързан със SQL - не можете да получите реда директно, но можете да вземете горните n елемента.

Това може да помогне, ако списъкът ви е огромен и не срещате последните елементи.

person Sasha Reminnyi    schedule 24.03.2011