Дочерние узлы ТОЛЬКО XElement

Используя XLinq, вы, кажется, должны знать точное имя дочернего элемента элемента, чтобы получить доступ к определенным дочерним элементам. Я хочу рекурсивно получить доступ/обнаружить непосредственных дочерних элементов элемента без такой тесной связи.

если бы у меня был:

‹root›
‹level1/›
‹level1/›
‹level1›
‹level2.1›
‹level2.2›
‹level2.2.1/›
‹/level2.2›
‹/level1›
‹level1/›
‹/root›

При поиске дочерних элементов "root" root.Elements().Count() возвращает 7 - я хочу 4 (узлы "level1"). Если я спрошу root.Elements("level1"), я получу 4. Но я должен знать имя дочерних элементов.

Вопрос: Как я могу получить доступ к непосредственным дочерним элементам, не зная имени этого элемента? И это будет в любом рекурсивном месте дерева XML?

Благодарю.

---ново добавить: код --q1 == 7, q2 == 8 и q3 == 4. НО, если вы перебираете элементы q3, вы получаете доступ ко всем 7 дочерним узлам, а не к 4, которые я хотел бы. Если это означает, что нужно просто использовать ElementAt(#), хорошо. Но у объекта, кажется, есть конфликт между тем, что он «видит» как своих детей.

XElement xel = new XElement(
    new XElement("root",
        new XElement("level1"),
        new XElement("level1"),
        new XElement("level1",
                new XElement("level2.1"),
                new XElement("level2.2",
                    new XElement("level2.2.1"))),

                    new XElement("level1")
                    ));

var q1 = from x in xel.Descendants()
        select x;
var q2 = from x in xel.DescendantsAndSelf()
        select x;
var q3 = from x in xel.Elements()
        select x;

foreach (XElement x in q3.Elements())
{
    string s = x.ToString();
}

person Llewellyn Preece    schedule 29.05.2011    source источник
comment
Я предполагаю, что вы не опубликовали XML, который вы на самом деле используете: <level1> есть только 4 раза.   -  person svick    schedule 29.05.2011
comment
Ваш обновленный XML недействителен, <level2.1> не закрыт.   -  person svick    schedule 29.05.2011
comment
Последовательность q3 действительно состоит только из 4 элементов. Но когда вы используете ToString() для элемента с дочерними элементами, он печатает весь элемент, включая дочерние элементы. Вы бы получили такое же поведение, если бы использовали ElementAt().   -  person svick    schedule 29.05.2011


Ответы (1)


В случае опубликованного вами XML нет никакой разницы между root.Elements() и root.Elements("level1"): оба возвращают одни и те же 3 элемента <level1>.

В общем, XElement.Elements() делает именно то, что вам нужно: возвращает только непосредственные дочерние элементы элемента.

person svick    schedule 29.05.2011
comment
простите. новичок на этом форуме и должен был узнать, что нужно добавить и тому подобное. Я получаю два разных значения. В XML, который я использую, есть 4 дочерних узла, и я получаю все 14 потомков. - person Llewellyn Preece; 29.05.2011
comment
@Llewellyn, затем опубликуйте XML, который вы на самом деле используете, свой код и какие результаты вы ожидаете. Кроме того, вам не нужно использовать здесь объекты HTML, просто введите свой код, выберите его, а затем нажмите кнопку { }. Это форматирует его как код. - person svick; 29.05.2011
comment
Если я не слышу иного, я лучше всего понимаю ответ: кажется, что нужно задать вопрос Element().Count(), чтобы узнать количество непосредственных дочерних элементов. Затем можно перебирать каждый через ElementAt(#). Используя этот подход рекурсивно, можно, не зная имени метатега элемента, визуализировать xml-дерево. Кажется разумным, чтобы XElement имел метод GetChildren, поскольку он имеет концепцию Parent. Но это легко создается (каждый раз). - person Llewellyn Preece; 29.05.2011
comment
@Llewellyn, но Elements() - это именно тот метод, который вам нужен. Нет необходимости в ElementAt(). - person svick; 29.05.2011