Member 13499989 Ответов: 1

Как мне подсчитать узел и отобразить его в createtextnode в XML C#


<root>
  <total>
    <rec>
  <datas>
    <data>
      <ic>22
      <amount>44
    </data>
    <data>
      <ic>33
      <amount>20
    </data>
    <data>
      <ic>44
      <amount>10
    </data>





XML-макет отличается от того, что я печатаю, надеюсь, вы можете понять.
1 корневой узел имеет 2 разных узла (total и data). Однако я хочу подсчитать количество узлов в данных и отобразить на общем тексте узла.

Что я уже пробовал:

int count = doc.SelectNodes("root/total/data").Рассчитывать;

Руководство всего= док.Метод createElement("total_rec");
весь.Метода appendChild(док.CreateTextNode(графа));
сканнернод.AppendChild(всего);

Вывод: 0, по праву должно быть 3. И что же мне теперь делать?

Dave Kreskowiak

Ваш вопрос вообще не имеет никакого смысла, и это не допустимый XML. Вы должны включить закрывающие теги в свой пример, чтобы помочь вам объяснить проблему.

Karthik_Mahalingam

показать ожидаемый выходной xml-файл

1 Ответов

Рейтинг:
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

Старая укоренившаяся привычка к нулевой защите... хорошо бы знать для этого случая.

Karthik_Mahalingam

:)

Graeme_Grant

Решение обновлено... Проверьте ссылки, включенные для более ранней ошибки компилятора версии C#, с которой вы столкнулись... Также убедитесь, что вы не используете по умолчанию C#5.0 в расширенном параметре Project > Build >.

Karthik_Mahalingam

круто, теперь у них есть гибкость версии.

Karthik_Mahalingam

Я застрял с VS2013

Graeme_Grant

Вы не хотите использовать VS2017CE?

Karthik_Mahalingam

Я уже пробовал это, но моя производительность машины падает, когда я работаю над этим. так что вполне комфортно с VS 2013.

Graeme_Grant

Справедливо... Хотя к возвращению было бы трудно привыкнуть...

Karthik_Mahalingam

да