Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2020, 22:00   #1
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию Рекурсия XML при помощи Xml.Linq

Добился работоспособности кода при помощи рекурсии. но вот как используя рекурсию создать список индексов где что находится ?

xml документ не имеет строго типизированного типа и архитектуры, по этому плоский тип разбора не подходит. Что будет в файле неизвестно. Поэтому просто скопировал один и тот же код с разным типом вложения для проверки.

Код:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMinYMin" width="48" height="48">
  <desc>Выключатель мощности ВН</desc>
  <defs>
    <g id="vn" editable="true" edit_style="true">
      <rect x="10" y="10" width="28" height="28" style="stroke: #00ff00; stroke-width: 2; fill: #00aabb;" />
      <line x1="24" y1="10" x2="24" y2="0" style="stroke: #00ff00; stroke-width: 2;" />
      <line x1="24" y1="38" x2="24" y2="48" style="stroke: #00ff00; stroke-width: 2;" />
    </g>
    <g id="vn1" editable="true" edit_style="true">
      <rect x="10" y="10" width="28" height="28" style="stroke: #00ff00; stroke-width: 2; fill: #00aabb;" />
      <line x1="24" y1="10" x2="24" y2="0" style="stroke: #00ff00; stroke-width: 2;" />
      <line x1="24" y1="38" x2="24" y2="48" style="stroke: #00ff00; stroke-width: 2;" />
    </g>
  </defs>
  <defs>
    <g id="vn2" editable="true" edit_style="true">
      <rect x="10" y="10" width="28" height="28" style="stroke: #00ff00; stroke-width: 2; fill: #00aabb;" />
      <line x1="24" y1="10" x2="24" y2="0" style="stroke: #00ff00; stroke-width: 2;" />
      <line x1="24" y1="38" x2="24" y2="48" style="stroke: #00ff00; stroke-width: 2;" />
      <g id="vn3" editable="true" edit_style="true">
        <rect x="10" y="10" width="28" height="28" style="stroke: #00ff00; stroke-width: 2; fill: #00aabb;" />
        <line x1="24" y1="10" x2="24" y2="0" style="stroke: #00ff00; stroke-width: 2;" />
        <line x1="24" y1="38" x2="24" y2="48" style="stroke: #00ff00; stroke-width: 2;" />
      </g>
    </g>
  </defs>
  <use xlink:href="#vn" x="0" y="0" active="true" />
  <rect x="10" y="10" width="28" height="28" style="stroke: #00ff00; stroke-width: 2; fill: #00aabb;" />
  <use xlink:href="#vn1" x="0" y="0" active="true" />
</svg>
Код, который выводит в консоль выглядит так
Код:
public class WorkXmlLinq
    {
         public static void ReadXmlFile(string filename)
        {
            // Создаем экземпляр Xml документа.
            var doc = new XDocument();

            // Загружаем данные из файла.
            doc= XDocument.Load(filename);

            var Doc = doc.Elements();

            // Получаем корневой элемент документа.
            var Root = doc.Root.Elements();

            Console.WriteLine();
            foreach (var elem in Root)
            {
                PrintElementV1(elem);
                Console.WriteLine();
            }
        }

        // ------------------------------------------------------------------------------------------
        private static void PrintElementV1(XElement elem, int n = 0)
        {
            if (elem.Elements().Count() > 0)
            {
                Console.WriteLine();
                Console.Write($"{new string('\t', n)}{string.Concat(elem.Name.LocalName, " (", Convert.ToString(n), ") ") }  ");

                foreach (XAttribute attr in elem.Attributes())
                {
                    Console.Write($"{attr.Name.LocalName} = ");
                    Console.Write($"[{attr.Value}] ");
                }

                foreach (XElement e in elem.Elements())
                {
                    PrintElementV1(e, n++);
                }
            }
            else
            {
                Console.WriteLine();
                Console.Write($"{new string('\t', 0)}{string.Concat(elem.Name.LocalName, " (", Convert.ToString(n), ") ", elem.Value)}  ");
 
                foreach (XAttribute attr in elem.Attributes())
                {
                    Console.Write($"{attr.Name.LocalName} = ");
                    Console.Write($"[{attr.Value}] ");
                }
            }
        }
}
При использовании рекурсивного кода вообще можно получить желаемый результат ? например меня итересует 3-е вложение, то для вызова в другом месте мне надо знать индексы
Элемент.Дочка[index?].Дочка[index?].Дочка[index?].Атрибут такой-то
melky вне форума Ответить с цитированием
Старый 30.03.2020, 08:40   #2
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию

Номер индекса в корне сохранить легко, добавив переменную для цикла foreach в чтении Xml

Элемент.Дочка_корня[index_Известен].Дочка[index?].Дочка[index?].Атрибут такой-то

А вот как дальше сохранять индексы ?
melky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно помощи, Нужно воссоздать программу с помощи кода или найти(создать) программу для отпечатки пальцев diabloll-007 Помощь студентам 1 04.06.2016 01:28
Из SQL в LINQ vermond Помощь студентам 5 21.12.2014 17:28
LINQ to SQL VB Silvan90 Общие вопросы .NET 2 26.02.2014 16:34
LINQ C# sir.andrey Помощь студентам 5 29.09.2011 11:52
Sql to Linq VB Silvan90 Помощь студентам 5 02.08.2011 12:35