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

#xml #linq-to-xml #xelement

#xml #linq-to-xml #xelement

Вопрос:

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

если у меня есть:

<root>
<level1/>
<level1/>
<level1>
<level2.1>
<level2.2>
<level2.1/>
</level2.2>
</level1>
<level1/>
</root>

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

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

Спасибо.

—недавно добавлено: code —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();
}
  

Комментарии:

1. Я предполагаю, что вы не опубликовали XML, который вы на самом деле используете: <level1> есть только 4 раза.

2. Ваш обновленный XML недействителен, <level2.1> не закрыт.

3. Последовательность q3 действительно содержит только 4 элемента. Но когда вы используете ToString() для элемента с дочерними элементами, он печатает весь элемент, включая дочерние элементы. Вы получили бы такое же поведение, если бы использовали ElementAt() .

Ответ №1:

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

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

Комментарии:

1. извините. новичок на этом форуме и должен был узнать, что нужно добавить amp; > и тому подобное. Я получаю два разных значения. В используемом мной xml есть 4 дочерних узла, и я получаю все 14 дочерних узлов.

2. @Llewellyn, затем опубликуйте XML, который вы на самом деле используете, ваш код и каковы, по-вашему, должны быть результаты. Кроме того, вам не нужно использовать HTML-объекты здесь, просто введите свой код, выберите его, а затем нажмите на { } кнопку. Это форматирует его как код.

3. Если я не услышу иного, я лучше всего понимаю ответ: похоже, что нужно задать вопрос Element().Count(), чтобы узнать количество непосредственных дочерних элементов. Затем можно выполнить итерацию по каждому из них с помощью ElementAt(#). Используя этот подход рекурсивно, можно, не зная имени метатега элемента, «визуализировать» xml-дерево, не зная его. Кажется разумным, чтобы у XElement был метод «getChildren», поскольку у него есть концепция Parent. Но это легко создается (каждый раз).

4. @Llewellyn, но Elements() это именно тот метод, который вам нужен. Нет необходимости в ElementAt() .