Опубликован: 09.09.2008 | Уровень: специалист | Доступ: платный | ВУЗ: Российская международная академия туризма
Лекция 17:

Схема данных XML - документа

< Лекция 16 || Лекция 17 || Лекция 18 >
Аннотация: В лекции рассмотрена методика создания и использования схем данных XML-файлов, считывание данных из XSD-файлов и сохранение данных из XSD-файла в объект DataSet

Перед заполнением объектов типа DataSet необходимо иметь структуру данных XML-файла. Во всех рассмотренных выше примерах эта структура создавалась программным путем с явным добавлением в DataSet таблиц, колонок и ограничений. Существует другой метод генерации DataSet - на основе схемы данных XML-файла. Схема данных – это файл в котором описана структура данных: связи между полями; ограничения на поля; спецификация типов полей.

Задача темы: изучить методику и получить навыки создания и использования схем данных XML-файлов

Разработка: Приложение "XML Structure Definition" для создания и просмотра схем данных XML-файлов

Состав выполняемых функций:

  • Файловые операции: открыть, закрыть, сохранить
  • Алгоритмы: просмотр данных и XSD-схем XML-файлов
  • Информационно-справочные: нет

Наращивание функциональности не предусматривается.

Защита данных – нет.

В качестве входных данных используются XML–файлы с данными. Выходные данные программы – файлы-схемы и графическое отображение данных и содержания схемы XML-файла для SmartDevice

Шаг 1. Разработка графического интерфейса

Предусматривается одна форма с текстовым полем вывода имени загруженного XML-файла, элементом DataGrid для просмотра данных XML-файла и листбокса для просмотра содержимого схемы, а также кнопка построчного просмотра листбокса.

Из невидимых элементов – главное меню с опцией "Файл XML".Меню "Файл", в свою очередь, содержит опции "Открыть" и "Создать схему".

Элемент OpenFileDialog имеет свойство Filter = Файлы XML|*.XML, а элемент SaveFileDialog имеет свойство Filter = Схемы файлов XML|*.XSD (файлы схем имеют расширение XSD).

Примерный дизайн показан на рис. 16.1.


Рис. 16.1.

Шаг 2. Добавляем библиотеки

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
//добавляем
using System.IO;
using System.Xml;
using System.Xml.Schema;

Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

string file_name=@"c:\dataSet.xml"; // переменная для имени файла
XmlTextReader xml_read;
FileStream fin;
DataSet DataXML;

Шаг 4. Создаем процедуру открытия XML-файла произвольной структуры

Для опции "Открыть" меню "Файл XML" пишем:

private void menuItem2_Click(object sender, System.EventArgs e) {
if (openFileDialog1.ShowDialog()==DialogResult.OK) {
file_name=openFileDialog1.FileName;
try {
fin=new FileStream(file_name,FileMode.Open);
xml_read=new XmlTextReader(fin);
MessageBox.Show(file_name,"Открываем файл");
	}
catch(IOException exc) {
MessageBox.Show ("Невозможно открыть файл \n"+file_name,"Ошибка");
return;}
DataXML=new DataSet();
DataXML.ReadXml(xml_read, XmlReadMode.InferSchema);  
string str="";
this.listBox1.Items.Clear();
int i=0;
for (i=0;i<DataXML.Tables.Count;i++){//считаем число таблиц в dataSet
this.textBox1.Text=(DataXML.Tables[i].TableName.ToString());// имя таблицы
for (int j=0; j<DataXML.Tables[i].Rows.Count; j++){
// сосчитали строки в i-ой таблице
for (int k=0; k<DataXML.Tables[i].Columns.Count; k++){//добавляем 
str=str+" "+DataXML.Tables[i].Rows[j][k].ToString();
		}
this.listBox1.Items.Add(str); // пишем в листбокс
dataGrid1.DataSource=DataXML.Tables[i]; // очень просто привязали 
str="";//обнуляем – изщряемся для листбокса
		}
}
fin.Close();
	}
}// данные выведены и в листбокс, и в датагрид

Шаг 5. Сохраняем схему полученных данных

Для опции "Сохранить схему" меню "Файл XML" пишем:

private void menuItem3_Click(object sender, System.EventArgs e) {
if (this.dataGrid1.DataSource==null){
MessageBox.Show("Откройте файл *.XML","Ошибка");
return;}
int L_name=this.file_name.Length-4;
file_name=file_name.Substring(0,L_name)+".xsd";
saveFileDialog1.FileName=file_name;
if (this.saveFileDialog1.ShowDialog()==DialogResult.OK) {
file_name=saveFileDialog1.FileName;
DataXML.WriteXmlSchema(file_name);
//..выводим листбокс
try {//открываем файл
fin=new FileStream(file_name,FileMode.Open);
	}
catch(IOException exc) {//если файл недоступен
 MessageBox.Show ("Невозможно открыть файл \n"+file_name,"Ошибка");
return;}
long L=fin.Length; // вычисляем длину файла (мусор?)
// Считываем значения из файла
StreamReader fstr_in=new StreamReader(fin);
//в переменную считываются все символы, пока не кончится строка
string sc="0"; // загружаемая из файла строка 
int s=0; // число символов в строке
listBox1.Items.Clear();
while((sc=fstr_in.ReadLine())!=null) {	
s=s+sc.Length;
listBox1.Items.Add(sc); //добавляем строку в листбокс
	}
fstr_in.Close(); // закрываем поток и выводим сообщение с результатами
}
}

Шаг 6. Создаем процедуру просмотра строки листбокса со схемой

Для кнопки "Просмотр строки" пишем:

private void button1_Click(object sender, System.EventArgs e) {
if (this.dataGrid1.DataSource = = null){//если таблица пустая
MessageBox.Show("Откройте файл *.XML","Ошибка");
return;}
MessageBox.Show(this.listBox1.SelectedItem.ToString(),"Строка " + 
this.listBox1.SelectedIndex.ToString());
}

Шаг 7. Создаем функцию объединения файла данных и схемы

void Convert(){
string xmlfile=@"c:\dataSet.xml";
string xmlfileNew=@"c:\dataSetNew.xml";
DataSet ConvertData=new DataSet();
ConvertData.ReadXml(xmlfile, XmlReadMode.InferSchema);
ConvertData.WriteXml(xmlfileNew, XmlWriteMode.WriteSchema);
}

Вы можете самостоятельно подключить функцию к какому-либо новому элементу приложения.

< Лекция 16 || Лекция 17 || Лекция 18 >
jo jojo
jo jojo
Нидерланды
Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург