Формат XML – это способ хранения данных, представленных
в простом текстовом формате, что означает, что эти данные могут быть прочитаны практически любым компьютером. Данное обстоятельство делает этот формат весьма подходящим для использования при передаче данных через Интернет и допускает даже непосредственное прочтение человеком.
XML является языком разметки, с помощью которого можно описать произвольные данные. На основеэтогоязыкаможно организовать хранение информации и ее обмен, не зависящий ни от конкретных приложений, ни от платформы, на которой они исполняются.
XML - документы. Законченный набор данных известен в языке XML под названием XML -документа. XML -документ может представлять собой физический файл на вашем компьютере, а может быть всего лишь строкой в памяти, однако он должен быть законченным
и подчиняться определенным правилам. XML -документ состоит из нескольких различных частей, наиболее важными из которых являются XML- элементы, где содержатся те данные, из которых собственно и состоит документ.
Microsoft.NET Framework использует объектную модель данных XML Document ObjectModel(DOM), чтобы обеспечить доступ
к данным в XML -документах, и дополнительные классы для чтения, записи и навигации в пределах XML -документа. Эти классы поддерживаются пространством имен System.XML. Пример представления описания каталога книг в модели DOM приведен на рис. 8.1.
Описание документа на языке 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
вместо BOOK. В строке 3 записан корневой тэг – KATALOG, открывающий разметку всего документа. При завершении написания корневого тэга среда автоматически вставляет конечный тэг (строка 18 листинга 8.1), отмечая его символами </.
Примечание. Попытка создания более одного корневого элемента в
XML -документе является ошибкой.
Внутри корневого элемента может находиться произвольное количество вложенных элементов. В листинге 8.1 XML -документ имеет иерархическую структуру в виде дерева с элементами, вложенными
в другие элементы, и с одним элементом верхнего уровня элемент
Документ, или Корневой элемент (в нашем примере – KATALOG), который содержит все другие элементы. Корневой элемент KATALOG включает в себя элементы-потомки BOOK. В свою очередь элемент BOOK состоит из элементов-потомков TITLE, AUTHOR, PAGES, PRICE, PDATA.
Корректно сформированные XML-документы. Документ называется корректно сформированным (well-formed), если он соответствует следующему минимальному набору правил для XML -доку-ментов:
– XML -документ должен иметь только один корневой элемент – элемент Документ. Все другие элементы должны быть вложены
в корневой элемент;
– элементы должны быть вложены упорядоченным образом.
Если элемент начинается внутри другого элемента, то он должен и заканчиваться внутри этого элемента;
– каждый элемент должен иметь начальный и конечный тэги.
В отличие от языка HTML, в языке XML не разрешается опускать
конечный тэг даже в том случае, когда браузер в состоянии определить, где заканчивается элемент;
– название элемента в начальном тэге должно точно соответствовать (с учетом регистра) названию в соответствующем конечном тэге;
– название элемента должно начинаться с буквы или с символа подчеркивания (_), после чего могут идти буквы, цифры, а также символы: точка (.), тире (-) или подчеркивание.
Это базовые правила корректного формирования XML -документа. Для других понятий языка XML (атрибутов, примитивов, связей) действуют свои правила, которые необходимо соблюдать. Можно сказать, что если документ создан правильно и при его отображении и использовании не возникает никаких ошибок, то это
и есть корректно сформированный документ. Если вы ошибетесь
в каком-либо тэге HTML -страницы, то браузер просто проигнорирует соответствующий тэг, а ошибка в тэге XML -страницы сделает невозможным ее отображение. При наличии одной из ошибок встроенный в Internet Explorer анализатор (его иногда называют XML -про-цессором, или парсером) определяет ее позицию
Классы библиотеки FCLдля чтения XML-файлов. Работу
с XML -документами поддерживают следующие классы библиотеки FCL: XmlTextReader, XmlDocument, XPathNavigator.
Класс XmlTextReader – это абстрактный класс, выполняющий чтение и обеспечивающий быструю доставку некэшированных данных.Этот подход в отношении серверных ресурсов является наименее дорогостоящим, но он принуждает извлекать данные последовательно, от начала до конца.
Класс XmlDocument представляет собой реализацию модели DOM. Этот класс удерживает данные в памяти после вызова метода Load() для извлечения их из файла или потока, обеспечивает древовидное представление документа в памяти с возможностями навигации и редактирования, а также позволяет модифицировать данные
и сохранять их обратно в файл.
Класс XPathNavigator так же, как и класс XmlDocument, удерживает в памяти XML - документ целиком. Он предоставляет расширенные средства поиска данных, однако не обеспечивает возможности внесения изменений и их сохранения.
Класс XmlTextReader. Рассмотрим простой пример. Разместим на форме элементы richTextBox и button (рис. 8.2). При щелчке на кнопку в элемент richTextBox будет загружаться файл, содержимое которого было представлено в листинге 8.1. Код функции, вызываемой при щелчке на кнопку, показан в листинге 8.2.
Рис. 8.2. Результаты считывания из Xml -документа
Листинг 8.2. Код обработчика щелчка по кнопке
//Очистка элемента richTextBox1
richTextBox1.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(), ReadElementContentAsInt(), ReadElementContentAsBoolean() и др.
В листинге 8.3 показано, как считывать значения в десятичном формате и выполнять над ними математические операции. В рассматриваемом случае цена элемента увеличивается на 25 %. Результаты выполнения этого кода показаны на рис. 8.3.
Рис. 8.3. Результаты считывания из Xml - документа
только названия и цены книг
Листинг 8.3. Чтение данных со строгим контролем типов
// Очистка элемента richTextBox1
richTextBox1.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:
XmlDocument _doc = new XmlDocument();
Код обработчика щелчка по кнопке приведен в листинге 8.4.
Листинг 8.4. Загрузка названий книг в список
_doc.Load("book.xml");
// Получить только те узлы, которые нужны
XmlNodeList nodeLst = _doc.GetElementsByTagName("TITLE");
// Просмотр в цикле класса XmlNodeList