Базы данных для карманного персонального компьютера

Схема данных 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.

    (рис 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);
    }

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

    Вернуться к учебному плану