2011-03-24 4 views
4

Я анализирую XML-документ с использованием LINQ to XML и XDocument. Есть ли способ для XElement/XContainer получить дочерний узел по индексу (в порядке документа)? Так что я могу получить n-й узел элемента?Индексированный доступ к дочерним узлам XElement

Я знаю, что, вероятно, может сделать это, получая все дочерние узлы этого элемента и преобразования, которые IEnumerable в List, но это уже звучит, как он хотел бы добавить весьма избыточную нагрузку (как я заинтересован только в сингл дочерний узел).

Есть что-то, что я пропустил в документации?

ответ

5

Нет, индексный доступ к дочернему элементу отсутствует, используя XElement или XContainer. Если вы хотите индексированный доступ, у вас есть два варианта.

Первый вызвать Elements метод на XContainer (который возвращает IEnumerable<T> из XElement экземпляров в порядке документов), а затем использовать Skip extension method, чтобы пропустить элементов для достижения конкретного ребенка.

Если вы хотите получить доступ к дочерним элементам часто по индексу, то вы должны поместить их в IList<T> (который имеет индексированный доступ), который достаточно легко с ToList extension method:

IList<XElement> indexedElements = element.Elements().ToList(); 
+0

Спасибо, так что это не простой способ :) - я решил реорганизовать свою структуру данных в настоящее время немного. Вместо того, чтобы работать с XML все время, я буду разбирать XML один раз в специальную структуру данных (хранящуюся в списке, так что у меня есть случайный доступ) и использовать LINQ для работы над этими объектами вместо XML. Это, вероятно, лучше для моей более поздней работы. – poke

+0

@poke: Это, вероятно, лучше, учитывая, что XML является лишь представлением некоторой другой концепции. Обычно носители данных и представление понятий не всегда выравниваются, поэтому всегда хорошо иметь такие преобразования, чтобы вы не всегда сгибали ограничения того, на что вы упорствуете. – casperOne

2

Может принять (TopN) Может помочь директива LINQ? Я делаю предположение на основе некоторого опыта, связанного с SQL - вы не можете получить строку напрямую, но можете принимать верхние n элементов.

Это может помочь, если ваш список огромен, и вы не связываете последние элементы.

4

насчет Skip (п) .Снять (1) операторы

Смежные вопросы