Нидерланды |
Схема данных XML - документа
Перед заполнением объектов типа 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.
Шаг 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); }
Вы можете самостоятельно подключить функцию к какому-либо новому элементу приложения.