Рейтинг:
0
Graeme_Grant
Это вернет счет 3:
var rawXml = @"<root>
<total>
<rec>
<datas>
<data>
<ic>22</ic>
<amount>44</amount>
</data>
<data>
<ic>33</ic>
<amount>20</amount>
</data>
<data>
<ic>44</ic>
<amount>10</amount>
</data>
</datas>
</rec>
</total>
</root>";
var doc = XDocument.Parse(rawXml);
var count = doc
.Descendants()
.Select(x => x.Elements("data"))
.FirstOrDefault(x => x.Any())?.Count() ?? 0;
ОБНОВЛЕНИЕ: Вышеприведенное решение может быть еще более упрощено:
var count = doc
.Descendants()
.SelectMany(x => x.Elements("data"))?.Count() ?? 0;
Кроме того, если вы испытываете ошибки с
Нулевое Условное Обозначение ?.[
^] или же
нуль-коалесцирующий ??[
^], вы можете использовать следующее:
var elements = doc.Descendants().SelectMany(x => x.Elements("data"));
var count = elements == null ? 0 : elements.Count();
Обновление №2: Как указано ниже, это может быть упрощено еще больше без необходимости проверки null:
var count = doc.Descendants("data").Count();
Karthik_Mahalingam
выдает ошибку компилятора, c# 7 ?
Graeme_Grant
Он был построен на C#7.1, поэтому я изменил его на C#6.0, и он прекрасно работал без ошибок компиляции. Однако я использую VS2017...
Какую ошибку вы видите для какой строки?
Karthik_Mahalingam
здесь
))?.Count() ?? 0;
ошибка синтаксиса : ожидается.
Graeme_Grant
Нулевая проверка... Это то же самое, что и это:
var elements = doc.Descendants().Select(x => x.Elements("data")).FirstOrDefault(x => x.Any());
var count = elements == null ? 0 : elements.Count();
Karthik_Mahalingam
почему бы и нет
var doc = XElement.Parse(xml);
var count = doc.Descendants("data").Count(); // 3
Graeme_Grant
Вы тоже можете это сделать, но вам также следует проверить наличие нулей...
Karthik_Mahalingam
если я запускаю это, он возвращает 0, так что нет необходимости проверять null :)
var count = doc.Descendants("data111").Count(); // 0
Graeme_Grant
Старая укоренившаяся привычка к нулевой защите... хорошо бы знать для этого случая.
Graeme_Grant
Решение обновлено... Проверьте ссылки, включенные для более ранней ошибки компилятора версии C#, с которой вы столкнулись... Также убедитесь, что вы не используете по умолчанию C#5.0 в расширенном параметре Project > Build >.
Karthik_Mahalingam
круто, теперь у них есть гибкость версии.
Karthik_Mahalingam
Я застрял с VS2013
Graeme_Grant
Вы не хотите использовать VS2017CE?
Karthik_Mahalingam
Я уже пробовал это, но моя производительность машины падает, когда я работаю над этим. так что вполне комфортно с VS 2013.
Graeme_Grant
Справедливо... Хотя к возвращению было бы трудно привыкнуть...