|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
12. Работа с данными в формате XMLРабота с данными в формате XML в приложениях ASP.NET 2.0, объект XmlDataDocument и элемент управления XML Этот модуль посвящен тому, как можно работать с данными в формате XML из приложений ASP.NET. XML расшифровывается как Extensible Markup Language (расширяемый язык разметки), хотя сам XML - это не язык. XML - набор правил, используемых для создания своих языков разметки. Например, представим себе, что у нас существуют такие данные о сотруднике:
Эти данные, конечно, можно представить как угодно: в виде таблицы в реляционной базе данных, в виде таблицы Excel или HTML, в виде таблицы в документе Word или в виде текстового документа ASCII, в виде файла *.csv и т.п. Если мы представим их в формате придуманного нами XML-совместимого языка разметки ABML (Address Book Markup Language), то они будут выглядеть так:
Немного о том, как расшифровать этот код. Первые две строки - это пролог (использовать его, в принципе, необязательно, но очень рекомендуется). Строка
называется объявлением XML (XML Declaration) и говорит о том, что этот файл соответствует спецификации XML 1.0, принятой в качестве рекомендации World Wide Web Consortium 10 февраля 1998 года. Строка
называется определением типа документа (Document Type Definition) и говорит о том, что структура языка, которому соответствует этот документ, описана в файле abml.dtd (можно использовать и внутренние DTD, когда описание языка находится прямо в документе). Сейчас для описания структуры XML-совместимых языков чаще используются не DTD, а XML Schema - к ним проще обращаться и они обеспечивают больше возможностей, в частности, при описании различных типов данных. Эта же строка с использованием XML Schema может выглядеть так:
или
в зависимости от того, где лежит сама Schema - описание данного языка - в файле abml.xml или на Web-сервере (корпоративное хранилище схем от Microsoft - BizTalk Server). Пример XML Schema для нашего языка может выглядеть так:
XML – это формализованный набор правил для «разметки» документа – то есть выделения его логической структуры. То, что находится внутри любого документа, совместимого с форматом XML, можно разбить на две категории: разметку и само содержание. Вся информация о разметки должна начинаться либо с символа амперсанда (&), либо с символа левой угловой скобки (<). В XML существует шесть типов информации разметки: элементы, атрибуты, комментарии, инструкции обработки, ссылки на сущности и разделы CDATA. · Элементы (elements) – это наиболее распространенный тип информации о разметке. Элемент выделяет логическую составную часть документа. Обычный документ состоит из открывающих и закрывающих тегов, которые могут окружать содержимое, другой элемент, или и то, и другое вместе. Теги с названиями элемента заключаются в угловые скобки. Вот пример элемента:
· Атрибуты (attributes) состоят из пары имя атрибута/значение атрибута и применяются к элементам. Атрибуты положено помещать после имени элемента в открывающем теге. Например, атрибутами являются ширина и высота:
· Комментарии (comments) – это любой текст, который будет игнорироваться процессором XML. Пример:
· Инструкции обработки (processing instructions) используются для передачи информации приложению, обрабатывающему документ XML. Синтаксис инструкции обработки выглядит так:
· Ссылки на сущности (entity references) используются для того, чтобы помещать в документ зарезервированные символы или зарезервированные слова. К примеру, нам надо вставить в документ левую угловую скобку (<), которая является зарезервированным символом XML. Просто так вставить в текст документа мы ее не сможем: приложение, работающее с документом, решит, что она относится к разметке. Поэтому нам необходимо использовать сочетание символов <. lt означает less than (меньше чем), а амперсанд (&) и точка с запятой (;) выделяют ссылку на сущность. · Раздел CDATA (CDATA section) – это часть текста, которая не обрабатывается, как остальные части документа XML, а передаваться приложению напрямую. Это средство может пригодиться, например, при передаче приложению какого-либо кода. Синтаксические принципы XML: · Документы XML состоят из символов Unicode (Unicode – это 16-битный набор символов, который позволяет отображать документы на любых языках). · XML чувствителен к регистру. Теги <HTML> и <html> в нем – это разные теги. · Пустое пространство (whitespace) – это невидимые символы, такие, как пробел (ASCII 32), символ табуляции (ASCII 9), символы возврата каретки (ASCII 13) и символы перевода строки (ASCII 10). Пустое пространство игнорируется внутри тегов, но сохраняется в символьных данных (то есть между открывающим и закрывающим тегами). Пустое пространство в символьных данных передается обрабатывающему приложению. · Многие компоненты XML должны иметь имена (наиболее наглядный пример – элементы и атрибуты). Правила именования XML выглядят следующим образом: имя XML должно начинаться с буквы или подчеркивания, за которым следует любое количество букв, цифр, дефисов, подчеркиваний или точек, например: Мой_Уникальный_Идентификатор_Тега-123 2_Это_имя_является_неверным · Имя компонента XML не может начинаться с символов xml (как в верхнем, так и в нижнем регистре). Такие имена зарезервированы создателями спецификации для служебных целей. · Символьные значения должны быть помещены в одинарные или двойные кавычки. · В XML должен строго соблюдаться порядок вложенности тегов. · Любому открывающему тегу в XML должен соответствовать закрывающий тег. · Пустой тег в XML записывается как открывающий тег, перед правой угловой скобкой в котором стоит прямой слеш (/). · В документе XML может быть только один корневой элемент. В чем преимущества размещения данных в XML перед традиционными двоичными форматами? Почему в настоящее время большинство крупных производителей программного обеспечения либо уже полностью перешли на работу с данными в XML-совместимом формате (например, Micrоsoft Office 2003), либо планируют перейти в ближайшем будущем? Главная причина - данные в XML очень легко передавать между самыми разными приложениями и их очень легко преобразовывать. Дополнительные моменты, связанные с преимуществами XML:
Well-formed XML - такой код XML, который соответствует требованиям синтаксиса этого языка (например, каждому открывающему тегу соответствует закрывающий тег). Valid XML - корректный с точки зрения логической структуры этого языка (например, элементы правильно вложены друг в друга), определенной в DTD или XML Schema. Немного по терминологии XML, которая будет использоваться в этом курсе: · XSD - XML Schema Definition, обычно используемое в VS.NET описание структуры документа XML. Обычно она размещается в файлах с расширением *.xsd. Внутри схемы используются специальные теги <xsd:...>. Каждый элемент, помеченный таким префиксом, относится к XML Schema. Внутри XML Schema можно использовать пространства имен. Например, чтобы указать, что внутри схемы используются два пространства имен, относящихся к W3C XML Schema и Microsoft Office 10 Data Schema, можно использовать тег <xsd:schema xmlns:xsd="http://www.w3c.org/2000/10/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata"> Чтобы внутри схемы определить строковый элемент LastName, который может встречаться в документе 0 или больше раз, можно, например, использовать следующий тег: <xsd:element name="LastName" minOccurs="0" maxOccurs="*" type="string"></xsd:element> · для описания преобразований XML-совместимых документов используются документы на специальном языке программирования XSLT (eXtensible Stylesheet Language Transform). Сам этот язык, конечно, также является XML-совместимым. В XSLT используется три типа документов: o документ-источник (source document). Этот документ XML "подается на вход" для преобразования. В нашем случае этот может быть такой документ: <?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="Employees1.xsl"?> <employees> <employee> <name>Stuart Munson</name> <jobtitle>Programmer</jobtitle> </employee> <employee> <name>Robert Brown</name> <jobtitle>Tester</jobtitle> </employee> </employees> o документ таблицы стилей XSLT (XSLT style sheet document) - XML-совместимый документ, в котором описываются правила проведения трансформаций. В нашем случае пример этого документа может быть таким: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:apply-templates select="//employee" /> </xsl:template> <xsl:template match="employee"> <P> <xsl:apply-templates /> <HR /> </P> </xsl:template> <xsl:template match="name"> <FONT COLOR="red" /> <B> <xsl:value-of select="." /> </B> </xsl:template> <xsl:template match="jobtitle"> <BR/> <FONT COLOR="blue" /> <xsl:value-of select="." /> </xsl:template> </xsl:stylesheet> o документ - результат преобразований. Например, при применении нашего преобразования имя сотрудника будет помечено красным, а его должность - синим. · XPath - специальный язык, который можно использовать для навигации по дереву элементов XML. При использовании объектной модели XPath документ XML представляется в виде дерева узлов. Информация содержится в свойствах этих узлов. · DOM (Document Object Model) - представление дерева документа XML в оперативной памяти. DOM позволяет выполнять навигацию по документу XML и редактировать его. Стандартные свойства, методы и события DOM определены в документе, принятом W3C. В ASP.NET при помощи DOM можно создать документ XML и отправить его в броузер пользователю. Другой вариант - клиентский скрипт создает при помощи DOM документ XML на клиенте и передает его на Web-сервер. · XQuery - это специализированный язык запросов к информации, которая хранится в документах XML. Работа XQuery во многом основана на XPath. Надо сказать, что XML - это стандартный формат для работы с данными в ADO.NET. Про формат XML и как его можно использовать с DataSet - ниже. Возможности использования XML при работе с DataSet такие: · DataSet могут сериализовать данные в формате XML. Схема DataSet (включая таблицы, столбцы, типы данных и ограничения) определяется при этом в XML Schema (файл .xsd). · обмен данными из DataSet с удаленными клиентами предписывается производить в формате XML; · XML можно использовать для синхронизации и преобразования данных в DataSet. Еще немного про взаимодействие XML и DataSet: · можно не только создавать XML Schema на основе DataSet (о чем говорилось выше, это делается при помощи метода WriteXmlSchema), но и наоборот - генерировать DataSet на основе информации их XML Schema (для этого - метод ReadXmlSchema). Есть возможность сгенерировать DataSet даже без схемы - просто на основе документа XML. Для этой цели предназначен метод InferXmlSchema. · для объекта DataSet предусмотрен метод ReadXML, который позволяет считать текстовый документ XML (поток текстовых данных XML) в DataSet. Другой метод, WriteXML, позволяет сохранять содержимое DataSet в XML-совместимом формате. Такая возможность позволяет очень просто организовывать обмен данными между различными приложениями и платформами. · вы можете создать представление XML (объект XmlDataDocument) на основе информации из DataSet. Получается, что с информацией в DataSet можно работать двумя способами: обычными реляционными (с самим DataSet) и XML-методами. Оба представления автоматически синхронизируются (при внесении изменений через любое представление). · вы можете применять преобразования XSLT к данным, которые хранятся в DataSet. Теперь - о том, как все это выглядит на практике. Считать информацию из файла XML в DataSet можно при помощи кода вида Dim ds As New DataSet() ds.ReadXml(Server.MapPath("filename.xml")) Метод MapPath для специального объекта Server позволяет преобразовать виртуальный путь к файлу в Web-приложении в физический путь. Будет ли сгенерирована структура DataSet автоматически из файла XML или она останется прежней, зависит от того, была ли она уже сформирована в этом DataSet и от того, был ли указан необязательный параметр метода ReadXml XmlReadMode. Сохранить информацию из DataSet в XML-совместимом формате можно так: Dim ds As New DataSet() Dim da As New SqlDataAdapter( _ "select * from Authors", conn) da.Fill(ds) ds.WriteXml(Server.MapPath("filename.xml")) Есть еще два метода, которые позволяют получить из DataSet данные в формате XML и положить их в строковую переменную. Это методы GetXml и GetXmlSchema. Пример может выглядеть так: Dim strXmlDS As String = ds.GetXml() В DataSet часто помещаются объекты DataTable, связанные между собой отношениями DataRelation (то есть таблицы с Primary и Foreign key). При экспорте в XML информация из родительской таблицы может быть дополнена информацией из подчиненной таблицы. Записи из подчиненной таблицы будут выглядеть как вложенные элементы для записей из главной. Чтобы реализовать такую возможность, необходимо для объекта DataRelation в DataSet для свойства Nested установить значение True (по умолчанию False). Примеры: предположим, мы просто экспортируем данные без использования этого свойства: Dim ds As New DataSet() ’fill the DataSet ... Dim parentCol As DataColumn = _ ds.Tables("Publishers").Columns("pub_id") Dim childCol As DataColumn = _ ds.Tables("Titles").Columns("pub_id") Dim dr As New DataRelation _ ("TitlePublishers", parentCol, childCol) ds.Relations.Add(dr) ds.WriteXml(Server.MapPath("PubTitlesNotNested.xml"), _ XmlWriteMode.IgnoreSchema) Код XML получается такой: <?xml version = "1.0" standalone = "yes"?> <NewDataSet> <Titles> <title>title1</title> <pub_id>1</pub_id> <price>40.00</price> </Titles> <Titles> <title>title2</title> <pub_id>2</pub_id> <price>60.00</price> </Titles> <Titles> <title>title3</title> <pub_id>1</pub_id> <price>30.00</price> </Titles> <Publishers> <pub_id>1</pub_id> <pub_name>pub1</pub_name> </Publishers> <Publishers> <pub_id>2</pub_id> <pub_name>pub2</pub_name> </Publishers> </NewDataSet> а теперь используем устанавливаем свойство Nested для объекта DataRelation в True: Dim dr As New DataRelation _ ("TitlePublishers", parentCol, childCol) dr.Nested = True ds.Relations.Add(dr) ds.WriteXML(Server.MapPath("PubTitlesNested.xml"), _ XmlWriteMode.IgnoreSchema) Код XML получается уже совсем другой. В каждый элемент типа Pub вложены элементы Titles, выпущенные этим издательством: <?xml version = "1.0"standalone = "yes"?> <NewDataSet> <Publishers> <pub_id>1</pub_id> <pub_name>pub1</pub_name> <Titles> <title>title1</title> <pub_id>1</pub_id> <price>40.00</price> </Titles> <Titles> <title>title3</title> <pub_id>1</pub_id> <price>30.00</price> </Titles> </Publishers> <Publishers> <pub_id>2</pub_id> <pub_name>pub2</pub_name> <Titles> <title>title2</title> <pub_id>2</pub_id> <price>60.00</price> </Titles> </Publishers> </NewDataSet> XmlDataDocument - это XML-представление данных в DataSet в оперативной памяти. XmlDataDocument неразрывно связан с DataSet. Любые изменения, внесенные в XmlDataDocument, немедленно отражаются в DataSet и наоборот. Ниже будет рассказано о приемах работы с XmlDataDocument. DataSet - это реляционное представление данных, а XmlDataDocument - иерархическое. Применение XmlDataDocument очень удобно, поскольку работать с данными в формате XML только через DataSet бывает сложно. Например, если загрузить данные из файла XML в DataSet, а затем выгрузить обратно, то вполне может получиться так, что файл будет неузнаваем: будет потеряно форматирование, вполне возможно - порядок элементов, возможно, элементы, которые были проигнорированы из-за несоответствия со схемой, определенной для DataSet. В XmlDataDocument можно положить документ XML напрямую, а можно создать его на основе DataSet. Код для первого варианта может выглядеть так: Dim objXmlDataDoc As New XmlDataDocument() objXmlDataDoc.Load(Server.MapPath("file.xml")) или так: objXmlDataDoc.DataSet.ReadXml(Server.MapPath("file.xml")) Разницы никакой не будет. А можно вначале создать DataSet, заполнить его данными, а затем на основе его создать XmlDataDocument: Dim ds As New DataSet() ’fill in ds ... Dim objXmlDataDoc As New XmlDataDocument(ds) После того, как объект XmlDataDocument создан, с ним можно выполнять различные действия: · привязывать к DataGrid и другим элементам управления: dg.DataSource = objXmlDataDoc.DataSet · получать нужную строку (она возвращается в виде объекта XmlElement): Dim elem As XmlElement elem = objXmlDataDoc.GetElementFromRow _ (ds.Tables(0).Rows(1)) · использовать полный набор свойств и методов DOM. Эти свойства и методы XmlDataDocument наследует от объекта XmlDocument · применять преобразования XSLT (для этой цели используются объекты XslTransform). Подробнее о преобразованиях средствами XSLT: XSLT позволяет преобразовать исходный документ XML в другой документ, отличающийся по формату и структуре. Например, при помощи XSLT документ XML можно преобразовать к код HTML для отображения в Web-приложении. В ASP.NET для выполнения преобразований XSLT используется класс XslTransform. Как выглядит работа с ним? · для проведения преобразований вначале нужно создать DataSet и соответствующий ему XmlDataDocument: Dim ds As New DataSet() ’fill in DataSet ... Dim xmlDoc As New XmlDataDocument(ds) · следующее действие - создаем объект XslTransform: Dim xslTran As New XslTransform() · используем метод Load этого объекта, чтобы загрузить в него преобразование: xslTran.Load(Server.MapPath("PubTitles.xsl")) · создаем объект XmlTextWriter (он будет использован для вывода результатов преобразования): Dim writer As New XmlTextWriter _ (Server.MapPath("PubTitles_output.html"), _ System.Text.Encoding.UTF8) · выполняем само преобразование при помощи метода Transform объекта XslTransform. У этого метода - несколько вариантов. Один из вариантов его применения может выглядеть так: xslTran.Transform(xmlDoc, Nothing, writer) · закрываем объект Writer: writer.Close() Для работы с XML на Web-форме можно обойтись и совсем без объекта DataSet (и элементов управления, предназначенных для отображения данных из реляционного источника). Вместо этого можно использовать элемент управления XML Web Server Control. Он позволяет выводить на Web-странице сами документы XML или результаты их преобразований. Код XML можно передавать этому элементу управления разными способами: · напрямую открывать их с диска (через свойство DocumentSource). В этом случае (если вы не применили преобразования XSLT) документ XML будет выведен на форму "как есть": <body> <h3>XML Example</h3> <form runat="server"> <asp:Xml id="xml1" DocumentSource="MySource.xml" TransformSource="MyStyle.xsl" runat="server" /> </form> </body> · открывать их как объекты и передавать их этому элементу управления (через свойство Document). В нашем случае XML Web Server Control называется Xml1: Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim xmlDoc As System.Xml.XmlDocument = _ New System.Xml.XmlDocument() xmlDoc.Load(Server.MapPath("MySource.xml")) Dim xslTran As System.Xml.Xsl.XslTransform = _ New System.Xml.Xsl.XslTransform() xslTran.Load(Server.MapPath("MyStyle.xsl")) Xml1.Document = xmlDoc Xml1.Transform = xslTran End Sub · просто программным образом генерировать код XML и передавать этот код XML Web Server Control (через свойство DocumentContent) · вообще напрямую вписать код XML в тег XML Web Server Control: <asp:xml TransformSource="MyStyle.xsl" runat="server"> <clients> <name>Frank Miller</name> <name>Judy Lew</name> </clients> </asp:xml> · выполнить преобразование и передать ему результаты преобразования Пример, который иллюстрирует все эти возможности, представлен ниже: <asp:Xml id="Xml1" Document="XmlDocument object to display" DocumentContent="String of XML" DocumentSource="Path to XML Document" Transform="XslTransform object" TransformSource="Path to XSL Transform Document" runat="server"> Добавить XML Web Server Control на Web-форму можно просто перетаскиванием этого элемента управления из ToolBox или программно: <asp:Xml id="xmlCtl" runat="server" /> Данные из XML Web Server Control можно сохранить на диске: XmlCtl.Document.Save(Server.MapPath("xmlResult.xml"))
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||