Как проверить количество дочерних тегов определенного родительского тега? - PullRequest
0 голосов
/ 22 мая 2018

это образец xml

<?xml version="1.0" encoding="utf-8"?>
<random>
  <chkr id="1">
    <ab>10.100.101.18</ab>
    <xy>5060</xy>
    <tt>pop</tt>
    <qq>pop</qq>
  </chkr>
  <chkr id="2">
    <ab>tarek</ab>
    <tt>tarek</tt>
    <ab>ffff</ab>
    <foo>pop</foo>
  </chkr>
  <chkr id="3">
    <ab>adf</ab>
    <foo>adf</foo>
    <tt>fadsf</tt>
    <ab>fadsf</ab>
    <tt>036</tt>
    <foo>.3</foo>
    <ssd>wolk</ssd>
  </chkr>
</random>

Я хочу найти теги, отличные от тегов <ab> и <tt> в каждом из родительских тегов <chkr> и получить имя теговкоторые появляются в этом родительском узле более одного раза.т.е. в приведенном выше примере xml вывод должен быть <chkr id="3">, содержащий тег <foo> несколько раз.

Как я могу сделать это с помощью LINQ-TO-XML?

1 Ответ

0 голосов
/ 22 мая 2018

Группировка по имени всех потомков - очень простое решение: (x - это имя вашего XDocument)

foreach (var e in x.Descendants("chkr"))
{
    foreach (var v in e.Descendants()
                       .Where(ee => ee.Name != "ab" && ee.Name != "tt")
                       .GroupBy(ee => ee.Name)
                       .Select(ee => new { Name = ee.Key, Count = ee.Count() }))
    {
        if (v.Count > 1)
            Console.WriteLine($"<chkr id={e.Attribute("id").Value}> contains the tag <{v.Name}> {v.Count} times.");
    }
}

С вашим XML этот код будет выводить

<chkr id=3> содержит тег <foo> 2 раза.

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы результаты, как указано в вашем комментарии, просто измените свой код на следующее:

List<string> names = new List<string>();
List<int> counts = new List<int>();

foreach (var e in x.Descendants("chkr"))
{
    names = new List<string>();
    counts = new List<int>();

    foreach (var v in e.Descendants().Where(ee => ee.Name != "ab" && ee.Name != "tt").GroupBy(ee => ee.Name).Select(ee => new { Name = ee.Key, Count = ee.Count() }))
    {
        if (v.Count > 1)
        {
            names.Add(v.Name.ToString());
            counts.Add(v.Count);
        }
    }

    if (names.Any())
        Console.WriteLine($"<chkr id={e.Attribute("id").Value}> contains the tag/tags {String.Join(",", names)} {String.Join(",", counts)} times.");
}
...