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