#c# #linq-to-xml #descendant
#c# #linq-to-xml #потомок
Вопрос:
Предположим, у меня есть следующий XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<project>
<ixGroup>105</ixGroup>
<sGroup>Place Group</sGroup>
</project>
<project>
...
И я использую следующий код для извлечения из него различных <ixGroup>
и <sGroup>
текстовых значений:
XDocument doc = XDocument.Load(@"C:tempxmlParse2.xml");
var projects = (from project in doc.Descendants("project")
select new {
id = project.Element("ixGroup").Value,
name = project.Element("sGroup").Value
}).Distinct();
foreach(var project in projects)
{
project.id.Dump("id");
project.name.Dump("name");
}
Если бы в том же XML-файле был дополнительный элемент, подобный <projects>
добавленному ниже:
<response>
<projects>
<project>
<ixGroup>105</ixGroup>
<sGroup>Place Group</sGroup>
</project>
<project>
...
Как бы мне изменить приведенный выше код LINQ, чтобы по-прежнему получать доступ к <project>
элементам?
Ответ №1:
Вам не пришлось бы. Я только что протестировал это, и ваш текущий оператор LINQ все равно вернет все <project>
элементы, независимо от того, вложены ли они в <projects>
элемент.
Ответ №2:
Вам вообще не нужно изменять свой код. Descendants
Метод будет искать как можно дальше по дереву, чтобы найти соответствующие элементы, что может быть как проклятием, так и благословением. В вашем случае написанный код продолжит работать, даже если вы добавите промежуточный <projects>
узел.
(Метод, который выполняет поиск только прямых дочерних методов, является Children()
.
Ответ №3:
Элементы ищут только дочерние узлы, но потомки проходят весь путь вниз по дереву. Другими словами, вам не придется ничего делать.