Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# / Тема лекция XML.doc
Скачиваний:
31
Добавлен:
03.06.2015
Размер:
138.24 Кб
Скачать

Тема: Функции XML в C#

XML (англ. eXtensible Markup Language — расширяемый язык разметки)  — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML), иногда называемых словарями. XML является упрощённым подмножеством языка SGML.

<?xmlversion="1.0"encoding="UTF-8"?>

<user>

  <u41981016dcbe4d3c97150172c6c933be>

    <data>14 июля 2010 г.</data>

    <fio>Иванов Иван Иванович</fio>

    <placework>Энтелс</placework>

    <post>инженер</post>

    <ofvisit>пропуск</ofvisit>

    <cabinet>503</cabinet>

    <ccomutext>Мурманов С.А</ccomutext>

   </u41981016dcbe4d3c97150172c6c933be>

</user>

 Объявление XML.

Первая строка XML-документа называется объявлением XML – это необязательная строка, указывающая версию стандарта XML (обычно это 1.0), также здесь может быть указана кодировка символов и внешние зависимости.

<?xml version="1.0" encoding="UTF-8"?>

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

<title>Простой хлеб</title>

   Далее мы рассмотрим основные операции над XML  файлами.

Для работы с Xml нам необходимо подключить дерективу:

using System.Xml;

Итак, давайте будем двигаться с самого начала от создания xml файла до его чтения, записи и изменения.

Создание XML.

XmlDocument xmldoc; XmlNode xmlnode; XmlElement xmlelem; xmldoc = new XmlDocument(); //Добавляем объявление XML xmlnode=xmldoc.CreateNode(XmlNodeType.XmlDeclaration,"",""); xmldoc.AppendChild(xmlnode); //Добавляем родительский элемент xmlelem=xmldoc.CreateElement("","user",""); xmldoc.AppendChild(xmlelem); try { xmldoc.Save("DataUsers.xml"); //Сохраняем файл } catch { MessageBox.Show("Ошибка работы с файлом","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); }

Добавлениезаписив XML.

Для удобства я использовал в качестве дочернего элемента GUID, что предотвращает совпадение в наименование узлов:

string sGUIDn = String.Format("u{0}",System.Guid.NewGuid().ToString("N")); XmlDocument xmldoc; //XmlNode xmlnode; //XmlElement xmlelem; XmlElement xmlelem2; XmlElement xmlelem3; XmlText xmltext; xmldoc=new XmlDocument(); xmldoc.Load("DataUsers.xml"); //let's add another element (child of the root) xmlelem2=xmldoc.CreateElement("",sGUIDn,""); xmldoc.ChildNodes.Item(1).AppendChild(xmlelem2); //Добавлениее даты xmlelem3=xmldoc.CreateElement("","data",""); xmltext=xmldoc.CreateTextNode(VisitDate.Value.ToString("D")); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее ФИО xmlelem3=xmldoc.CreateElement("","fio",""); xmltext=xmldoc.CreateTextNode(Femli.Text+" "+Imy.Text+" "+Otch.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее местра работы xmlelem3=xmldoc.CreateElement("","placework",""); xmltext=xmldoc.CreateTextNode(PlacWork.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее должности xmlelem3=xmldoc.CreateElement("","post",""); xmltext=xmldoc.CreateTextNode(Dolgn.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее цели визита xmlelem3=xmldoc.CreateElement("","ofvisit",""); xmltext=xmldoc.CreateTextNode(Celvisit.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее номера кабинета xmlelem3=xmldoc.CreateElement("","cabinet",""); xmltext=xmldoc.CreateTextNode(Cabinet.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //Добавлениее к кому едит xmlelem3=xmldoc.CreateElement("","ccomutext",""); xmltext=xmldoc.CreateTextNode(CcomuText.Text); xmlelem3.AppendChild(xmltext); xmlelem2.AppendChild(xmlelem3); //let's try to save the XML document in a file: C:\pavel.xml try { xmldoc.Save("DataUsers.xml"); //I've chosen the c:\ for the resulting filepavel.xml Close(); } catch { MessageBox.Show("Ошибка работы с файлом","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); Close(); }

Изменение записи в XML.

Где, в нашем случае, NameUsel-GUID узла.

XmlDocument xmldoc = new XmlDocument(); xmldoc.Load("DataUsers.xml"); //ищем посетителя XmlNode file = xmldoc.SelectSingleNode("//user/"+NameUsel); //Обновление Даты XmlNode node = file.SelectSingleNode("data"); comment.InnerText = VisitDate.Value.ToString("D"); //Обновление ФИО node = file.SelectSingleNode("fio"); node.InnerText = Femli.Text+" "+Imy.Text+" "+Otch.Text; //Обновление места работы node = file.SelectSingleNode("placework"); node.InnerText = PlacWork.Text; //Обновление должности node = file.SelectSingleNode("post"); node.InnerText = Dolgn.Text; //Обновление цели визита node = file.SelectSingleNode("ofvisit"); node.InnerText = Celvisit.Text; //Обновление номера кабинета node = file.SelectSingleNode("cabinet"); node.InnerText = Cabinet.Text; //Обновлене к кому едит node = file.SelectSingleNode("ccomutext"); comment.InnerText = CcomuText.Text; try { xmldoc.Save("DataUsers.xml"); Close(); } catch { MessageBox.Show("Ошибка работы с файлом","Error",MessageBoxButtons.OK,MessageBoxIcon.Error); Close(); } //можно сразу XmlNode comment = xml.SelectSingleNode("//files/file.txt/comment");

Чтение одной записи  XML.

XmlDocument xmldoc = new XmlDocument(); xmldoc.Load("DataUsers.xml"); //ищем посетителя XmlNode file = xmldoc.SelectSingleNode("//user/"+NameUsel); //Загрузка Даты XmlNode comment = file.SelectSingleNode("data"); VisitDate.Value = Convert.ToDateTime(comment.InnerText) ; //Загрузка ФИО comment = file.SelectSingleNode("fio"); char [] cDividCh = {' '} ; //Разделяем на строки string[] segmenTo = comment.InnerText.Split(cDividCh); Femli.Text= segmenTo[0]; Imy.Text= segmenTo[1]; Otch.Text= segmenTo[2]; //Загрузка места работы comment =file.SelectSingleNode("placework"); PlacWork.Text = comment.InnerText; //Загрузка должности comment = file.SelectSingleNode("post"); Dolgn.Text =comment.InnerText; //Загрузка цели визита comment = file.SelectSingleNode("ofvisit"); Celvisit.Text = comment.InnerText; //Загрузка номера кабинета comment = file.SelectSingleNode("cabinet"); Cabinet.Text= comment.InnerText; //Загрузка к кому comment = file.SelectSingleNode("ccomutext"); CcomuText.Text= comment.InnerText;

Чтение всего  XML.

string sNameUsel=""; string[] sValue={"","","","","","",""}; string sEndDoc; string sNameUselData=""; int nCountUser=1; ViewUser.Items.Clear(); ViewUser.Refresh(); XmlTextReader reader = new XmlTextReader ("DataUsers.xml"); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: //Узел является элементом. { sNameUselData= reader.Name; //Определение индентификатора узла if(reader.Name != "user" && reader.Name != "data" && reader.Name != "fio" && reader.Name != "placework" && reader.Name != "post" && reader.Name != "ofvisit" && reader.Name != "cabinet" && reader.Name != "ccomutext") sNameUsel = reader.Name; } break; case XmlNodeType.Text: // Вывести текст в каждом элементе. { switch(sNameUselData) { case "data": sValue[0] = reader.Value; break; case "fio": sValue[1] = reader.Value; break; case "placework": sValue[2] = reader.Value; break; case "post": sValue[3] = reader.Value; break; case "ofvisit": sValue[4] = reader.Value; break; case "cabinet": sValue[5] = reader.Value; break; case "ccomutext": sValue[6] = reader.Value; break; } } break; case XmlNodeType.EndElement: // Вывести конец элемента. { sEndDoc = reader.Name; if(sEndDoc == "ccomutext") { DateTime dData = Convert.ToDateTime(sValue[0]); bool bPrint=false; ListViewItem item1 = new ListViewItem("",0); item1.Tag = sNameUsel; if(nCountUser<10) item1.SubItems.Add("0"+Convert.ToString(nCountUser)); else item1.SubItems.Add(Convert.ToString(nCountUser)); item1.SubItems.Add(sValue[0]); item1.SubItems.Add(sValue[1]); item1.SubItems.Add(sValue[2]); item1.SubItems.Add(sValue[3]); item1.SubItems.Add(sValue[4]); item1.SubItems.Add(sValue[5]); item1.SubItems.Add(sValue[6]); //Add the items to the ListView. ViewUser.Items.AddRange(new ListViewItem[]{item1}); nCountUser++; } for(int i=0; i sValue[i]=""; } break; } } reader.Close();

Самый стандартный и простой способ записи данных в xml файл из c#

try

{

XmlTextWriter writer = new XmlTextWriter(filepath, Encoding.UTF8);

writer.Formatting = Formatting.Indented;

writer.WriteStartDocument();

writer.WriteStartElement("parameters");

 

// Пример записи в цикле

foreach(DictionaryEntry d in wd)

{

// Начинаем записывать значение parameter

writer.WriteStartElement("parameter");

 

// Записываем атрибут

writer.WriteAttributeString("name", "id");

 

// Записываем еще 2 значения в текущее значение

writer.WriteElementString("name", ((WorkingData)d.Value).getName());

writer.WriteElementString("group", ((WorkingData)d.Value).getGroup());

 

// Закрываем наше значение parameter

writer.WriteEndElement();

}

 

writer.WriteEndElement(); // Закрываем значение parameters

writer.WriteEndDocument(); // Закрываем элемент

writer.Flush();

writer.Close();

}

catch (Exception) { }

Приведенным ниже способом можно прочитать XML файл любой структуры и вложенности. Для увеличения или уменьшения глубины вложенности необходимо увеличить или убрать циклы соответствующие циклы for

using System;

using System.Collections.Generic;

using System.Xml;

using System.Text;

 

namespaceClassLibrary1

{

public class Class1

{

try

{

XmlDocument doc = new XmlDocument();

doc.Load(@filepath);// загружается XML-файл

XmlNodeList nodes = doc.ChildNodes;

 

// Обходим значения

foreach (XmlNode n in nodes)

{

// Обрабатываем в цикле только parameters

if ("parameters".Equals(n.Name))

{

// Читаем в цикле вложенные значения parameter

for (XmlNode d = n.FirstChild; d != null; d = d.NextSibling)

{

// Обрабатываем в цикле только parameter

if ("parameter".Equals(d.Name))

{

//Можно, например, в этом цикле, да и не только..., взять какие-то данные

for (XmlNode k = d.FirstChild; k != null; k = k.NextSibling)

{

if ("name".Equals(k.Name))

{

id = d.Attributes.GetNamedItem("id").Value; // Так обрабатываем атрибуты

name =k.FirstChild.Value;// Так обрабатываем значения

}

else if ("group".Equals(k.Name) && k.FirstChild != null) // + проверка на НУЛЛ

{

group =k.FirstChild.Value;// Присваиваем значение какой либо переменной

}

}

}

}

}

}

}

catch (Exception e) { MessageBox.Show("exeption" + e.Message); }

}

}

Работа с файлами в c#

На этой лекции вы узнаете, как работать с директориями и файлами в системе. Кроме того, мы обсудим вопросы чтения и записи в файл, используя мощные классы .NET.

Соседние файлы в папке C#