Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67

Десериализация Xml с несколькими блоками

22.08.2017, 22:53. Показов 1781. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть файл, в котором хранится информация об аккаунтах
XML
1
2
3
4
5
6
<Account>
    <Login>test@mail.ru</Login>
    <Password>test</Password>
    <Nickname>testnick</Nickname>
</Account>
...
Подобных аккаунтов много. Использую метод десериализации xml

Есть код:
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
35
36
37
38
39
40
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            DeserializeObject("AccountsList.xml");
        }
 
        public void DeserializeObject(string filename)
        {
 
            XmlSerializer serializer = new XmlSerializer(typeof(Account));
 
            Account i;
 
            using (Stream reader = new FileStream(filename, FileMode.Open))
            {
                i = (Account)serializer.Deserialize(reader);
            }
 
            label1.Text = i.Login;
            label2.Text = i.Password;
            label3.Text = i.Nickname;
        }
    }
 
    public class Account
    {
        [XmlElement]
        public string Login;
        [XmlElement]
        public string Password;
 
        [XmlElement]
        public string Nickname;
    }
Так я могу получить параметры с одного аккаунта. А как, например, придать каждому аккаунту какой-нибудь номер и получать данные определённого аккаунта по его номеру? Ну или что-то подобное. Помогите, пожалуйста. Заранее спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2017, 22:53
Ответы с готовыми решениями:

Десериализация XML
Добрый день. Помогите десериализовать XML. Есть Xml http://planetakino.ua/kharkov/showtimes/xml/ Мне нужно десерилозовать с него...

XML десериализация
Здравствуйте, помогите пожалуйста разобраться. &lt;?xml version=&quot;1.0&quot; encoding=&quot;koi8-r&quot;?&gt; &lt;span&gt; &lt;li id=&quot;8120&quot;&gt;...

Десериализация XML
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;response list=&quot;true&quot;&gt; &lt;user&gt; &lt;id&gt;205387401&lt;/id&gt; &lt;first_name&gt;Tom&lt;/first_name&gt; ...

7
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
22.08.2017, 23:05
Zrefer, еще раз, что не получается, ибо я ничего не понял?
0
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67
23.08.2017, 00:53  [ТС]
some_name, Не получается придумать, как подобным образом брать данные нужного аккаунта, ибо если аккаунтов в файле много, то получает он не пойми какой. Нужно придать каждому аккаунту в файле, например, номер и брать параметры аккаунта с нужным номером.
Вот как это реализовать у меня придумать и не получается
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
23.08.2017, 07:26
Не совсем хорошая затея, делать из XML базу данных.
Цитата Сообщение от Zrefer Посмотреть сообщение
Не получается придумать, как подобным образом брать данные нужного аккаунта, ибо если аккаунтов в файле много, то получает он не пойми какой. Нужно придать каждому аккаунту в файле, например, номер и брать параметры аккаунта с нужным номером.
Можно предварительно прочитать файл, взяв информацию по аккаунтам, выгрузить в какой-нибудь контейнер и далее работать с ним.
Или же, пользоваться поиском по содержимому, т.е., например, парсите файлы на наличие такого-то логина или пароля, как находите - читаете файл и т.д.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,894
Записей в блоге: 1
23.08.2017, 07:59
Zrefer, вместо одного Account лучшего сериализовать List<Account> или Account[]. Это даст "номер" автоматически. Хотя ориентироваться на него я бы не стал. Главным идентификатором аккаунта является логин, а не какой-то номер который зависит от порядка создания.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
23.08.2017, 07:59
Цитата Сообщение от Zrefer Посмотреть сообщение
ибо если аккаунтов в файле много, то получает он не пойми какой.
Нужно десериализовать содержимое ВСЕГО файла. На руки получите коллекцию аккаунтов. По этой коллекции можно выполнить поиск (да и вообще свободно с её содержимым работать).

Если данных ну совсем много, то десериализовывать их может быть накладно (особенно, если нужно что-то по-мелочи сделать\прочитать). Тогда быстрее будет воспользоваться Linq To XML (встроенная возможность .NET): ручная работа с узлами распаршенного дерева документа. Это не так удобно как с нормальными объектами работать, зато быстрее.
0
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67
23.08.2017, 22:04  [ТС]
Usaga, Можно пример кода какого-нибудь, пожалуйста?

Добавлено через 1 час 37 минут
OwenGlendower, Так вот проблема в том, что я попросту не знаю, как реализовать ни через List, ни просто поиском по нужному логину, есть у вас пример какой-нибудь? Облегчило бы задачу
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
24.08.2017, 06:21
Лучший ответ Сообщение было отмечено Zrefer как решение

Решение

Zrefer, вот вариант с десериализацией:

Кликните здесь для просмотра всего текста

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
 
namespace NetExperiments
{
    [XmlType("Accounts")]
    public class AccountsCollection
    {
        [XmlElement("Account")]
        public List<Account> Accounts;
    }
 
    public class Account
    {
        [XmlElement]
        public string Login;
        [XmlElement]
        public string Password;
        [XmlElement]
        public string Nickname;
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(AccountsCollection));
 
            using (var reader = new StringReader(Resource1.XmlData))
            {
                var accounts = (AccountsCollection)serializer.Deserialize(reader);
 
                Console.WriteLine($"Found items: {accounts.Accounts.Count()}\r\n");
 
                foreach(var account in accounts.Accounts)
                {
                    Console.WriteLine("   Login: {0}", account.Login);
                    Console.WriteLine("Password: {0}", account.Password);
                    Console.WriteLine("Nickname: {0}", account.Nickname);
 
                    Console.WriteLine();
                }
            }
 
            Console.WriteLine("Done");
            Console.ReadKey();
        }
    }
}


Подразумевается работа с таким XML-документом:
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<Accounts>
    <Account>
        <Login>test1@mail.ru</Login>
        <Password>test1</Password>
        <Nickname>testnick1</Nickname>
    </Account>
    <Account>
        <Login>test2@mail.ru</Login>
        <Password>test2</Password>
        <Nickname>testnick2</Nickname>
    </Account>
    <Account>
        <Login>test3@mail.ru</Login>
        <Password>test3</Password>
        <Nickname>testnick3</Nickname>
    </Account>
</Accounts>


Добавлено через 24 минуты
А вот так можно было бы сделать через LINQ to XML (с тем же документом):

Кликните здесь для просмотра всего текста

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
using System;
using System.Linq;
using System.IO;
using System.Xml.Linq;
 
namespace NetExperiments
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var reader = new StringReader(Resource1.XmlData))
            {
                var xDoc = XDocument.Load(reader);
                var accountsElement = xDoc.Element("Accounts");
 
                var accounts = accountsElement.Elements();
                Console.WriteLine($"Found items: {accounts.Count()}");
 
                foreach (var element in accounts)
                {
                    Console.WriteLine("   Login: {0}", element.Element("Login").Value);
                    Console.WriteLine("Password: {0}", element.Element("Password").Value);
                    Console.WriteLine("Nickname: {0}", element.Element("Nickname").Value);
 
                    Console.WriteLine();
                }
            }
 
            Console.WriteLine("Done");
            Console.ReadKey();
        }
    }
}


Добавлено через 4 минуты
Как видно, объектная модель более громоздка, но с ней удобнее и безопаснее работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.08.2017, 06:21
Помогаю со студенческими работами здесь

Десериализация XML
Коллеги, помогите десериализовать данные &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Body&gt; &lt;Данные&gt; &lt;Отдел...

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

Десериализация XML
Есть окошко, которое делает &quot;Вход в систему&quot;. Для входа нужен username, password, они хранятся в xml файле. И нужно десериализовать всю эту...

Десериализация XML
есть XML документ, изменить формат не получится &lt;Points&gt; &lt;Point IsRequired=&quot;1&quot; X=&quot;0&quot; Y=&quot;0&quot; Z=&quot;0&quot;/&gt; ...

Десериализация XML
Нужна помощь в десериализации XML &lt;rss version=&quot;2.0&quot; xmlns:media=&quot;http://search.yahoo.com/mrss/&quot;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru