#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()
.