Получить все теги с одинаковым именем тега независимо от уровня в XML файле с C# - PullRequest
2 голосов
/ 16 июня 2020

У меня есть следующий метод и xml файл ниже. Метод фильтрует содержимое всех элементов «Tag4» и вставляет его в список. К сожалению, у меня проблема в том, что с несколькими дочерними элементами метод больше не работает. Затем в список добавляется только контент: «Content1», а остальное игнорируется.

Метод:

public List<string> Method(string sourcePath)
{
    string directory = sourcePath;
    var resultList = new List<string>();

    try
    {
        XDocument xdocument = XDocument.Load(directory);
        IEnumerable<XElement> tags = xdocument.Root.Elements().Elements().Where(x => x.Name.LocalName.Equals("Tag4"));
        foreach (var tag in tags)
        {
            var value = tag?.Value;
            if (!string.IsNullOrEmpty(value) && !resultList.Contains(value))
            {
                resultList.Add(value);
            }
        }
    }
    catch (Exception ex)
    {
    }
    return resultList;
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<Tag1Group xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsinc="http://www.w3.org/2001/XInclude" validFrom="2020-03-26T00:00:00+01:00" version="4" subversion="22" xmlns="http://www.bmw.com/ista/v2">
  <Tag1 name="Content1" version="4" Subversion="22">
    <Tag2>
      <Tag1 name="Content2" version="4" subversion="22">
        <Tag2>
          <Tag1 name="Content3" version="4" subversion="22">
            <Tag2>
              <Tag1 name="Content4" version="4" subversion="22">
                <Tag3>Ex</Tag3>
                <Tag4>Content4</Tag4>
                <Tag5>123</Tag5>
              </Tag1>
            </Tag2>
            <Tag3>Ex</Tag3>
            <Tag4>Content3</Tag4>
            <Tag5>456</Tag5>
          </Tag1>
        </Tag2>
        <Tag3>Ex</Tag3>
        <Tag4>Content2</Tag4>
        <Tag5>789</Tag5>
      </Tag1>
    </Tag2>
    <Tag3>Ex</Tag3>
    <Tag4>Content1</Tag4>
    <Tag5>1011</Tag5>
  </Tag1>
</Tag1Group>

Как я могу изменить метод, чтобы взять все элементы из tag4 независимо от их уровня. Я также имею в виду: «Content2», «Content3», «Content4»

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Для этого даже linq не нужен. Существует метод Descendants(), который позволяет получить все элементы с именем, переданным в качестве аргумента.

Пример в вашем коде:

        public List<string> Method(string sourcePath)
        {
            string directory = sourcePath;
            var resultList = new List<string>();

            try
            {
                XDocument xdocument = XDocument.Load(directory);
                var docNamespace = xdocument.Root.Name.Namespace;
                var tags = xdocument.Descendants(docNamespace + "Tag4");

                foreach (var tag in tags)
                {
                    var value = tag?.Value;
                    if (!string.IsNullOrEmpty(value) && !resultList.Contains(value))
                    {
                        resultList.Add(value);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return resultList;
        }
0 голосов
/ 17 июня 2020

Попробуйте использовать метод Descendants():

Возвращает коллекцию дочерних элементов для этого документа или элемента в порядке документа.

IEnumerable<XElement> tags = xdocument.Root.Descendants()
    .Where(e => e.Name.LocalName == "Tag4")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...