Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Краткие теоретические сведенияСодержание книги
Поиск на нашем сайте
Формат XML – это способ хранения данных, представленных XML является языком разметки, с помощью которого можно описать произвольные данные. На основеэтогоязыкаможно организовать хранение информации и ее обмен, не зависящий ни от конкретных приложений, ни от платформы, на которой они исполняются. XML - документы. Законченный набор данных известен в языке XML под названием XML -документа. XML -документ может представлять собой физический файл на вашем компьютере, а может быть всего лишь строкой в памяти, однако он должен быть законченным Microsoft. NET Framework использует объектную модель данных XML Document ObjectModel(DOM), чтобы обеспечить доступ
Описание документа на языке XML включает в себя операторы, написанные с соблюдением требований его синтаксиса. При создании XML -документа вместо использования ограниченного набора определенных элементов имеется возможность создавать собственные элементы и присваивать им любые имена по выбору пользователя. Именно поэтому язык XML является расширяемым (extensible). Следовательно, этот язык можно использовать для описания практически любого документа: от музыкальной партитуры до базы данных.
Рис. 8.1. Иерархическая структура документа
Например, каталог книг можно описать так, как показано в листинге 8.1 (номера строк не являются частью документа XML). Для создания XML -документа в среде Visual Studio. NET следует воспользоваться командой File \ New File и в выпавшем списке шаблонов выбрать имя шаблона XML File.
Листинг 8.1. Текст XML -документа 1. <?xml version="1.0" encoding="utf-8"?> 2. <!-- Название файла book.xml--> 3. <KATALOG> 4. <BOOK> 5. <TITLE>С#2005 для профессионалов </TITLE> 6. <AUTHOR>Кристиан Нейгел</AUTHOR> 7. <PAGES>1560</PAGES> 8. <PRICE>800</PRICE> 9. <PDATA>2006 </PDATA> 10. </BOOK> 11. <BOOK> 12. <TITLE>С# в задачах и примерах</TITLE> 13. <AUTHOR>Никита Культин</AUTHOR> 14. <PAGES>240</PAGES> 15. <PRICE>350</PRICE> 16. <PDATA>2007 </PDATA> 17. </BOOK> 18. </KATALOG> В строке 1 данного листинга записано объявление XML, идентифицирующее текст как документ XML. Несмотря на необязательность объявления XML, документ должен включать его в себя для идентификации используемой версии XML, поскольку документ без объявления XML может в дальнейшем рассматриваться как соответствующий последней версии XML, в результате чего могут появиться ошибки. Информационный параметр version указывает версию XML, использованную в документе, параметр encoding – кодировку документа (utf-8). В строке2 записан комментарий, начинающийся с символов <!-- и заканчивающийся символами -->. Комментарии можно размещать по всему XML -документу. В XML -документе данные маркируются с помощью тэгов (элементов), представляющих собой имена, заключенные в угловые скобки (< >). Имена тэгов в XML -документе (такие как KATALOG, BOOK, TITLE, AUTHOR, PAGES, PRICE, PDATA в листинге 8.1) не являются определениями языка XMLи назначаются при создании документа. Для тэгов можно выбирать любые корректно заданные имена, например INVENTORY вместо KATALOG либо ITEM Примечание. Попытка создания более одного корневого элемента в Внутри корневого элемента может находиться произвольное количество вложенных элементов. В листинге 8.1 XML -документ имеет иерархическую структуру в виде дерева с элементами, вложенными Корректно сформированные XML-документы. Документ называется корректно сформированным (well-formed), если он соответствует следующему минимальному набору правил для XML -доку-ментов: – XML -документ должен иметь только один корневой элемент – элемент Документ. Все другие элементы должны быть вложены – элементы должны быть вложены упорядоченным образом. – каждый элемент должен иметь начальный и конечный тэги. – название элемента в начальном тэге должно точно соответствовать (с учетом регистра) названию в соответствующем конечном тэге; – название элемента должно начинаться с буквы или с символа подчеркивания (_), после чего могут идти буквы, цифры, а также символы: точка (.), тире (-) или подчеркивание. Это базовые правила корректного формирования XML -документа. Для других понятий языка XML (атрибутов, примитивов, связей) действуют свои правила, которые необходимо соблюдать. Можно сказать, что если документ создан правильно и при его отображении и использовании не возникает никаких ошибок, то это Классы библиотеки FCLдля чтения XML-файлов. Работу Класс XmlTextReader – это абстрактный класс, выполняющий чтение и обеспечивающий быструю доставку некэшированных данных.Этот подход в отношении серверных ресурсов является наименее дорогостоящим, но он принуждает извлекать данные последовательно, от начала до конца. Класс XmlDocument представляет собой реализацию модели DOM. Этот класс удерживает данные в памяти после вызова метода Load () для извлечения их из файла или потока, обеспечивает древовидное представление документа в памяти с возможностями навигации и редактирования, а также позволяет модифицировать данные Класс XPathNavigator так же, как и класс XmlDocument, удерживает в памяти XML - документ целиком. Он предоставляет расширенные средства поиска данных, однако не обеспечивает возможности внесения изменений и их сохранения. Класс XmlTextReader. Рассмотрим простой пример. Разместим на форме элементы richTextBox и button (рис. 8.2). При щелчке на кнопку в элемент richTextBox будет загружаться файл, содержимое которого было представлено в листинге 8.1. Код функции, вызываемой при щелчке на кнопку, показан в листинге 8.2.
Рис. 8.2. Результаты считывания из Xml -документа Листинг 8.2. Код обработчика щелчка по кнопке //Очистка элемента richTextBox 1 richTextBox 1. Clear (); // Вызов статического метода Create (), возвращающего объект класса // Файл book.xml находится в том же месте, что и исполняемый файл // программы XmlReader rdr = XmlReader.Create("book.xml"); // Метод Read () перемещает на следующий узел Xml -документа while (rdr.Read()) { if (rdr.NodeType == XmlNodeType.Text) richTextBox1.AppendText(rdr.Value + "\r\n"); } Класс XmlReader также может читать данные со строгим контролем типов. Существует несколько методов ReadElementContentAs, выполняющих чтение, среди которых ReadElementContentAsDecimal(), ReadElementContentAs Int (), ReadElementContentAs Boolean () и др. В листинге 8.3 показано, как считывать значения в десятичном формате и выполнять над ними математические операции. В рассматриваемом случае цена элемента увеличивается на 25 %. Результаты выполнения этого кода показаны на рис. 8.3.
Рис. 8.3. Результаты считывания из Xml - документа только названия и цены книг
Листинг 8.3. Чтение данных со строгим контролем типов
// Очистка элемента richTextBox 1 richTextBox 1. Clear (); // Создание потока для чтения из файла book. xml XmlReader rdr = XmlReader.Create("book.xml"); while (rdr.Read()) { if (rdr.NodeType == XmlNodeType.Element) { // Проверка имени элемента if (rdr. Name == " PRICE ") { // Метод ReadElementContentAsDecimal () выполняет // преобразование содержимого элемента к типу decimal decimal price = rdr.ReadElementContentAsDecimal(); richTextBox1.AppendText(" Текущая цена = " + price + "руб\ r \ n "); // Изменение цены на 25 % price += price * (decimal).25; richTextBox1.AppendText(" Новая цена = " + price + " руб \r\n\r\n"); } else if (rdr.Name == "TITLE") richTextBox1.AppendText(rdr.ReadElementContentAsString() + "\r\n"); } } Класс XmlDocument. Этот класс и производный от него класс XmlDataDocument используются в библиотеке .NET для представления объектной модели документа DOM. В отличие от класса XmlReader, класс XmlDocument предла-гает возможности не только чтения, но и записи, а также произвольного доступа к дереву DOM. Рассмотрим пример, в котором создается объект класса XmlDocument, загружается документ с диска и отображается окно списка с названиями книг (рис. 8.4).
Рис. 8.4. Отображение названий книг в списке.
В классе формы приложения создадим объект класса XmlDocument _doc = new XmlDocument();
Код обработчика щелчка по кнопке приведен в листинге 8.4.
Листинг 8.4. Загрузка названий книг в список
_doc.Load("book.xml"); // Получить только те узлы, которые нужны XmlNodeList nodeLst = _doc.GetElementsByTagName("TITLE"); // Просмотр в цикле класса XmlNodeList foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);
Введем в приложение возможность вывода свдений о книге, наз-вание которой выделено в списке, для чего добавим обработчик события listBox 1_ SelectedIndexChanged так, как показано в листинге 8.5. Листинг 8.5. Обработчик щелчка по элементу списка
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { // Создание строки поиска string srch = "KATALOG/BOOK[TITLE='" + list Box 1. SelectedItem. ToString () + "']"; // Поиск дополнительных данных XmlNode foundNode = _doc.SelectSingleNode(srch); if (foundNode!= null) MessageBox.Show(foundNode.OuterXml); else MessageBox.Show("Not found"); } Результаты работы приложения показаны на рис. 8.5.
Рис. 8.5. Вывод сведений о выделенном элементе списка С помощью класса XmlDocument такжеможно вставлять узлы Например, для создания нового элемента BOOK необходимо записать следующий код: XmlElement newBook = _doc.CreateElement("BOOK");
Создать элементы, вложенные в элемент BOOK, можно с помощью следующего кода:
// Создание нового элемента AUTOR XmlElement newAuthor = _doc.CreateElement("AUTOR"); newAuthor.InnerText = "C. Байдачный "; newBook.AppendChild(newAuthor);
Полный код обработчика щелчка по кнопке приведен в лис-тинге 8.6, результаты его работы показаны на рис. 8.6.
Листинг 8.6. Обработчик щелчка по кнопке
private void button1_Click(object sender, EventArgs e) { _doc.Load("book.xml"); XmlElement newBook = _doc.CreateElement("BOOK"); // Создание нового элемента TITLE XmlElement newTitle = _doc.CreateElement("TITLE"); newTitle.InnerText = ".NET Framework 2.0"; newBook.AppendChild(newTitle); // Создание нового элемента AUTOR XmlElement newAuthor = _doc.CreateElement("AUTOR"); newAuthor.InnerText = "C. Байдачный "; newBook.AppendChild(newAuthor); // Создание нового элемента PAGES XmlElement newpages = _doc.CreateElement("PAGES"); newpages.InnerText = "498"; newBook.AppendChild(newpages); // Создание нового элемента PRICE XmlElement newprice = _doc.CreateElement("PRICE"); newprice.InnerText = "590"; newBook.AppendChild(newprice); // Создание нового элемента PDATA XmlElement newpdata = _doc.CreateElement("PDATA"); newpdata.InnerText = "2006"; newBook.AppendChild(newpdata); // Добавление в текущий документ _doc.DocumentElement.AppendChild(newBook); // Запись документа на диск XmlTextWriter tr = new XmlTextWriter("bookEdit.xml", null); tr.Formatting = Formatting.Indented; _doc.WriteContentTo(tr); tr.Close(); // Загрузка listBox1 со всеми названиями книг, включая новое XmlNodeList nodeLst = _doc.GetElementsByTagName("TITLE"); // Просмотр в цикле класса XmlNodeList foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText); } При использовании классов XmlDocument и XmlReader необходимо учитывать следующие особенности. Если требуется возможность произвольного доступа к документу, то следует применять класс XmlDocument, а если нужна потоковая модель, то классы,
Рис. 8.6. Окно работающего приложения с добавленным узлом
Класс XPathNavigator. Класс XPathNavigator является частью пространства имен System. Xml. XPath, созданного для увеличения быстродействия. Это пространство обеспечивает только чтение документов, следовательно средства редактирования в нем отсутствуют, а классы построены так, чтобы обеспечить быстрое выполнение на заданном XML -документе циклов и операций выбора в стиле курсора. Наилучшим способом использования классов из пространства имен System. Xml. XPath является просмотр документа book. xml Разместим на форме элементы listBox и button. Код обра-ботчика щелчка по кнопке приведен в листинге 8.7, результаты выполнения этого кода – на рис. 8.7.
Листинг 8.7. Обработчик щелчка по кнопке
private void button1_Click(object sender, EventArgs e) { // Создание объекта с именем doc класса XPathDocument и передача // в его конструктор имени XML - файла book.xml XPathDocument doc = new XPathDocument("book.xml"); // Создание объекта с именем nav класса XPathNavigator на базе объекта // XPathDocument. Объект nav может использоваться только для чтения // данных XPathNavigator nav = ((IXPathNavigable)doc). CreateNavigator(); // Создание объекта XPathNodeIterator для узлов каталога // и его дочерних узлов XPathNodeIterator iter = nav.Select("/KATALOG/BOOK"); while (iter.MoveNext()) { // Метод SelectDescendants() класса XPathNavigator выбирает все // узлы-потомки текущего узла, соответствующие условиям выбора XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element, false); // Заполнение списка именами и значениями элементов while (newIter.MoveNext()) listBox1.Items.Add(newIter.Current.Name + ": " + newIter. Current. Value); }
// Добавление в список элемента, содержащего значение общей стоимости // книг listBox1.Items.Add("========================="); listBox1.Items.Add("Общая стоимость = " + nav.Evaluate("sum(/KATALOG/BOOK/PRICE)")+" руб "); } Примечание. Если объект класса XPath Navigator создатьнабазе класса XmlDocument, то он может быть использован и для редактирования документа. Разработка приложения КНИГИ. Рассмотрим пример разработки приложения, отображающего информацию о каталоге книг. Хранилищем данных о книгах является файл с именем book.xml,
Рис. 8.7. Результаты выполнения кода обработчика щелчка по кнопке Суммарная стоимость книг Для проектирования интерфейса приложения на форме разместим элементы управления, как показано на рис. 8.8.
Рис. 8.8. Размещение элементов управления на форме при проектировании приложения Книги Поясним назначение элементов управления, не использовавшихся в предыдущих лабораторных работах. Элемент ВindingSource применяется во многих случаях. В частности, он упрощает привязку элементов управления на форме Элемент управления BindingNavigator представляет стандартный способ навигации и управления данными на форме. В большинстве случаев этот элемент управления соединяется попарно с элементом управления BindingSource, чтобы обеспечивать перемещение между записями данных на форме и взаимодействовать с ними. Элемент управления DataGriedView отображает данные в настраиваемой сетке. Код приложения Книги представлен в листинге 8.8. Листинг 8.8. Код приложения Книги using System. IO; using System.Xml; using System.Xml.Schema; Namespace testReadDataSet { public partial class Form1: Form { // Переменная для имени файла string file_name = "book.xml"; XmlTextReader xml_read;
// Класс DataSet представляет собой расположенный в памяти кэш данных, // загружаемых из источника данных // Класс DataSet состоит из коллекции таблиц класса DataTable DataSet DataXML;
// Класс DataTable представляет одну таблицу с данными в памяти DataTable MyDatatable = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { DataXML = new DataSet (); // Создание потока для чтения данных из файла, имя которого // хранится в строке file_name FileStream fs = new FileStream(file_name, FileMode.Open); xml_read = new XmlTextReader(fs); DataXML.ReadXml(xml_read, XmlReadMode.InferSchema); MyDatatable = DataXML.Tables[0]; bindingSource1.DataMember = DataXML.Tables[0].ToString(); bindingSource1.DataSource = DataXML.Tables[0]; this.bindingNavigator1.BindingSource = bindingSource1; dataGridView1.DataSource = bindingSource1; dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter; // Задание размеров и заголовков столбцов элемента dataGridView 1 dataGridView1.Columns[0].Width = 250; dataGridView1.Columns[0].HeaderText = " Название "; dataGridView1.Columns[1].Width = 160; dataGridView1.Columns[1].HeaderText = " Автор "; dataGridView1.Columns[2].Width = 55; dataGridView1.Columns[2].HeaderText = " Страниц "; dataGridView1.Columns[3].Width = 55; dataGridView1.Columns[3].HeaderText = " Цена "; dataGridView1.Columns[4].Width = 55; dataGridView1.Columns[4].HeaderText = " Год "; fs. Close (); }
// Щелчок по кнопке Сохранить изменения private void button1_Click(object sender, EventArgs e) { DataXML.WriteXml(file_name, XmlWriteMode.IgnoreSchema); }
// Щелчок по кнопке Результат фильтрации private void button2_Click(object sender, EventArgs e) { // Если строка для поиска данных является пустой if (textBox1.Text == " ") { MessageBox.Show("Вы не ввели данные для выполнения фильтрации в базе данных!"); return; } DataView dv = new DataView(DataXML.Tables[0]); // Если нажата радиокнопка для поиска данных по дате if (radioButton4.Checked == true) { uint g = Convert.ToUInt32(textBox1.Text); dv.RowFilter = "PDATA=’" + g + "’'"; } // Если нажата радиокнопка для поиска данных по названию if (radioButton1.Checked == true) { string t = textBox1.Text; dv.RowFilter = "TITLE=’" + t + "’'" } // Если нажата радиокнопка для поиска данных по автору if (radioButton5.Checked == true) { string a = textBox1.Text; dv.RowFilter = "AUTHOR='" + a + "'"; } // Если нажата радиокнопка для поиска данных по количеству страниц if (radioButton2.Checked == true) { uint p = Convert.ToUInt32(textBox1.Text); dv.RowFilter = "PAGES='" + p + "'"; } // Если нажата радиокнопка для поиска данных по цене if (radioButton3.Checked == true) { uint pr = Convert.ToUInt32(textBox1.Text); dv.RowFilter = "PRICE='" + pr + "'"; } bindingSource1.DataSource = dv; this.bindingNavigator1.BindingSource = bindingSource1; dataGridView1.EditMode = false; dataGridView1.DataSource = bindingSource1; dataGridView1.EditMode = DataGridViewEdit Mode.EditProgrammatically; } // Щелчок по кнопке Отобразить все private void button3_Click(object sender, EventArgs e) { bindingSource1.DataSource = DataXML.Tables[0]; this.bindingNavigator1.BindingSource = bindingSource1; dataGridView1.DataSource = bindingSource1; dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter; } } } Разработка приложения КАТАЛОГ ТОВАРОВ. Рассмотрим пример разработки приложения, отображающего информацию о каталоге товаров. Хранилищем данных о товарах является файл с именем catalogue. xml, содержимое которого представлено в листинге 8.9. Листинг 8.9. Файл catalogue. xml
<?xml version="1.0" encoding="utf-8"?> <catalogue> <unit> <uCode>003782</uCode> <uTitle> Чайник </uTitle> <uMemo>Чайник из нержавеющей стали. Объем: 1,5 л.</uMemo> <uPrice>670,50</uPrice> <uImage>i001.jpg</uImage> </unit> <unit> <uCode>012345</uCode> <uTitle> Чашка с блюдцем </uTitle> <uMemo>Чашка с блюдцем. Керамика. Цвет: синий, зеленый, красный.</uMemo> <uPrice>99,00</uPrice> <uImage>i002.jpg</uImage> </unit> <unit> <uCode>01524</uCode> <uTitle> Комплект столовой мебели </uTitle> <uMemo>Комплект столовой мебели. Стол + 4 стула. Материал: массив клена.</uMemo> <uPrice>3900,00</uPrice> <uImage>i003.jpg</uImage> </unit> <unit> <uCode>01555</uCode> <uTitle> Лампа настольная </uTitle> <uMemo>Лампа настольная. 40 Вт. Материал: керамика.</uMemo> <uPrice>549,50</uPrice> <uImage>i006.jpg</uImage> </unit> <unit> <uCode>01325</uCode> <uTitle> Миска </uTitle> <uMemo>Миска керамическая. Цвет: коричневый+ бежевый, голубой+белый.</uMemo> < uPrice >49,50</ uPrice > <uImage>i012.jpg</uImage> </unit> <unit> <uCode>01197</uCode> <uTitle> Люстра </uTitle> <uMemo>Люстра. 40 Вт. Хромированное покрытие.</uMemo> <uPrice>1549,50</uPrice> <uImage>i011.jpg</uImage> </unit> </catalogue>
Для проектирования интерфейса приложения на форме следует разместить элементы управления, как показано на рис. 8.9.
Рис. 8.9. Размещение элементов управления на форме при проектировании приложения Каталог товаров Код приложения представлен в листинге 8.10. Листинг 8.10. Код приложения Каталог товаров
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml;
|
||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2022-09-03; просмотров: 36; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.105.46 (0.009 с.) |