Среда, 24.04.2024, 23:24
Приветствую Вас Гость | RSS
Главная | БЛОГ | Регистрация | Вход
Меню сайта
Форма входа
Категории раздела
WEB-Дизайн [2]
HTML, CSS, JAVA-Script
PHP [2]
Описание языка, скрипты, работа с MySQL
Технология .NET [6]
C#, ASP, основные принципы
Операционные системы [1]
Linux [1]
Все о Linux.
Бытиё [1]
Моя жизнь, мысли, переживания и размышления...
Поиск
Календарь
«  Март 2009  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Архив записей
Наш опрос
На каком языке вы предпочитаете программировать?
Всего ответов: 791
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Блог йуного кодера
Главная » 2009 » Март » 20 » C# и XML. Удобный способ хранения данных. Часть первая
11:06
C# и XML. Удобный способ хранения данных. Часть первая
Было время, когда я скептически смотрел на возможность хранения данных в XML формате. Но когда рассмотрел подобную возможность более подробно и испробовал в работающих проектах, был приятно удивлен. При должном проектировании, получается довольно неплохая локальная база данных с быстрым доступом. А главное есть возможность установить не сложное взаимодействие с ней посредством C#. Разберем работу C# и XML на примере хранения логинов и паролей.

Создадим интерфейс для ввода логинов и паролей в локальную базу, а так же извлечения оных оттуда. База состоит из трех полей: id записи (id), логин (login) и пароль(password). На форме у нас будет 2 текстовых поля добавления (txtWLogin, txtWPassword), кнопка для добавления (btnWrite), поле для ввода айдишника, по которому будем выводить записи (txtID) и соответственно 2 поля для вывода найденных данных (txtRLogin, txtRPassword.). ID для каждой записи будет уникальным.

Во-первых, не забудем добавить пространства имен XML, IO для работы с XML документами и файлами соответственно:

  1. using System.Xml;  
  2. using System.IO;  

Создание документа:

  1. private void CreateXMLDocument(string filepath)  
  2. {  
  3.     XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32);  
  4.     xtw.WriteStartDocument();  
  5.     xtw.WriteStartElement("users");  
  6.     xtw.WriteEndDocument();  
  7.     xtw.Close();  
  8. }  

Выше описана функция создания нового XML документа с входящим параметром в виде названия файла. В ней мы создаем объект XmlTextWriter, в котором указываем путь к файлу и кодировку документа. Далее создаем заголовок документа (“users”) и с помощью метода Close() закрываем объект. После закрытия, документ автоматически сохраняется. При создании и компиляции проекта данный файл у нас будет находиться в папке Debug (Visual Studio 2005)

Нужно учесть, что мы не всегда будем создавать новый документ, поэтому при загрузке формы необходимо проверять его наличие. Если файл отсутствует, то создаем его, если же файл уже создан, то функцию реализовывать мы не будем:

  1. if (!File.Exists("users.xml"))  
  2.                 CreateXMLDocument("users.xml");  

Содержание файла у нас должно получиться следующим :


Запись в документ.

  1. private void WriteToXMLDocument(string filepath, string name, string pwd)  
  2. {  
  3.     XmlDocument xd = new XmlDocument();  
  4.     FileStream fs = new FileStream(filepath, FileMode.Open);  
  5.     xd.Load(fs);  
  6.   
  7.     // Создаем новую запись USER c аттрибутом следующего id  
  8.     XmlElement user = xd.CreateElement("user");  
  9.     user.SetAttribute("id", “1”);  
  10.   
  11.     // Создаем 2 поля логин и пароль  
  12.     XmlElement login = xd.CreateElement("login");  
  13.     XmlElement pass = xd.CreateElement("password");  
  14.   
  15.     // Создаем 2 записи логина и пароля  
  16.     XmlText tLogin = xd.CreateTextNode(name);  
  17.     XmlText tPassword = xd.CreateTextNode(pwd);  
  18.   
  19.     login.AppendChild(tLogin); // Забиваем значение логина в поле LOGIN  
  20.     pass.AppendChild(tPassword); // Забиваем значение пароля в поле PASSWORD  
  21.       
  22.     // Забиваем поля LOGIN и PASSWORD в запись USER  
  23.     user.AppendChild(login);   
  24.     user.AppendChild(pass);  
  25.   
  26.     // ЗАбиваем запись в документ  
  27.     xd.DocumentElement.AppendChild(user);  
  28.   
  29.     fs.Close();         // Закрываем поток  
  30.     xd.Save(filepath); // Сохраняем файл  
  31. }  

Документ у нас должен состоять из основного объекта со свойством в виде айдишника и его дочерних объектов в виде логина и пароля. Выглядеть он будет так:

  1. <users>  
  2. <user id="1">  
  3. <login>hitechlogin>  
  4. <password>qwertypassword>  
  5. user>  
  6. users>  

Думаю, с помощью комментариев в коде разобраться будет не сложно. Нужно только обратить внимание на значение поля ID. В данном случае мы забиваем единицу, но это только для примера. Как было сказано выше, это поле у нас будет уникальным, и поэтому функцию добавления айдишника я опишу немного позже. Сейчас приступим к разбору функции чтения данных из файла.

Чтение из документа.

Попробуем вывести запись логина и пароля из документа по ее айдишнику:

  1. private void ReadXMLDocument(string filepath, string pid)  
  2. {  
  3.     string name, pwd; // Новые переменные имени и пароля  
  4.   
  5.     // Объявляем и забиваем файл в документ  
  6.     XmlDocument xd = new XmlDocument();  
  7.     FileStream fs = new FileStream(filepath, FileMode.Open);  
  8.     xd.Load(fs);  
  9.   
  10.     XmlNodeList list = xd.GetElementsByTagName("user"); // Создаем и заполняем лист по тегу "user"  
  11.     for (int i = 0; i < list.Count; i++)  
  12.     {  
  13.         XmlElement id = (XmlElement)xd.GetElementsByTagName("user")[i];         // Забиваем id в переменную  
  14.         XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i];      // Забиваем login в переменную  
  15.         XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i];   // Забиваем password в переменную  
  16.           
  17.         if (id.GetAttribute("id") == pid) // Если наткнулся на нужный айдишник  
  18.         {  
  19.             // Вставляем в переменные текст из тегов  
  20.             name = user.InnerText;  
  21.             pwd = pass.InnerText;  
  22.   
  23.             // Заполняем поля на форме  
  24.             txtRLogin.Text = name;  
  25.             txtRPassword.Text = pwd;  
  26.             break;  
  27.         }  
  28.         else  
  29.         {  
  30.             // Чистим поля на форме  
  31.             txtRLogin.Text = "";  
  32.             txtRPassword.Text = "";  
  33.         }  
  34.     }  
  35.     // Закрываем поток  
  36.     fs.Close();  
  37. }  

Итак. Входящие параметры – файл и айдишник, по которому будем искать в базе значения. ID вводится в специальное поле на форме (это если кто забыл). Как и в функции записи создаем объекты XML документа и «файлового» потока. Забиваем файл в документ. Создаем лист нужных нам элементов XML . В данный момент это главные элементы «user» с параметром ID. Далее запускаем цикл, который проверяет все значения ID. Во время цикла программа инициализирует новые элементы XmlElement. В момент, когда цикл натыкается на нужное нам значение айдишника, сразу новым переменным логина и пароля присваиваются найденные значения методом InnerText (находит текст, указанный в данном элементе). И заполняются соответственно поля на форме. Так как ID у нас уникален, программе больше искать нечего и цикл прерывается. Если ничего не находит значения в полях обнуляются. Ну и не забыть закрыть поток.

Категория: Технология .NET | Просмотров: 41561 | Добавил: dblog | Рейтинг: 3.8/9
Всего комментариев: 201 2 »
1 Яша  
0
Как быть при чтении из документа выдает ошибку на строке
FileStream fs = new FileStream(filepath, FileMode.Open);
не может открыть файл так как его занят другой процесс?

2 art  
0
Яша (23.06.2009 12:16)
Как быть при чтении из документа выдает ошибку на строке
FileStream fs = new FileStream(filepath, FileMode.Open);
не может открыть файл так как его занят другой процесс?

Ошибка из-за string id = MaxID("users.xml");
я немного изменил
private void WriteToXMLDocument(string filepath, string id,string name, string pwd)
добавил string id
дальше перед вызовом WriteToXMLDocument
string id = MaxID("users.xml");
WriteToXMLDocument("users.xml",id, txtWLogin.Text, txtWPassword.Text);
и будет счастье


3 leaderru  
0
А какой код писать на кнопку? Чтобы по нажатию на кнопку файл заполнялся?

4 Roman Golubin  
0
Я не понимаю людей, которые для записи данных в xml сначала его целиком читают в память. Имхо, правильный ход - открывать файл для ДОЗАПИСИ и дописывать фрагменты xml. Соответственно, XmlWriter и XmlReader должны быть созданы в режиме ConformanceLevel.Fragment. Так же стоит, вероятно, почитать про immutable объекты данных.

5 migs  
0
Огромное спасибо!!!
Очень помогло наконец то разобраться с системой чтения/записи xml. Действительно очень удобная статья.

6 Aksis  
0
Огромное спасибо за статью!!!
Очень помогла!!!

7 saadli  
0
A good tutorial of C# XML

http://csharp.net-informations.com/xml/csharp-xmltutorial.htm

sal

8 beats studio  
0
Sorry blogster it was easier for some of us to see our mess the old way instead..of this way

9 wendytozrkp  
0
Как купить карта клиента в в сеть немецких торговых центров МЕТРО Cash&Carry Москва 8(967)143-66-53
Официально по юридическому договору сделаем на физических лиц и сотрудников учереждений карты клиента метро в сеть немецких гипермаркетов "Метро":карточка metro обязательно с вашей фотографией(делается при вас в самом магазине Метро Кэш энд Керри),с номером,штрих - кодом,со специальной магнитной полосой, названием организации, от которой вы будете нами зарегистрированы и оформлены. Вы можете проводить с собой двоих человек. Карточки метро оформляются: на граждан Российской Федерации и иностранцев.Оформление производится без предоплаты, то есть вначале мы регистрируем и оформляем вас,вы получаете карточки metro, потом оплачиваете. Оплата производится в течение одного рабочего дня после оформления через Сбербанк ,немецкие магазины МЕТРО работают круглосуточно.Срок действия пропуска в метrо 3 года, по истечении этого срока договор перезаключается по взаимному согласию сторон.Для оказания этой услуги мы находим фирмы, у которых есть свободные места в этих супермаркетах,и заключаем с ними соответствующие договора, по которым фирмы обязуются предоставить вам право пользоваться их местами в этих магазинах сроком на три года. Регистрация производятся в разных немецких торговых центрах Metro CASH & CARRY, по выбору юридических лиц в соответствии с их территориальным месторасположением. Получив карты клиента метро в одном из немецких магазинов МETRO Cash&Cаrry вы можете ей пользоваться в любых других магазинах этой сети магазинов МETRO CASH and CARRY в РФ и за рубежом.
Для заказа карты метро в сеть супермаркетов МETRO Cash and Cаrry звоните: 8(967)143-66-53

10 smaceawlilicy  
0
[url=http://silven.ru/khkhkh-onlajjn/]
порно ролики бесплатно смотреть онлайн[/url]

1-10 11-20
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Бесплатный хостинг uCozCopyright MyCorp © 2024