Задать вопрос

Как реализовать подсчет количества дочерних узлов, внутри родительского узла некоторого XML-документа?

Здравствуйте.

Я загружаю в программу некоторый XML-документ:
var xml = XDocument.Load(pathToXMLFile);

Содержание этого XML-документа выглядит вот так:
<ROOT>
    <data>
        <record>
            <field name="OID">51278ACDZF...</field>
            <field name="Country or Area">AFGHANISTAN, I.R. OF</field>
            <field name="Year">1989</field>
            <field name="Description">TRADE BALANCE</field>
            <field name="Magnitude">MILLIONS OF US$</field>
            <field name="Value">-371200000</field>
        </record>
        <record>
            <field name="OID">51278AEDZF...</field>
            <field name="Country or Area">AFGHANISTAN, I.R. OF</field>
            <field name="Year">1989</field>
            <field name="Description">SERVICES: DEBIT</field>
            <field name="Magnitude">MILLIONS OF US$</field>
            <field name="Value">-103400000</field>
        </record>
    </data>
</ROOT>


Мне необходимо посчитать какое количество узлов <field>, располагается внутри родительского узла <record>.
В данном примере их по 6 штук (в каждом узле <record>). Но в разных XML-документах это количество будет разным.

Как реализовать подсчет количества узлов <field> внутри узла <record>, в XML-документе?

P.S. Внутри одного XML-документа, количество узлов <field> внутри узла <record>, постоянно. То есть, если, к примеру, в первом узле <record> находиться 5 узлов <field>, то тогда и в остальных узлах <record>, этого XML-документа, будет столько же узлов <field>.

P.P.S. Я использую вот такой способ:
int p = 0;
            xml.XPathSelectElements("//record").ToList().ForEach(n =>
            {
                p = p + 1;
            });
            int q = 0;
            xml.XPathSelectElements("//field").ToList().ForEach(n =>
            {
                q = q + 1;
            });
            int m = q / p;

           //где m - требуемое число

и этот способ всё правильно считает, но я думаю, что этот способ излишне нагружает процессор (так как 2 раза полностью "читается" XML-документ).
  • Вопрос задан
  • 1234 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 2
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Посмотрите в сторону LINQ TO XML.
XDocument xdoc = XDocument.Load(pathToXMLFile);
int countRecord = (from xe in xdoc.Root.Descendants("record") select xe).Count();
int countField = (from xe in xdoc.Root.Descendants("field") select xe).Count();


По скорости не скажу, но должно быть получше.
Ответ написан
@ERAFY Автор вопроса
Модифицированный вариант (на основе кода от Вадима Ш)
XDocument xml = XDocument.Load(pathToXMLFile);
int countFields = (from xe in xml.XPathSelectElement("//record").Descendants("field") select xe).Count();

Может кому в будущем пригодиться такая реализация.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы