5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690

List<string>. Как сохранить/прочитать в XML?

26.10.2018, 12:14. Показов 5673. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую сохранить/прочитать в XML следующим способом.

Класс CreateList.cs
C#
1
2
3
4
5
6
7
8
9
 public class CreateList
    {
        public List<string> createListBuild()
        {
            var itemsList = new List<string> { "item1", "item2", "item3" };
 
            return itemsList;
        }
    }

Класс ConfigWrapper.cs
C#
1
2
3
4
5
6
7
8
[XmlRoot(Namespace = "", ElementName = "collection")]
 
    public class ConfigWrapper
    {
        [XmlElement("item")]
        public List<string> Items { get; set; }
 
    }
Класс WriteReadList.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 public class WriteReadList
    {
        // Запись в XML
        public void WriteXML(List<string> itemsList)
        {   
            var cfgIn = new ConfigWrapper { Items = itemsList };
            var xs = new XmlSerializer(typeof(ConfigWrapper));
            //string fileContent = "ListXML";
            // string fileContent = @".\ListXML.xml";
            string fileContent = @".\ListXML.xml";
 
            using (var sw = new StringWriter())
            {
                xs.Serialize(sw, cfgIn);
                fileContent = sw.ToString();
                // Console.WriteLine(fileContent);
            }
        }
 
        public void ReadXML(string fileContent)
        {
            ConfigWrapper cfgOut = null;
            using (var sr = new StringReader(fileContent))
            {
                var xs = new XmlSerializer(typeof(ConfigWrapper));
                cfgOut = xs.Deserialize(sr) as ConfigWrapper;
                // cfgOut.Dump(); //view in LinqPad
                // if (cfgOut != null)
                    // yields 'item2'
                    // Console.WriteLine(cfgOut.Items[1]);
            }
 
        }
    }

Логику реализую следующими кнопками:
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
        {
            listWork = createList.createListBuild();
        }

C#
1
2
3
4
5
6
7
8
9
10
11
12
// Сохранить в XML
        private void button3_Click(object sender, EventArgs e)
        {
            // Конфигурация обёртки
            ConfigWrapper config = new ConfigWrapper();
            config.Items = listWork;
 
            WriteReadList writeReadList = new WriteReadList();
 
            writeReadList.WriteXML(config.Items);
 
        }
Как сделать чтобы список сохранялся/читался из XML файла, который расположен рядом с "*.exe" файлом проекта?
Или как это сделать более проще?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2018, 12:14
Ответы с готовыми решениями:

Прочитать содержимое List<Dictionary<string, string>>
Всем привет. Задача следующая: метод возвращает содержимое типа List&lt;Dictionary&lt;string, string&gt;&gt; и мне каким то образом надо...

Из XML считывать ключ/значение в List<string, string>
Привет, друзья. Помогите разобраться. Ничего полезного в интернете не нашел.. Нужно из XML попарно вывести ключ/значение в List. Фрагмент...

Как передать list<string> в поток и как такой же list<string> вывести из потока?
Как передать list&lt;string&gt; в поток и как такой же list&lt;string&gt; вывести из потока в richtextbox? Покажите пример.

12
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
26.10.2018, 13:24
Цитата Сообщение от Soft17 Посмотреть сообщение
Или как это сделать более проще?
JSON использовать.
Цитата Сообщение от Soft17 Посмотреть сообщение
Как сделать чтобы список сохранялся/читался из XML файла, который расположен рядом с "*.exe" файлом проекта?
Вместо StringWriter использовать StreamWriter, то же для StringReader
1
 Аватар для andrey_f
882 / 535 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
26.10.2018, 13:34
Цитата Сообщение от Soft17 Посмотреть сообщение
Или как это сделать более проще?
вы перемудрили, во вложении проект, ознакомьтесь
Вложения
Тип файла: rar xml_writer.rar (56.8 Кб, 48 просмотров)
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.10.2018, 14:59  [ТС]
andreyfreelans,
У меня "List<string>".
Или вы имеете в виду сохранять данные не в List, а в DataTable?
0
 Аватар для andrey_f
882 / 535 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
26.10.2018, 15:08
Цитата Сообщение от Soft17 Посмотреть сообщение
У меня "List<string>".
тогда все еще проще
Цитата Сообщение от Soft17 Посмотреть сообщение
Или вы имеете в виду сохранять данные не в List, а в DataTable?
в примере, который я привел так сделано для наглядности.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.10.2018, 15:20  [ТС]
Цитата Сообщение от andreyfreelans Посмотреть сообщение
тогда все еще проще
не понимаю...
У вас
C#
1
 ds.WriteXml("G:\\Data.xml");
Тогда у меня должно быть
C#
1
2
List<string> listWork;
listWork.WriteXml("G:\\Data.xml");
Но у "listWork" нет метода "WriteXml"...
Или я что-то не так делаю?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
26.10.2018, 15:33
Цитата Сообщение от Soft17 Посмотреть сообщение
Пробую сохранить/прочитать в XML следующим способом.
Вам обязательно через сериализатор делать? Можно проще - записать напрямую. Пример один из примеров Записать List<string> в XML и обратно
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.10.2018, 15:47  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам обязательно через сериализатор делать? Можно проще - записать напрямую. Пример один из примеров
Я пробовал найти, что-то проще... под руку попался более мене понятный и короткий вариант, который я изложил в вопросе.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пример один из примеров
Пример видел ранее...
Но он показывает только как записать...

Как прочитать обратно?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
26.10.2018, 16:06
В простейшем случае сохранение-чтение это по одной строке кода.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            var itemsList = new List<string> { "item1", "item2", "item3" };
            (new XDocument
                (
                    new XElement
                    (
                        "itemsList",
                        itemsList.ConvertAll(item => new XElement("item", item))
                    )
                )
            ).Save(@"ListXML.xml");
 
            var itemListRead = new List<string>
                (
                    (XDocument.Load(@"ListXML.xml"))
                    .Element("itemsList")
                    ?.Elements("item")
                    .Select(item => item.Value)
                );
Добавлено через 9 минут
Чтение, наверное так правильнее будет.
C#
12
13
14
15
16
17
            var itemListRead = 
                    (XDocument.Load(@"ListXML.xml"))
                    .Element("itemsList")
                    ?.Elements("item")
                    .Select(item => item.Value)
                    .ToList();
Добавлено через 3 минуты
Через сериализатор удобно сохранить большие разветвлённые классы, а с простым списком, по моему, больше мороки от него.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.10.2018, 16:08  [ТС]
Элд Хасп,
Если вам, не сложно, не могли бы вы подкорректировать.
Сделать в виде методов...

Метод записи: получает List<string>
Метод чтения: отдаёт List<string>

А то с "var" по моему были какие-то сложности...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
26.10.2018, 16:46
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
Сделать в виде методов...
C#
1
2
3
4
5
        static public void WriteXML(List<string> itemsList)
            => (new XDocument(new XElement("itemsList", itemsList.ConvertAll(item => new XElement("item", item))))).Save(@"ListXML.xml");
 
        static public  List<string> ReadXML(string fileContent)
            =>(XDocument.Load(fileContent)).Element("itemsList")?.Elements("item").Select(item => item.Value).ToList();
Но у Вас неверный подход к этим методам. Они должны по параметрам быть совместимыми. Если в одном задаёте имя файла, то в другом тоже задавайте.
Добавьте для отзеркаливания такие перегрузки этих методов
C#
1
2
3
4
5
        static public void WriteXML(List<string> itemsList, string fileContent)
            => (new XDocument(new XElement("itemsList", itemsList.ConvertAll(item => new XElement("item", item))))).Save(fileContent);
 
        static public List<string> ReadXML()
            =>(XDocument.Load(@"ListXML.xml")).Element("itemsList")?.Elements("item").Select(item => item.Value).ToList();
Добавлено через 28 минут
Можно оформить эти методы как методы расширения
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public static class ListStringExtension
    {
        static public void WriteXML(this List<string> itemsList, string fileContent)
            => (new XDocument(new XElement("itemsList", itemsList.ConvertAll(item => new XElement("item", item))))).Save(fileContent);
        static public void WriteXML(this List<string> itemsList)
            => (new XDocument(new XElement("itemsList", itemsList.ConvertAll(item => new XElement("item", item))))).Save(@"ListXML.xml");
 
        static public List<string> ReadXML(this List<string> itemsList, string fileContent)
            => (XDocument.Load(fileContent)).Element("itemsList")?.Elements("item").Select(item => item.Value).ToList();
        static public List<string> ReadXML(this List<string> itemsList)
            => (XDocument.Load(@"ListXML.xml")).Element("itemsList")?.Elements("item").Select(item => item.Value).ToList();
    }
Тогда их использование будет так
C#
1
2
3
4
            var itemsList = new List<string> { "item1", "item2", "item3" };
 
            itemsList.WriteXML(); // Запись
            var itemsListRead = (new List<string>()).ReadXML(); // Чтение
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.10.2018, 17:15  [ТС]
Элд Хасп,

В форме есть List<string> List_1.
Я читаю XML предложенным вами выражением.
C#
1
var itemsListRead = (new List<string>()).ReadXML(); // Чтение
Как занести "var itemsListRead" в "List_1"?

Добавлено через 21 минуту
Элд Хасп,
Разобрался...
Сделал так
C#
1
listWork = itemsListRead.ToList();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
26.10.2018, 19:22
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
В форме есть List<string> List_1.
Я читаю XML предложенным вами выражением.
C#
1
var itemsListRead = (new List<string>()).ReadXML(); // Чтение
Как занести "var itemsListRead" в "List_1"?
Добавлено через 21 минуту
Элд Хасп,
Разобрался...
Сделал так
C#
1
listWork = itemsListRead.ToList();
Да, правильно. Если быть точным по форме вопроса
Как занести "var itemsListRead" в "List_1"? То так
C#
1
List<string> List_1 = (new List<string>()).ReadXML();
Добавлено через 1 час 49 минут
Почитал чуток нашёл лучший способ вызова для чтения
C#
1
List<string> List_1 = (null as List<string>).ReadXML();
Так не создаётся бесполезный новый объект.

Добавлено через 5 минут
Или так
C#
1
List<string> List_1 = ((List<string>)null).ReadXML();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2018, 19:22
Помогаю со студенческими работами здесь

Записать List<string> в XML и обратно
Здрасте помогите пожалуйста. Мне нужно вот что, создать XML файл через XDocument, а конкретно .. у меня есть Список типа стринг в нём...

Как достать значение из List<List<string>>
Есть JSON в котором лист в листе using System; using Newtonsoft.Json; using System.Collections.Generic; //using...

Как преобразовать List<List<string>> в IList<IList<string>>
Добрый день! Возникла задача преобразования листа в интерфейс листа. Не подскажите как грамотно сделать. В общем, код класса такой: ...

Разбить List<string> на несколько обьектов c List<string>
Задумался как я то кусочками все делить оказалось не так уж просто :scratch: List&lt;string&gt; Разбить на несколько...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например, myList. Сейчас я могу с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru