Язык XML и документирование программ. Обработка XML файлов

Использование гипертекстовой разбивки текстового документа в современных информационных системах. Вложенность тэгов в XML. Запись, чтение файлов XML. Создание приложения в Visual Studio.Net. Трансформация и привязка данных, проверка достоверности.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.01.2014
Размер файла 40,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

(ФГБОУ ВПО «ВГТУ», ВГТУ)

Кафедра «Автоматизированные и вычислительные системы»

ЗАДАНИЕ

на курсовой проект

по дисциплине «Программирование на С/С++»

Тема проекта «Язык XML и документирование программ. Обработка XML файлов»

Технические условия: разработать в среде программирования Visual Studio .NET приложение обработки XML файлов.

Содержание и объем проекта: изучение языка XML и документирование программ, обработка XML файлов, построение приложения, проведение тестирования, анализ полученных результатов, составление расчетно-пояснительной записки.

Сроки выполнения этапов: анализ задачи, обзор литературы, выбор технологии разработки - до г., проектирование, реализация - до г..

Руководитель ____________________Е.А.Ганцева_

Содержание

Введение

XML

Оформление XML

Пространства имен XML

Схемы XML

Запись, чтение файлов XML

Обработка XML в памяти

Поиск в содержимом XML

Проверка достоверности XML-файлов

Трансформация содержимого XML

Привязка данных XML

Создание приложения в Visual Studio .Net

Заключение

Список литературы

ПРИЛОЖЕНИЕ

Введение

Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы “<” и “>”, внутри которых помещались названия инструкций и их параметры. Сейчас такой способ обозначения тэгов является стандартным.

Использование гипертекстовой разбивки текстового документа в современных информационных системах во многом связано с тем, что гипертекст позволяет создавать механизм нелинейного просмотра информации. В таких системах данные представляются не в виде непрерывного потока текстовой информации, а набором взаимосвязанных компонентов, переход по которым осуществляется при помощи гиперссылок.

XML (Extensible Markup Language) - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания. Таким образом, если, например, мы считаем, что для обозначения элемента rose в документе необходимо использовать тэг <flower>;, то XML позволяет свободно использовать определяемый нами тэг и мы можем включать в документ фрагменты.

В общем случае XML- документы должны удовлетворять следующим требованиям:

- в заголовке документа помещается объявление XML, в котором указывается язык разметки документа, номер его версии и дополнительная информация;

- каждый открывающий тэг, определяющий некоторую область данных в документе обязательно должен иметь своего закрывающего "напарника", т.е., в отличие от HTML, нельзя опускать закрывающие тэги;

- в XML учитывается регистр символов;

- все значения атрибутов, используемых в определении тэгов, должны быть заключены в кавычки;

- вложенность тэгов в XML строго контролируется, поэтому необходимо следить за порядком следования открывающих и закрывающих тэгов;

- вся информация, располагающаяся между начальным и конечными тэгами, рассматривается в XML как данные и поэтому учитываются все символы форматирования ( т.е. пробелы, переводы строк, табуляции не игнорируются, как в HTML);

Основным сдерживающим фактором в продвижении XML технологии в Web на сегодняшний день является отсутствие полной поддержки этого формата всеми производителями браузеров - программ, наиболее часто используемых на стороне клиента. Выходом из создавшейся ситуации может стать вариант, при котором обработкой XML документов занимается серверная сторона Используя любой существующий XML-анализатор, можно формировать необходимую информацию уже на сервере и посылать клиенту нормальный HTML-документ. Однако такой способ, конечно, менее гибок, и позволяет использовать XML технологию лишь для хранения структурированной информации, но не для ее динамического изменения на стороне клиента.

Использование XML технологии имеет смысл в нескольких основных сценариях:

- когда вам нужно манипулировать данными, уже сохраненными в XML. Подобная

ситуация может возникнуть, если вы хотите обмениваться данными с существующим приложением, которое использует XML;

- когда вы хотите применять XML для хранения ваших данных и открыть возможность для будущей интеграции. Поскольку вы используете XML, можно быть уверенным, что в будущем появятся приложения от независимых разработчиков, предназначенные для чтения этих данных;

- когда вы хотите использовать технологию, зависящую от XML. Например, Web-службы имеют дело с различными стандартами, основанными на XML.

Когда XML был представлен впервые, его успеху способствовала его простота. Правила XML намного короче и проще, чем правила его предшественника -- SGML (Standard Generalized Markup Language -- стандартный обобщенный язык разметки). Кроме того, простые XML-документы читабельны для человека. Однако за прошедшие годы в XML было добавлено много других поддерживающих стандартов, в результате чего XML в профессиональном приложении вообще перестал быть простым.

Но как бы то ни было, XML в наши дни используется намного шире, чем когда-либо ранее. Преимущества от использования XML в современных приложениях включают следующие:

Адаптируемость. XML вездесущ. Многие компании используют XML для хранения данных или собираются это делать. Всякий раз, когда возникает необходимость в разделении одних и тех же данных между приложениями, XML автоматически становится первым (и часто единственным) кандидатом на рассмотрение;

Расширяемость и гибкость. XML не накладывает никаких ограничений на семантику данных, и не привязывает компании к собственным сетям, в отличие от EDI

(Electronic Data Interchange -- обмен электронными данными). В результате XML подходит для любого типа данных, при этом он дешевле в реализации;

Стандартизация и инструментарий. Другая причина успеха XML -- широкий выбор инструментов (таких как анализаторы (parsers)) и сопутствующие стандарты (такие как XML Schema, XPath и XSLT), помогающие в создании и обработке XML-документов. В результате программисты, работающие почти на любых языках, имеют в своем распоряжении готовые компоненты для чтения XML, проверки его соответствия наборам правил (известных как схемы), поиска в XML, а также трансформации одного формата XML в другой.

Язык XML играет роль клея, позволяющего различным системам работать вместе. Он помогает стандартизовать бизнес-процессы и транзакции, охватывающие различные организации. Однако XML приспособлен не только для передачи данных между компаниями. Многие программные задачи сегодня требуют интегрирующих приложений; Web-приложения интегрируют множества Web-служб, сайты электронной коммерции -- реестры складских запасов и системы ценообразования, а приложения корпоративных сетей -- существующие бизнес-приложения. Все они взаимодействуют за счет обмена XML-документами.

XML

Оформление XML

XML -- довольно строгий стандарт. Его строгость предназначена для сохранения широкой совместимости. Если бы правила XML не были столь строгими, было бы сложно отличать безобидные вариации от серьезных ошибок. Хуже того, некоторые ошибки обрабатывались бы по-разному различными анализаторами XML, приводя к несогласованности в их обработке (или вообще к невозможности их обработки). Именно такие причуды характерны одному знаменитому языку, не основанному на XML, а именно -- HTML.

В противоположность ему HTML, например, гораздо более либерален. В результате этого вполне возможно создать Web-страницу HTML с ошибками, которая вполне успешно будет отображаться в одном браузере, но совершенно иначе интерпретироваться в другом.

Чтобы предотвратить такого рода проблемы, анализаторы XML выполняют несколько базовых проверок качества. Если XML-документ не соответствует стандартам, он полностью отклоняется. Если же XML-документ соответствует правилам, он может считаться хорошо оформленным. Хорошо оформленный XML -- это не обязательно корректный XML. Например, он все равно может содержать некорректные данные, но XML-препроцессор все равно может его разобрать.

Документ XML должен соответствовать перечисленным ниже критериям:

- каждому начальному дескриптору должен соответствовать конечный дескриптор.

- пустой элемент должен завершаться сочетанием />;

- элементы могут быть вложенными, но никогда не могут перекрываться. Другими словами, <person><firstName></firstName>_</person> правильно, но <person><firstName></person></firstName> -- нет;

- элементы и атрибуты должны использовать согласованный регистр. Например, дескрипторы <FirstName></firstName> не составляют корректный элемент, поскольку его части записаны в разном регистре;

- элемент не может содержать в себе двух атрибутов с одним и тем же именем, потому что тогда не будет возможности отличить их друг от друга. Однако элемент может содержать два вложенных элемента с одинаковыми именами;

- документ может иметь только один корневой элемент. (Корневой элемент -- это элемент верхнего уровня, с которого начинается документ и который включает в себя все его содержимое.);

- атрибуты должны иметь кавычки вокруг значений;

- комментарии не могут помещаться внутри дескрипторов. Комментарии XML имеют тот же формат, что и комментарии HTML, и заключены в маркеры <!-- и -->.

Пространства имен XML

После того как стандарт XML укоренился, были созданы десятки языков разметки XML, и многие из них специфичны для определенных областей промышленности, процессов и типов информации. Во многих случаях возникала потребность расширить один тип разметки дополнительными, специфичными для компании элементами, или даже создавать XML-документы, комбинирующие несколько различных XML-грамматик. Рассмотрим XML-документ, содержащий информацию, связанную с заказами, используя стандарт под названием OrderML, и специфичную для клиента информацию, применяя стандарт под названием ClientML. Этот документ отправляется приложению заполнения заказов, которое интересует только подробности OrderML.

Стандарт XML Namespaces (Пространства имен XML). Главная идея, положенная в основу этого стандарта, заключается в том, что каждый язык разметки XML имеет свое собственное пространство имен, которое уникально идентифицирует его элементы. Технически пространства имен разрешают неоднозначность, внося ясность о том, к какому языку разметки они относятся.

Все пространства имен XML используют URI (Uniform Resource Identifier -- универсальный идентификатор ресурса). Обычно эти URI выглядят, как URL Web-страниц. Например, http://www.mycompany.com/mystandard -- типичное имя пространства имен. Хотя пространства имен выглядят как обычные ссылки в Web, они не обязательно являются таковыми. URI используются для пространств имен XML, потому что в этом случае более вероятно, что они будут уникальными. Обычно, если вы создаете новый язык XML, то используете URI, указывающий домен вашего Web-сайта. Таким образом, вы можете быть уверены, что никто другой не использует этот URI. Однако пространство имен не обязано быть URI -- допускается любая текстовая последовательность.

Чтобы указать, что элемент относится к определенному пространству имен, вам нужно просто добавить атрибут xmlns в начальный дескриптор и указать пространство имен. Например, элемент, показанный ниже, является частью пространства имен http://mycompany/OrderML. Если вы не выполните этот шаг, элемент не будет частью никакого пространства имен.

<order xmlns="http://mycompany/OrderML"></order>

Схемы XML

Значительной частью успеха стандарт XML обязан его замечательной гибкости. Используя XML, вы можете создать точно такой язык разметки, который вам нужен. Но эта гибкость также порождает несколько проблем. Решение состоит в создании формального документа, устанавливающего правила вашего конкретного языка разметки. Такой документ называется схемой. Правила не должны включать синтаксических деталей (таких как требование применять угловые скобки или вложенные дескрипторы свойств), потому что эти требования уже являются частью базового стандарта XML. Вместо этого документ схемы будет перечислять логические правила, относящиеся к вашему типу данных. Они включают следующее:

- словарь документа. Определяет, какие элементы и имена атрибутов используются в ваших XML-документах;

- структура документа. Определяет, где должны помещаться дескрипторы, а также может включать правила, регламентирующие то, какие дескрипторы должны быть помещены перед, после или внутри других. Можно также специфицировать, сколько раз может появляться каждый элемент;

- поддерживаемые типы данных. Позволяют специфицировать -- должны ли данные быть обычным текстом, либо их следует интерпретировать как числовые данные, информацию о датах и т.д.;

- допустимые диапазоны значений. Позволяют установить ограничения на диапазоны допустимых значений числовых данных, ограничение длины текста, требование соответствия регулярным выражениям либо перечень специфических допустимых значений.

Стандарт схемы XML определяет правила, которых следует придерживаться при создании документа схемы.

Запись, чтение файлов XML

Среда .NET Framework позволяет манипулировать данными XML с помощью набора классов из пространства имен System.Xml (и других пространств имен, начинающихся с System.Xml). Самый “легковесный” способ чтения и записи XML заключается в применении двух потоковых классов: XmlTextReader и XmlTextWriter. Эти классы обязательны, если у вас есть громадные XML-файлы, которые было бы непрактично удерживать целиком в памяти как один документ. Они также подходят для обработки простейших XML.

.NET Framework предлагает два подхода к записи XML-данных в файл. Можно построить документ в памяти, используя класс XmlDocument или XDocument, и по окончании записать его в файл. Можно написать документ непосредственно в поток, используя XmlTextWriter. Он выводит данные по мере записи -- узел за узлом. Конструирование документа XML -- хороший выбор, если вы хотите выполнять другие операции над содержимым XML после его создания, такие как поиск, трансформация или проверка достоверности. Это также единственный способ записи XML-документа в нелинейном виде, потому что он позволяет вставлять новые узлы куда угодно. Однако XmlTextWriter представляет более простую модель, которая лучше приспособлена для прямой записи в файл, потому что не хранит всего документа целиком в памяти. Следующий пример Web-страницы показывает, как можно использовать XmlTextWriter для создания хорошо оформленного файла XML. Первый шаг -- создать приватный метод WriteXML(), который выполнит эту работу. Он начинается с создания объекта XmlTextWriter и передачи его конструктору физического пути файла, который нужно создать.

private void WriteXML()

{

string xmlFile = Server.MapPath("DvdList.xml");

XmlTextWriter writer = new XmlTextWriter(xmlFile, null);

...

текстовый документ информационный тэг

Как и в случае с записью содержимого XML, существуют две базовые стратегии его чтения:

- вы можете читать его в память за один прием, используя классы XmlDocument, XPathNavigator или XDocument. Из этих трех лишь XPathNavigator является доступным только для чтения.

- вы можете перемещаться по содержимому, узел за узлом, используя XmlTextReader .

Подход на основе потоков сокращает накладные расходы памяти и обычно -- но не всегда -- более эффективен. Если вам нужно выполнять критичную по затратам времени операцию над документом XML, вы можете предпочесть использование подхода на основе размещения в памяти, чтобы сократить период времени, в течение которого файл остается открытым, если известно, что другим пользователям также требуется доступ к нему.

Хотя чтение XML-файла с объектом ХmlTextReader представляет собой наиболее простой подход, он также является наименее гибким. Файл читается последовательно, и вы не можете свободно перемещаться к родительскому, дочернему или соседнему узлу, как это можно делать при обработке расположенного в памяти XML. Вместо этого вы читаете узлы по одному за раз из потока. Обычно для этого вы пишете один или более вложенных циклов, чтобы пройти по элементам документа XML, до тех пор, пока не найдете то, что вас интересует.

Следующий код начинается с загрузки исходного файла в объект XmlTextReader. Затем открывается цикл, который проходит по документу, перебирая узлы один за другим. Чтобы перейти от текущего узла к следующему, вызывается метод XmlTextReader.Read(). Этот метод возвращает true до тех пор, пока не переместится за последний узел, после чего он вернет false. Это напоминает подход, используемый классом DataReader для извлечения результатов запроса к базе данных.

XmlTextWriter предоставляет дополнительные методы, которые позволяют ускорить чтение XML и которые более удобны, если вы знаете, какую структуру следует ожидать. Например, вы можете использовать метод MoveToContent(), который пропускает несущественные узлы (вроде комментариев, пробелов и XML-объявлений) и останавливается на объявлении следующего элемента. Вы можете также использовать метод ReadStartElement(), который читает узел и в то же время выполняет базовую проверку достоверности. При вызове ReadStartElement() указывается имя элемента, появления которого в документе вы ожидаете следующим. XmlTextReader вызывает MoveToContent() и затем проверяет текущий элемент на соответствие указанному имени. Если соответствие не обнаружено, возбуждается исключение. Также вы можете использовать метод ReadEndElement(), чтобы прочесть закрывающий дескриптор элемента. Если нужно прочесть элемент, который содержит только текстовые данные, можно переместиться через начальный дескриптор, содержимое и конечный дескриптор, применяя метод ReadElementString() и указывая имя элемента. Необходимые данные возвращаются в виде строки.

Обработка XML в памяти

Основанная на потоках обработка XML обеспечивает минимальные накладные расходы, но также обладает минимальной гибкостью. Во многих сценариях обработки XML вы не захотите работать на таком низком уровне. Вместо этого вам понадобится возможность получения содержимого нужного элемента в нескольких строках кода (а не в нескольких десятках). Более того, модель потоковой обработки легко позволяет допускать довольно тривиальные ошибки, которые чреваты серьезными будущими проблемами, такими как ожидание пробелов и комментариев.

Обработка XML в памяти намного удобнее. К сожалению, не существует одного стандартного подхода к такой обработке. Все перечисленные ниже классы позволяют вам читать и перемещаться по содержимому XML-файла:

- XmlDocument. Класс XmlDocument реализует полный XML DOM Level 2 Core, как она определена W3C. Это наиболее стандартизованный интерфейс к данным XML, но временами также немного неуклюжий;

- XpathNavigator. Как и XmlDocument, класс XpathNavigator целиком хранит XML-документ в памяти. Однако он обеспечивает немного более быструю и прямолинейную модель, чем XML DOM, наряду с расширенными средствами поиска. В отличие от XmlDocument, он не предусматривать возможности внесения изменений и сохранения их;

- XDocument. Класс XDocument предлагает еще более интуитивно понятный и эффективный API для взаимодействия с XML. Технически он представляет собой часть LINQ to XML, но удобен и в том случае, если вы не конструируете запросов LINQ. Однако из-за новизны XDocument должен работать в согласии с более старыми классами .NET XML для выполнения таких задач, как проверка достоверности. Некоторые классы, существующие уже в течение длительного времени, такие как Web-элемент управления Xml, который позволяет легче отображать XML на Web-странице, все еще базируются на XmlDocument, и потому не работают с XDocument.

XmlDocument хранит информацию, как дерево узлов. Узел (node) базовый ингредиент файла XML, который может быть элементом, атрибутом, комментарием или значением элемента. Отдельный объект XmlNode представляет каждый узел. XmlDocument является оболочкой для групп объектов XmlNode, которые существуют на том же уровне, что и коллекции XmlNodeList.

XmlDocument также позволяет модифицировать содержимое узла (например, вы можете изменить свойства XmlNode.Name и XmlNode.Value) и провести более основательные изменения, такие как удаление узла из коллекции посредством создания нового узла. Фактически вы можете даже сконструировать полный документ XML в памяти как экземпляр XmlDocument, и затем сохранить его. Чтобы сохранить текущее содержимое XmlDocument, вы вызываете метод Save(), указывая строчное имя файла или готовый поток.

Класс XpathNavigator (находящийся в пространстве имен System.Xml.XPath) работает подобно классу XmlDocument. Он загружает информацию в память, затем позволяет вам проходить по узлам. Ключевое отличие в том, что он применяет подход на базе курсора, позволяющий использовать такие методы, как MoveToNext(), для прохождения по данным XML. XPathNavigator может позиционироваться только на одном узле одновременно. Объект XPathNavigator можно создать из XmlDocument с помощью метода XmlDocument.CreateNavigator().

Класс XDocument -- это модель общего назначения для управления находящимся в памяти XML. В отличие от XmlDocument и XPathNavigator, он очень подходит для конструирования содержимого XML. (По сравнению с ним XmlDocument делает задачу конструирования XML излишне сложной, в то время как XPathNavigator вообще этого не поддерживает.) Если нужно генерировать XML в нелинейной манере, например, если вы хотите записать коллекцию элементов в корневой элемент, а затем добавить новую информацию внутрь каждого элемента, то вам пригодится для этого такой класс в памяти, как XDocument. Подобно тому, как объект XmlDocument состоит из объектов XmlNode, XDocument состоит из объектов XNode. XNode -- абстрактный базовый класс. Другие, более специализированные классы вроде XElement, XComment и XText наследуются от него. Одно отличие состоит в том, что атрибуты не трактуются как отдельные узлы в модели LINQ to XML. Вместо этого они просто являются парами “имя-значение”, прикрепленными к другому элементу. По этой причине класс XAttribute не наследуется от XNode. Технически класс XDocument -- часть LINQ. Он находится в пространстве имен System.Xml.Linq и является частью сборки System.Xml.Linq.dll, представленной в

.NET 3.5. Вы должны добавить ссылку на эту сборку, чтобы использовать XDocument и связанные с ним классы.

Поиск в содержимом XML

В некоторых ситуациях вам не нужно обрабатывать XML-документ целиком. Вместо этого вам необходимо извлечь единственный фрагмент информации. Если вы знаете имя элемента, вы можете использовать метод XmlDocument.GetElementsByTagName(), который выполняет поиск по всему документу и возвращает XmlNodeList, содержащий все соответствующие объекту XmlNode.

Осуществлять поиск в XML-документе можно с помощью XPath. Возможности метода GetElementsByTagName() довольно-таки ограничены. Он позволяет искать только по имени элемента. Вы не можете отфильтровать данные по какому-то другому критерию, такому как значение элемента или содержимое атрибута. XPath -- намного более мощный стандарт, позволяющий извлекать часть документа, которая вас интересует.

XPath применяет нотацию, подобную путям файловой системы. Например, путь /идентифицирует корень XML-документа, а /DvdList -- корневой элемент <DvdList>. Путь /DvdList/DVD выбирает все элементы <DVD> внутри <DvdList>. И, наконец, точка (.) всегда выбирает текущий узел. В дополнение к этому, путь // -- это рекурсивная операция пути, позволяющая искать во всех наследниках узла. Если вы начинаете путь с операции //, то выражение XPath будет искать узлы по всему документу. Этих ингредиентов достаточно, чтобы строить многие базовые шаблоны, хотя стандарт XPath также определяет специальные критерии выбора, которые могут отфильтровать только те узлы, в которых вы заинтересованы.

Рассмотрим поиск в XDocument с помощью LINQ. Мы уже видели, как использовать методы XElement.Element() и XElement. Elements() для фильтрации наших элементов, имеющих определенное имя. Однако оба эти метода идут только на один уровень вглубь. Например, вы можете использовать их на классе XElement, который представляет элемент <DVDList> для поиска элементов <DVD>, но вы не сможете найти элементы <Title>, поскольку они находятся двумя уровнями ниже. Есть несколько способов решения этой проблемы. Простейший подход заключается в использовании других встроенных методов XElement, которые мы пока не рассматривали, таких как ElementsAfterSelf(), ElementsBeforeSelf(), Ancestors() и Descendants(). Все они возвращают коллекции IEnumerable<T> объектов XElement. ElementsAfterSelf() и ElementsBeforeSelf() ищут элементы-братья. Методы Ancestors() и Descendants() более достойны упоминания, потому что проходят по иерархии XML. Например, применение Descendants() на корневом элементе <DvdList> возвращает все элементы документа, включая непосредственно содержащиеся элементы <DVD> и элементы более глубокой вложенности вроде <Title> и <Price>. Опираясь на это значение, вы можете найти все заголовки фильмов в документе, находящиеся на любом уровне, используя следующий код:

string xmlFile = Server.MapPath("DvdList.xml");

XDocument doc = XDocument.Load(xmlFile);

foreach (XElement element in doc.Descendants("Title"))

{ ... }

Это дает вам функциональность, подобную методу XmlDocument.GetElements ByTagName(). Однако это не соответствует средствам XPath. Вам понадобятся выражения LINQ. Как известно выражения LINQ работают с объектами, реализующими IEnumerable<T>. Различные расширения LINQ заполняют пробел между IEnumerable<T> и другими источниками данных. Например, LINQ to DataSet добавляет расширяющие методы, позволяющие вам получить коллекцию IEnumerable<T> объектов DataRow. LINQ to SQL добавляет класс Table<T>, который обеспечивает реализацию IEnumerable<T> поверх запроса к базе данных. LINQ to XML предлагает классы XDocument и XElement, которые включают несколько способов получения коллекций элементов IEnumerable<T>, включая только что рассмотренные методы Elements() и Descendants().

Как только вы помещаем коллекцию элементов в выражение LINQ, можем использовать все знакомые операции. Это значит, что можем применять сортировку, фильтрацию, группирование и проекции, чтобы получить требуемые данные.

Проверка достоверности XML-файлов

До сих пор мы видели несколько стратегий чтения и анализа XML-данных. Но если вы попытаетесь прочитать содержимое неправильного XML, применяя любой из этих подходов, то получите ошибку. Другими словами, все эти классы требуют хорошо оформленного XML. Однако ни один из приведенных примеров пока не выполнял проверку достоверности XML, чтобы удостовериться, что он следует каким-либо специфичным для приложения правилам.

Рассмотрим достоверности с помощью XmlDocument. Один из подходов к проверке XML-документа на предмет соответствия схеме предусматривает применение класса XmlValidatingReader. Чтобы создать его экземпляр, вызовите метод XmlReader.Create() и передайте ему объект XmlReaderSettings, специфицирующий схему XSD, которую вы хотите использовать. Читатель с проверкой достоверности работает подобно XmlTextReader, но включает способность проверять соответствие документа правилам схемы. Читатель с проверкой достоверности возбуждает исключение (или инициирует событие), чтобы сообщить об ошибках при продвижении по XML-файлу. Первый шаг при выполнении проверки связан с импортом пространства имен System.

Xml.Schema, которое содержит типы, подобные XmlSchema и XmlSchemaCollection:

using System.Xml.Schema;

Проверка достоверности с помощью XDocument. Хотя XDocument обладает встроенной функциональностью фоновой проверки достоверности, .NET включает расширяющие методы, позволяющие использовать его с классами проверки достоверности, которые вы видели в предыдущем разделе. Чтобы сделать их доступными, вы должны импортировать пространство имен System.Xml.Schema. Это пространство имен содержит класс Extensions, включающий метод Validate(), который вы можете применять на XElement или XDocument.

Трансформация содержимого XML

XSL (Extensible Stylesheet Language -- расширяемый язык стилей), представляет собой основанный на XML язык для создания таблиц стилей. Таблицы стилей (также известные как трансформации) -- это специальные документы, которые могут быть использованы (с помощью процессора XSLT) для преобразования ваших XML-документов в другие документы. Например, вы можете применять таблицу стилей XSLT для трансформации одного типа XML в другую структуру XML. Или же вы можете использовать

таблицу стилей для преобразования вашего XML, содержащего только данные в другой текстовый документ, такой как таблица HTML. Прежде чем выполнять трансформацию, необходимо создать таблицу стилей XSL, определяющую, как должно происходить преобразование. XSL -- сложный стандарт. На самом деле он может рассматриваться как настоящий язык, со своей условной логикой, циклическими структурами и многим другим.

Рассмотрим трансформацию XML с помощью LINQ to XML. XSL представляет собой хорошо укоренившийся стандарт трансформации XML в разные представления. Однако это, очевидно, не единственный подход. Ничто не мешает открыть XDocument, реорганизовать его узлы вручную и затем сохранить результат -- помимо, конечно, внутренней сложности такого подхода, которая может усложнить сопровождение вашего кода и стать источником разнообразных легко допускаемых ошибок. Потому хотя XSL -- это не единственный способ изменения представления XML, до последнего времени он оставался единственным практичным способом выполнения трансформаций. С появлением LINQ ситуация несколько изменилась. Хотя XSL остается основой для широкого разнообразия сценариев, LINQ to XML предлагает ни с чем несравнимую альтернативу. Чтобы выполнить трансформацию с помощью LINQ to XML, вы должны построить выражение LINQ, использующее проекцию. Проекция должна возвращать XElement вместо анонимного типа. Конструктор XElement позволяет создавать полное дерево узлов в единственном операторе. Используя эти конструкторы, ваше выражение LINQ может строить полное дерево XML с элементами, подэлементами, атрибутами, текстовым содержимым и т.д.

Привязка данных XML

Элемент управления XmlDataSource работает декларативным способом, аналогичным тому, как работают элементы управления SqlDataSource и ObjectDataSource. Однако имеются два ключевых отличия. XmlDataSource извлекает информацию из XML-файла, а не из базы данных или класса доступа к данным. Для привязки данных другим элементам управления он представляет объект XmlDocument. Содержимое XML иерархично и может иметь неограниченное количество уровней. В отличие от этого, SqlDataSource и ObjectDataSource возвращают двумерные таблицы данных. XmlDataSource также предлагает несколько средств, общих с другими элементами источников данных, включая кэширование и богатую поддержку проектирования, которая показывает схему ваших данных в привязанных элементах управления.

Создание приложения в Visual Studio .Net

XML -- текстовый формат, предназначенный для хранения структурированных данных. По сути - это база данных в текстовом структурированном файле. XML имеет реализации парсеров для всех современных языков программирования и средств разработки.

Рассмотрим обработку - XML файла в Visual Studio .Net. В Visual Studio существует множество способов работы с xml (все они находятся в пространстве имен System.Xml):

- XmlTextReader, XmlTextWriter;

- XmlDocument;

- Linq.XDocument;

- Schema.XmlSchema.

На мой взгляд, самый простой, гибкий и интуитивно понятный способ обработки xml файла - с помощью классов XmlTextReader и XmlTextWriter. К тому же он показывает неплохие результаты по скорости работы.

Первым делом создадим консольное приложение в Visual Studio. Назовем его XMLReadWrite. Создадим приложение на C#, которое будет производить чтение и запись на примере xml файла, содержащего сведения об авторе и его книгах. Создадим в папке XMLReadWrite\bin\Debug xml-файл author.xml со следующим содержимым:

<?xml version="1.0" encoding="windows-1251"?>

<Автор>

<ФИО>Иванов Иван Иванович</ФИО>

<Дата_рождения>31.12.1988</Дата_рождения>

<Пол>Мужской</Пол>

<Книга id="1">

<Название>Название1</Название>

<Количество_страниц>20</Количество_страниц>

</Книга>

<Книга id="2">

<Название>Название2</Название>

<Количество_страниц>40</Количество_страниц>

</Книга>

</Автор>

В Visual Studio пропишем пространства имен:

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

Для демонстрации примера нам понадобятся два класса: «Автор» и «Книга»:

public class Author

{

public string fio = string.Empty;

public DateTime birthDay = DateTime.MinValue;

public string sex = string.Empty;

public List<Book> books = new List<Book>();

}

public class Book

{

public int id = -1;

public string name = string.Empty;

public int pageCount = -1;

}

Класс Author содержит сведения об авторе: ФИО, дата рождения, пол и список книг. Класс Book содержит идентификатор книги (уникальный в пределах одного автора), название и количество страниц.

Напишем функцию ReadXml по чтению xml файла. На вход подадим имя нашего файла author.xml, на выходе получим прочитанного автора.

На C# read xml осуществляется с помощью класса XmlTextReader. Он доступен во всех версиях .Net Framework, начиная с 1.0. XmlTextReader реализует методы «только вперед», т.е. обеспечивает строго последовательный обход XML-файла. За счет этого достигается весьма хорошая скорость обработки данных.

static Author ReadXml(string fileName)

{

Author author = new Author();

using (XmlTextReader reader = new XmlTextReader(fileName))

{

while (reader.Read())

{

if (reader.IsStartElement("Автор") && !reader.IsEmptyElement)

{

while (reader.Read())

{

if (reader.IsStartElement("ФИО"))

author.fio = reader.ReadString();

else if (reader.IsStartElement("Дата_рождения"))

author.birthDay = DateTime.Parse(reader.ReadString());

else if (reader.IsStartElement("Пол"))

author.sex = reader.ReadString();

else if (reader.IsStartElement("Книга") && !reader.IsEmptyElement)

{

Book book = new Book();

book.id = Int32.Parse(reader.GetAttribute(0));

while (reader.Read())

{

if (reader.IsStartElement("Название"))

book.name = reader.ReadString();

else if (reader.IsStartElement("Количество_страниц"))

book.pageCount = Int32.Parse(reader.ReadString());

else if (!reader.IsStartElement() && reader.Name == "Книга")

{

author.books.Add(book);

break;

}

}

}

else if (!reader.IsStartElement() && reader.Name == "configuration")

break;

}

}

}

}

return author;

}

При чтении тега, который подразумевает вложенность, нужно помимо проверки reader.IsStartElement("Книга") еще проверять, что этот элемент не пустой !reader.IsEmptyElement. Иначе при наличии такой конструкции <книга /> (т.е. открывающийся тег является и закрывающимся) программа войдет во вложенный цикл и уже не выйдет из него до окончания xml файла.

Теперь напишем функцию WriteXml. На вход подадим имя нового файла newAuthor.xml и сформированный предыдущей функцией Author.

Для создания на C# create xml файла будем использовать класс XmlTextWriter . С помощью него можно задавать параметры форматирования xml. Например, в нашей функции для отступа тегов используется один знак табуляции.

Функция WriteStartDocument() формирует объявление XML. Это строка, указывающая версию XML документа. В версии 1.0 объявление XML может отсутствовать, в версии 1.1 оно является обязательным. Также здесь указывается кодировка символов. В нашем случае функция версия вернет строку <?xml version="1.0" encoding="windows-1251"?>

Вложенные теги создаются с помощью функции WriteStartElement(). На каждый WriteStartElement() должен быть закрывающий его WriteEndElement().

static void WriteXml(string fileName, Author author)

{

using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.GetEncoding(1251)))

{

writer.Formatting = Formatting.Indented;

writer.Indentation = 1;

writer.IndentChar = '\t';

writer.WriteStartDocument();

writer.WriteStartElement("Автор");

{

writer.WriteElementString("ФИО", author.fio);

writer.WriteElementString("Дата_рождения", author.birthDay.ToString("dd.MM.yyyy"));

writer.WriteElementString("Пол", author.sex);

foreach (Book book in author.books)

{

writer.WriteStartElement("Книга");

writer.WriteAttributeString("id", book.id.ToString());

{

writer.WriteElementString("Название", book.name);

writer.WriteElementString("Количество_страниц", book.pageCount.ToString());

}

writer.WriteEndElement();

}

}

writer.WriteEndElement();

}

}

В основной функции программы Main создадим экземпляр класса Author, вызовем функцию ReadXml по чтению данных об авторе из xml-файла author.xml, а затем создадим новый файл newAuthor.xml с помощью WriteXml и запишем в него сведения об авторе. По окончании работы программы у нас два одинаковых xml-файла.

static void Main(string[] args)

{

Author author = ReadXml("author.xml");

WriteXml("newAuthor.xml", author);

}

Полный листинг программы в приложении.

Заключение

При разработке в среде программирования Visual Studio .NET приложение обработки XML файлов был описан пример чтения(записи) - XML файла.

Созданное приложение производить чтение и запись на примере xml файла, содержащего сведения об авторе и его книгах, с помощью классов XmlTextReader и XmlTextWriter. Это самый простой, гибкий и интуитивно понятный способ обработки xml файла. К тому же он показывает неплохие результаты по скорости работы. Полученные результаты дают основание считать, что приложение работает исправно.

Все вопросы, поставленные в задании на курсовое проектирование, рассмотрены в полностью, курсовой проект выполнен в полном объеме.

Список литературы

1. СТП ВГТУ 62-2007.Стандарт предприятия. Текстовые документы (курсовые работы (проекты), рефераты, отчеты по лабораторным работам, контрольные работы). Правила оформления / ГОУВПО «Воронежский государственный технический университет»; сост. Н.И. Барсукова, Ю.В. Вертянова. Воронеж, 2007. 53 с.

2. Троелсен Э. C# и платформа .NET 3.0/ Э.Тоелсен. СПб.: Питер, 2008. 1456 с.

3. Дальви Д. XML для разработчиков-профессионалов .NET/ Д. Дальви. М.: Лори, 2003. 656 с.

4. Джонсон Г. Разработка клиентских веб-приложений на платформе Microsoft .Net Framework. Учебный курс Microsoft Экзамен 70-528. Г. Джонсон, Т. Нортроп. СПб.: Питер, 2007. 768 с.

5. Net. Сетевое программирование / А. Мунгале, В. Кумар, К. Нагел, Номан Лагари, Т. Паркер, Ш. Шивакумар, Э. Кровчик. М.: Лори, 2007. 416 с.

6. Обработка XML - файла (Руководство по программированию на C#)

Режим доступа:

msdn.microsoft.com›MSDN на русском›library/fsbx0t7x.aspx.

ПРИЛОЖЕНИЕ

Текст XMLReadWrite, program.cs:

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

namespace XMLReadWrite

{

class Program

{

static void Main(string[] args)

{

Author author = ReadXml("author.xml");

WriteXml("newAuthor.xml", author);

}

private class Author

{

public string fio = string.Empty;

public DateTime birthDay = DateTime.MinValue;

public string sex = string.Empty;

public List<Book> books = new List<Book>();

}

private class Book

{

public int id = -1;

public string name = string.Empty;

public int pageCount = -1;

}

static Author ReadXml(string fileName)

{

Author author = new Author();

using (XmlTextReader reader = new XmlTextReader(fileName))

{

while (reader.Read())

{

if (reader.IsStartElement("Автор") &&

!reader.IsEmptyElement)

{

while (reader.Read())

{

if (reader.IsStartElement("ФИО"))

author.fio = reader.ReadString();

else if (reader.IsStartElement("Дата_рождения"))

author.birthDay = DateTime.Parse(reader.ReadString());

else if (reader.IsStartElement("Пол"))

author.sex = reader.ReadString();

else if (reader.IsStartElement("Книга") &&

!reader.IsEmptyElement)

{

Book book = new Book();

book.id = Int32.Parse(reader.GetAttribute(0));

while (reader.Read())

{

if (reader.IsStartElement("Название"))

book.name = reader.ReadString();

else if (reader.IsStartElement("Количество_страниц"))

book.pageCount = Int32.Parse(reader.ReadString());

else if (!reader.IsStartElement() && reader.Name == "Книга")

{

author.books.Add(book);

break;

}

}

}

else if (!reader.IsStartElement() && reader.Name == "configuration") break;

}

}

}

}

return author;

}

static void WriteXml(string fileName, Author author)

{

using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.GetEncoding(1251)))

{

writer.Formatting = Formatting.Indented;

writer.Indentation = 1;

writer.IndentChar = '\t';

writer.WriteStartDocument();

writer.WriteStartElement("Автор");

{

writer.WriteElementString("ФИО", author.fio);

writer.WriteElementString("Дата_рождения",

author.birthDay.ToString("dd.MM.yyyy"));

writer.WriteElementString("Пол", author.sex);

foreach (Book book in author.books)

{

writer.WriteStartElement("Книга");

writer.WriteAttributeString("id",book.id.ToString());

{

writer.WriteElementString("Название", book.name);

writer.WriteElementString("Количество_страниц",

book.pageCount.ToString());

}

writer.WriteEndElement();

}

}

writer.WriteEndElement();

}

}

}

}

Текст author.xml:

<?xml version="1.0" encoding="windows-1251" ?>

- <Автор>

<ФИО>Иванов Иван Иванович</ФИО>

<Дата_рождения>31.12.1988</Дата_рождения>

<Пол>Мужской</Пол>

- <Книга id="1">

<Название>Название1</Название>

<Количество_страниц>20</Количество_страниц>

</Книга>

- <Книга id="2">

<Название>Название2</Название>

<Количество_страниц>40</Количество_страниц>

</Книга>

</Автор>

Текст newAuthor.xml:

<?xml version="1.0" encoding="windows-1251" ?>

- <Автор>

<ФИО>Иванов Иван Иванович</ФИО>

<Дата_рождения>31.12.1988</Дата_рождения>

<Пол>Мужской</Пол>

- <Книга id="1">

<Название>Название1</Название>

<Количество_страниц>20</Количество_страниц>

</Книга>

- <Книга id="2">

<Название>Название2</Название>

<Количество_страниц>40</Количество_страниц>

</Книга>

</Автор>

Размещено на Allbest.ru


Подобные документы

  • Создание БД "Экзамен". Характеристика методов класса. Необходимость использования стандартных подключаемых модулей (заголовочных файлов) Visual Studio для реализации пользовательского интерфейса и работы с вводом-выводом в поток консоли или в файл.

    курсовая работа [1,7 M], добавлен 28.05.2013

  • Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.

    реферат [86,4 K], добавлен 07.02.2011

  • Создание и проверка модели оптимального размещения файлов в вычислительной сети со звездообразной, кольцевой и произвольной топологией. Объем данных, необходимый для пересылки файлов. Оптимальное распределение файлов по узлам вычислительной сети.

    контрольная работа [56,7 K], добавлен 20.05.2011

  • Объектно-ориентированная технология создания программ. Среда разработки Visual Studio.NET. Особенности среды Microsoft Visual Studio 2010. Приложения C# для расчетов по формулам, консольный ввод-вывод. Форматирование значений данных. Программы с циклами.

    методичка [2,1 M], добавлен 11.09.2014

  • Разработка и освоение в современном производстве информационной подсистемы. Создание базы данных в среде MS SQL Server 2008 и приложения в среде MS Visual Studio 2012. Процесс ввода при выборе пунктов меню. Заполнение формы с критериями на фильтрацию.

    отчет по практике [834,4 K], добавлен 27.11.2013

  • Виды архиваторов. Использование программ, сжимающих один или несколько файлов в единый файл-архив. Размещение информации на носителях внешней памяти в более компактном виде. Создание самораспаковывающегося архива. Процесс сжатия текстовых файлов.

    презентация [492,6 K], добавлен 22.12.2014

  • Изучение алгоритмов, написание программ на языке C#. Работа с массивами, строками, перечислениями, структурами, интерфейсами. Разработка и функциональность Windows-приложения. Создание и подключение баз данных в среде программирования Visual Studio 2019.

    отчет по практике [6,7 M], добавлен 18.10.2020

  • HTML5 — язык для структурирования и представления содержимого для всемирной паутины, а также основная технология, используемая в Интернете. Создание web-приложения и использованием технологии Asp.net MVC 3 и языка web-разметки HTML5. Состав платформы MVC.

    курсовая работа [1,2 M], добавлен 25.05.2012

  • Изучение понятия архивации, сжатия файлов с целью экономии памяти и размещения сжатых данных в одном архивном файле. Описания программ, выполняющих сжатие и восстановление сжатых файлов в первоначальном виде. Основные преимущества программ-упаковщиков.

    контрольная работа [534,7 K], добавлен 11.01.2015

  • Введение в Microsoft Visual Studio. Диалоговое окно "Восстановленные файлы" интегрированной среды разработки. Веб-обозреватель интегрированной среды разработки. Диалоговое окно "Проверка подлинности прокси-сервера". Сохранение и восстановление файлов.

    реферат [22,0 K], добавлен 29.05.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.