Типизированный объект DataSet. Чтение и запись XML-документов
Загрузка XML-документов и XSD-схем в типизированный объект DataSet
Мы привыкли получать данные для объекта DataSet из базы Microsoft Access или SQL. Между тем можно загружать данные непосредственно из XML-файла с встроенной схемой или без нее. Для этого применяется метод ReadXml, который является перегруженным и может использоваться для чтения из XML-файла, из объекта подкласса TextReader, из объекта потока или из подкласса XmlReader (рис. 11.25):
Метод ReadXml вторым параметром принимает XmlReadMode, применяемый для задания того, что содержит XML-файл и какая информация должна быть из него загружена. Этот параметр не обязателен, и если он не указан, используется значение по умолчанию - Auto. В таблице 11.8 приводятся другие значения параметра XmlReadMode.
Для загрузки XSD-схемы в объект DataSet применяется метод ReadXmlSchema. Этот метод является перегруженным, так что можно указать источник информации в одном из следующих видов: имя файла, объект подкласса TextReader, поток или объект подкласса XmlReader (рис. 11.26):
Скопируйте папку приложения StructureTypedDataSet и назовите ее " TypedDataSetReadXML5Здесь и далее используются просто невероятно длинные названия проектов. Я решил, что название "TypedDataSetReadXML" будет более понятным, чем, например, "TDSRXML" или "TDSRX". Впрочем, вы можете называть свои проекты как вам угодно. ". Открываем проект, перетаскиваем на форму элемент управления MainMenu и создаем следующие пункты (рис. 11.27):
Добавляем элемент управления OpenFileDialog, в его свойстве Filter вводим строку для расширений файлов:
XML and XSD Files(*.xml, *.xsd)| *.xml; *.xsd; |All Files(*.*)|*.*
Переходим в код формы. Создаем метод ClearForm, который будет удалять содержимое формы:
private void ClearForm()
{
dsTour.Clear();
dataGrid1.DataSource = null;
richTextBox1.Text = "";
}Создаем метод StructureDataSet, задача которого - выводить в элемент richTextBox1 структуру типизированного объекта DataSet. Соответствующий фрагмент кода вырезаем из конструктора формы:
private void StructureDataSet()
{
//Код для вывода структуры объекта DataSet
}Создаем обработчик пункта главного меню "Заполнить". Фрагмент кода для извлечения данных также вырезаем из конструктора формы:
private void mnuFill_Click(object sender, System.EventArgs e)
{
ClearForm();
//Код для извлечения данных из базы BDTur_firm_Eng.mdb
StructureDataSet();
}Подключаем пространство имен для работы с потоками:
using System.IO;
Создаем обработчик пункта "Auto", в котором делаем переключатель различных значений параметра XmlReadMode. Дополнительно содержимое файла в виде простого текста будет выводиться в элемент richTextBox:
private void mnuAuto_Click(object sender, System.EventArgs e)
{
ClearForm();
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
XmlReadMode readMode = XmlReadMode.Auto;
MenuItem menuItem = (MenuItem)sender;
switch(menuItem.Index)
{
case 0:
readMode = XmlReadMode.Auto;
break;
case 1:
readMode = XmlReadMode.DiffGram;
break;
case 2:
readMode = XmlReadMode.Fragment;
break;
case 3:
readMode = XmlReadMode.IgnoreSchema;
break;
case 4:
readMode = XmlReadMode.InferSchema;
break;
case 5:
readMode = XmlReadMode.ReadSchema;
break;
}
dsTour.ReadXml(openFileDialog1.FileName, readMode);
dataGrid1.DataSource = dsTour;
//Создаем поток для заполнения элемента richTextBox1
FileStream filestream= File.Open(openFileDialog1.FileName,
FileMode.Open, FileAccess.Read);
//Проверяем, открыт ли поток, и если открыт, выполняем условие
if(filestream != null)
{
//Создаем объект streamreader и связываем его с потоком filestream
StreamReader streamreader = new StreamReader(filestream);
//Считываем весь файл и записываем его в TextBox
richTextBox1.Text = streamreader.ReadToEnd();
//Закрываем поток.
filestream.Close();
}
}
}Аналогично, в обработчике пункта меню "Открыть схему" используем метод ReadXmlSchema объекта DataSet:
private void mnuReadXmlSchema_Click(object sender, System.EventArgs e)
{
ClearForm();
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
dsTour.ReadXmlSchema(openFileDialog1.FileName);
dataGrid1.DataSource = dsTour;
FileStream filestream= File.Open(openFileDialog1.FileName,
FileMode.Open, FileAccess.Read);
//Проверяем, открыт ли поток, и если открыт, выполняем условие
if(filestream != null)
{
//Создаем объект streamreader и связываем его с потоком filestream
StreamReader streamreader = new StreamReader(filestream);
//Считываем весь файл и записываем его в TextBox
richTextBox1.Text = streamreader.ReadToEnd();
//Закрываем поток.
filestream.Close();
}
}
}Последнее, что нам осталось сделать, - привязать обработчиков пунктов меню группы "Открыть" к обработчику пункта "Auto":
public Form1()
{
InitializeComponent();
//Открытие
this.mnuDiffGram.Click += new EventHandler(mnuAuto_Click);
this.mnuFragment.Click += new EventHandler(mnuAuto_Click);
this.mnuIgnoreSchema.Click += new EventHandler(mnuAuto_Click);
this.mnuInferSchema.Click += new EventHandler(mnuAuto_Click);
this.mnuReadSchema.Click += new EventHandler(mnuAuto_Click);
}Запускаем приложение. Для его тестирования можно воспользоваться содержимым папки XSD (рис. 11.28):

Рис. 11.28. Приложение TypedDataSetReadXML. А - загрузка данных из базы, Б - открытие файла XMLTourFull.xml, В - открытие схемы XMLTourFull.xsd
Мы не добавляли обработку исключений, поэтому в ходе тестирования могут возникать ошибки. Добавьте ее самостоятельно для обработчиков пунктов меню "Открыть" и "Открыть схему".
В программном обеспечении к курсу вы найдете приложение TypedData SetReadXML (Code\Glava5\ TypedDataSetReadXML).


