Создание приложения, работающего с XML-данными

Введение.

В последнее время завовевывает популярность новый формат данных — XML. Одним из его достинств является то, что это самописываемый формат данных, что значительно облечает работу с ним. Тем не менее, многих все еще пугает само слвово «XML». В этой статье я постараюсь доказать простоту и удобтво работы с XML-данными на примере приложения, которое отображает XM_-данные в удобной человеку форме и позволяет редактировать их.

Для начала не будем забираться в дебри пространства имен System.XML, а обойдемся объектом DataSet пространства имен System.Data.

У объекта DataSet есть два замечательных метода: ReadXml() и WriteXml() — первый считывает данные в формате XML в объект DataSet, а второй их выводит. Эти методы перегружены, и позволяют вам как считать данные из файла на диске, или из потока Stream в оперативной памяти, так и вывести как в файл на диске, так и в Stream.

Подготовка формы

Итак приступим к созданию приложения. Для этого создадим новый C#-проект Windows Application. (File — New — Projects в Visual Studio .NET).

Теперь приступим к подготовке формы:

«Бросим» на форму компонент ListBox и дадим ему имя — listTables (имя дается с помощью свойства Name). «Пришвартуем» его к левому краю формы, указав в свойстве Dock значение «Left». Как вы уже догадались — он будет отображать список таблиц в XML — файле.
Затем поместим на форму копмонент Splitter, который позволит нам менять относительные размеры компонентов на форме. И укажем в свойстве Dock — «Left».
Затем поместим на форму объект DataGrid, который будет отображать табличные данные. Обзовем его как dataGrid, а в свойстве Dock укажем — Fill.
Затем поместим на форму еще три компонента (после помещения на форму они отобразятся ПОД формой):

MainMenu — главное меню приложения, назовем его как mainMenu.

OpenFileDialog — диалог открытия файла. Назовем его openFileDialog.

SaveFileDialog — диалог сохранения файла. Понятно, что его будем звать saveFileDialog.

Написание кода

Добавим новую переменную dataSet в класс формы

private DataSet dataSet;

Добавим функцию UpdateListtables(), которая будет обновлять список таблиц в listTables. Для этого она будет просто пробегать по списку таблиц в dataSet и отображать их имена в listTables.

//Обновление списка таблиц 

private void UpdateTableList() 

{ 

//Очищаем список таблиц 

listTables.Items.Clear(); 

//Пробегаемся по таблицам dataSet 

foreach(DataTable table in dataSet.Tables) 

{ 

listTables.Items.Add(table.TableName); 

} 

if(listTables.Items.Count > 0) 

listTables.SelectedIndex = 0; 

}

Затем в конструкторе нашей формы проинициализируем наши компоненты. Свою форму я назвал как DataXmlForm, следовательно конструктор зовется DataXmlForm().

public DataXmlForm() 

{ 

InitializeComponent(); 

//Обавляем фильтр для fileOpenDialog 

openFileDialog.Filter = 

"XML - files (*.xml)|*.xml|All files (*.*)|*.*"; 

//Говорим ему воостанавливать последнюю диреторию 

openFileDialog.RestoreDirectory = true; 


saveFileDialog.Filter = 

"XML - files (*.xml)|*.xml|All files (*.*)|*.*"; 

saveFileDialog.RestoreDirectory = true; 


//Создаем новый DataSet 

//точнее вызываем его контсруктор 

dataSet = new DataSet(); 

}

Теперь будем работать с mainMenu. Набирая наименование пункта в меню в поле, где написано "Type here", мы можем добавить новый пункт.

Итак добавим корневой пункт — File, назовем его menuItemFile. Кликаем по неиу один раз и в раскрывшемся ниже списке добавляем пункты Open (имя — menuItemOpen), Save (menuItemSave), Close (menuItemClose). Кликая два раза по нужному пункту меню, мы можем добавить обработчик. Итак кликнем по 2 раза по пунктам "Open", "Save", "Close" и добавим обработчики на них. В обработчике пункта меню Open будет следующее:

//Открытие файла 

private void menuItemOpen_Click 

(object sender, System.EventArgs e) 

{ 

if(openFileDialog.ShowDialog() == 

DialogResult.OK) 

{ 

//Считывание XML - данных в dataSet 

dataSet.ReadXml(openFileDialog.FileName); 

//Принятие изменений dataSet 

dataSet.AcceptChanges(); 

//Обновление списка таблиц 

this.UpdateTableList(); 

//Изменение заголовка окна 

this.Text = "Data Xml "+openFileDialog.FileName; 

} 

}

Если мы выбираем какой-либо файл, то он считывается в dataSet. Аналогично сохранение файла, а закрытие программы, вообще, можно оставить без комментариев — настолько оно просто:

//Сохранение XML-данных 

private void menuItemSave_Click 

(object sender, System.EventArgs e) 

{ 

saveFileDialog.FileName = openFileDialog.FileName; 

if(saveFileDialog.ShowDialog() == DialogResult.OK) 

{ 

//Запись XML-данных из dataSet на диск 

dataSet.WriteXml(saveFileDialog.FileName); 

//Обновление заголовка окна 

this.Text = "Data XML "+saveFileDialog.FileName; 

} 

} 

//выход из приложения 

private void menuItemClose_Click 

(object sender, System.EventArgs e) 

{ 

Application.Exit(); 

}

Далее нам необходимо, чтобы при выделении таблицы в listTables, она отображалась в dataGrid. Для добавления обработчика дважды кликаем по listTables. Чтобы показать dataGrid’у откуда брать данные воспользуемся свойством DataSource, в котором укажем dataSet. А чтобы показать какую именно таблицу отображать из dataSet используем свойство DataMember:

//Изменение отображаемой таблицы 

private void listTables_SelectedIndexChanged 

(object sender, System.EventArgs e) 

{ 

//указываем источник данных dataGrid 

dataGrid.DataSource = dataSet; 

//указываем отображаемую таблицу 

dataGrid.DataMember = listTables.SelectedItem.ToString(); 

//имзеняем заголовок dataGrid 

dataGrid.CaptionText = listTables.SelectedItem.ToString(); 

}

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