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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2018, 11:29   #1
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию Коллекцию атрибутов XML записать в List

Добрый день, всем.
Никак не могу разобраться как коллекцию атрибутов XML записать в List

Используется System.XML
Свойство Attributes возвращает объект XmlAttributeCollection, который представляет коллекцию атрибутов

List<xxx> = new List<xxx>(Attributes); дает ошибку
А как правильно делать вызов не могу найти даже на msdn
melky вне форума Ответить с цитированием
Старый 27.05.2018, 13:47   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

XmlAttributeCollection умеет только IEnumerable и не умеет Generic вариант. Соответственно нужно пробовать кастовать:
Код:
List<XmlAttribute> attr = Attributes.Cast<XmlAttribute>().ToList();
не перепроверял, так что может не будет работать, если вдруг энумератор не по XmlAttribute типу бегает. Нужен подключенный using System.Linq
pu4koff вне форума Ответить с цитированием
Старый 27.05.2018, 17:34   #3
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию

Хм, попробую почитать про Cast, может подойдет.
Встречал такую вот запись
Link<IEnumerable<????>> listattr = new Link<IEnumerable<????>> Но там было связано не с атрибутами XML а чем-то другим и не удалось понять что же требуется.

вместо вопросом был то ли объект то ли еще что-то уже не помню... в общем тоже все валилось с ошибкой.
melky вне форума Ответить с цитированием
Старый 27.05.2018, 19:14   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

можно и без каста (точнее без linq) через цикл сделать:
Код:
List<XMLAttribute> attr = new List<XmlAttribute>();
foreach (var item in Attributes)
{
  attr.Add((XmlAttribute)item);
}
pu4koff вне форума Ответить с цитированием
Старый 27.05.2018, 20:37   #5
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию

Через циклы пробовал, получается небольшая фигня. У меня Ноды с одинаковым именем, в которых например по 7 одинаковых атрибутов.
Если Нод 3 штуки, то должно быть attr[0][с 0 по 6], attr[1][0-6], attr[2][0-6]
Если Нод 4 то появится еще attr[3][0-6] и так далее

А если делал через циклы добавление в список, то получается один массив [0-6] следующая Нода [7-13] и так далеее.
Такой вариант меня потом в коде не устраивает.
melky вне форума Ответить с цитированием
Старый 27.05.2018, 21:16   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Какая исходная задача в итоге? ничего не понятно.
Код:
            XmlDocument doc = new XmlDocument();
            doc.Load(@"D:\temp\xml.xml");
            var nodes = doc.SelectNodes("root/item")
                .Cast<XmlElement>()
                .SelectMany(n => n.Attributes.Cast<XmlAttribute>());
Этот код выдаст список атрибутов всех элементов item, находящихся в элементе root. Сначала в списке будут атрибуты первого элемента, потом второго,...
Если нужно разбитие по элементам, то можно как-то так:
Код:
            XmlDocument doc = new XmlDocument();
            doc.Load(@"D:\temp\xml.xml");
            var nodes = doc.SelectNodes("root/item")
                .Cast<XmlElement>()
                .Select(n => n.Attributes.Cast<XmlAttribute>().ToList()).ToList();
в итоге в nodes[0][0] будет первый атрибут первого элемента.
в nodes[1][0] - первый атрибут второго элемента
pu4koff вне форума Ответить с цитированием
Старый 27.05.2018, 22:51   #7
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию

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

Завтра буду пробовать варианты, которые вы предложили, возможно какой-то подойдет.
Просто сейчас использую запись в List указывая имена атрибутов типа
List<string> mylist = new List<string>;

в коде mylist.Add(new {attr1 = "....GetAtribute("name1").Value , ну и так далее})
Получаю примерно то, что нужно, но приходится указывать имена.
Не удобно использовать данный код как шаблон. Нужен вариант без использования имен.

По сообщению 2 - Attribute не содержит определения для Cast

Последний раз редактировалось melky; 28.05.2018 в 10:52.
melky вне форума Ответить с цитированием
Старый 28.05.2018, 12:32   #8
melky
Пользователь
 
Регистрация: 27.05.2018
Сообщений: 46
По умолчанию

Пока не знаю, победил ли для реализации своей задачи но получаю массивы списков с возможностью обращения по индексам.

Код:
       List<XmlAttributeCollection> myattr = new List<XmlAttributeCollection>();
Код:
              XmlNodeList cmdGroupList = CmdNode.SelectNodes("CmdGroup");
                foreach (XmlElement CmdGroupElem in cmdGroupList)
                {
                    myattr.Add(CmdGroupElem.Attributes);
                 }
Код:
            for (int i = 0; i < myattr[0].Count; i++)
            {
                Console.WriteLine(myattr[0].Item(i).Value);
            }
melky вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с XML XmlTextWriter, List angrystrike C# (си шарп) 2 03.01.2018 20:54
Как в Java вывести в консоль значения атрибутов из файла XML? Hehabr Общие вопросы по Java, Java SE, Kotlin 1 29.04.2016 00:52
Записать DataGrid в XML aliqulu C# (си шарп) 0 14.03.2014 23:53
проверять наличие атрибутов в xml-файле NieL Общие вопросы Delphi 3 24.11.2010 19:31
помогите как записать правильно в xml edik БД в Delphi 0 17.12.2009 15:39