Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Лекция 11:

Работа с XML в клиентской веб-разработке

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

XML расшифровывается как Extensible Markup Language, в переводе "расширяемый язык разметки". Как и язык HTML, он является подмножеством SGML (Standard General Markup Language). Конфигурационные файлы и файлы описания объектных источников данных создаются в формате XML.

XML - это универсальный, независящий от платформы стандарт описания информациии, который можно использовать для представления иерархических данных и унификации передаваемой информации. Без его знания невозможно понимание SOAP и следовательно, веб-сервисов. XML стал де-факто стандартом передачи данных в сети Интернет. Стандарт XML и связанных с ним форматов определяется консорциумом W3C. Например, мы создаем aspx страницы в формате XHTML - переходном между HTML и XML, стандарт которого тоже определен W3C. Стандарт XHTML налагает более строгие правила на правильное формирование документа, аналогичные правилам XML.

Целью создания XML было обеспечение совместимости при передаче структурированных данных между разными системами обработки информации, особенно при передаче таких данных через Интернет. Словари, основанные на XML (например, RDF, RSS, MathML, XHTML, SVG), сами по себе формально описаны, что позволяет программно изменять и проверять документы на основе этих словарей, не зная их семантики, то есть не зная смыслового значения элементов.

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

Отличие XML от HTML

XML создан для описания данных и фокусируется на том, что именно они из себя представляют. HTML создан для демонстрации данных и фокусируется на том, как данные выглядят. Если в традиционном HTML понятия "представление" и "визуализация" часто смешиваются, то при работе с XML мы четко разделяем эти понятия. Теги XML не предопределены создателями языка, в отличие от тегов HTML. Каждый автор документа сам определяет собственные теги.

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

В начале XML-документа обязательно появляется его декларация, или пролог. В нем указывается версия стандарта XML, которому он соответствует.

<?xml version="1.0" encoding="utf-8" ?>

Декларация не является частью XML-документа и не имеет закрывающего тега. В тексте XML-файла могут находиться комментарии в стиле HTML - <!-text -->.

XML-документ может иметь только один корневой элемент. В него могут быть вложены другие узлы, а в них, в свою очередь - другие. Каждому открывающему тегу XML должен соответствовать закрывающий тег. После завершающего тега корневого элемента не может быть других тегов. Теги XML чувствительны к регистру (case-sensitive). Теги должны быть целиком вложены друг в друга. поэтому, код, допустимый в HTML

<b><i>Пример текста</b></i>

является ошибкой в XML.

У тегов могут быть атрибуты. Значения атрибутов должны быть заключены в кавычки. Порядок атрибутов значения не имеет. Между открывающим и закрывающими тегами может находится текст. В XML сохраняются все пробелы, находящиеся в тексте. Если текста нет, можно применить сокращенную форму записи. Пример тега XML:

<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined" />

Это краткая форма тега

<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined"></PROPERTY>

Существует атрибут xmlns, который определяет пространство имен. Значением его может быть любое уникальное имя. Существует договоренность использовать URL, так как они уникальны. Пространства имен имеют смысл, аналогичный их применению в .NET Framework - чтобы не смешивать одинаковые имена, используемые разными разработчиками. Название пространства имен отделяется от имени двоеточием.

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

Объектная модель XML-документов (D0M)

Консорциум W3C принял стандарты на технологии и API для работы с XML-документами в самых разных средах и приложениях. Эти стандарты получили общее название "объектная модель документов" [Document Object Model (DOM)]. Классы, которые поддерживают DOM, обычно также поддерживают переход и модификацию произвольных секций XML-документов.

XmlDocument и XmlDataDocument

Объекты XmlDocument и XmlDataDocument являются представлением XML-данных в памяти, они используют DOM уровней 1 и 2 (DOM Level 1 и Level 2). Эти классы применяются для перемещения по XML-узлам и для их редактирования.

Класс XmlDataDocument происходит от класса XmlDocument и также является представлением реляционных данных. Содержимое объекта XmlDataDocument может храниться в формате DataSet, поддерживающем реляционное и нереляционное представление данных. Класс XmlDataDocument содержится в сборке System.Data.dll.

Эти классы поддерживают довольно много методов для реализации спецификации DOM Level 2, а также включают методы, упрощающие манипулирование ХМL-данными. Обсуждаемые здесь методы перечислены в табл. 4-5. Класс XmlDocument поддерживает все методы для создания объектов XmlElement и XmlAttribute.

XPathDocument

Объект XPathDocument представляет собой кэшированный объект XmlDocument, доступный только для чтения, пригодный для оперативного выполнения XPath-запросов. Для создания экземпляра этого объекта требуется передать конструктору объект потока. Этот класс содержит единственный полезный метод — CreateNavigator.

XmlConvert

Класс XmlConvert включает многочисленные статические методы, предназначенные для преобразования типов данных языка определений XML-схем (XSD) в типы общеязыковой исполняющей среды (CLR) и обратно. Этот класс особенно удобен, когда приходится работать с источниками данных, в которых могут оказаться XML-имена, недопустимые в CLR. Если поле базы данных называется "List Price*, то при попытке создать соответствующий ему элемент или атрибут будет сгенерировано исключение из-за пробела в имени. Преобразование имени с помощью класса XmlConvert приведет к замене пробела значением _0х0020_, в результате имя XML-элемента примет вид List_x0020_Price. Впоследствии это имя можно будет декодировать с помошью метода XmlConvert. Decode Name.

Класс XmlConvert также поддерживает множество статических методов для преобразования строк в числовые значения.

XPathNavigator

Класс DocumentNavigator — эффективное средство для перемещения по XmlDocument с использованием языка XPath. Класс XPathNavigator, применяя модель курсора и XPath-запросы, предоставляет произвольный доступ к данным только для чтения. XPathNavigator поддерживает XSL-преобразования и XSLT (XML Stylesheet Language Transforms), также ему можно передавать XML-данные, предназначенные для преобразования.

XmlNodeReader

Класс XmlNodeReader предоставляет последовательный однонаправленный доступ к данным объектов XmlDocument и XmlDataDocument. Он позволяет начать чтение с заданного узла объекта XmlDocument, а затем поочередно читает следующие узлы.

XmlTextReader

Класс XmlTextWriter предоставляет последовательный однонаправленный доступ без кэширования к данным XML. Он анализирует XML-маркеры, но не представляет XML-данные с помощью DOM. Класс XmlTextReader проверяет не содержимое документа, а только ХМ L-код.

XmlTextWriter

Класс XmlTextWriter предоставляет последовательный однонаправленный доступ для записи XML-данных без кэширования в потоки и файлы. При этом данные проверяются на соответствие >WЗС-стандарту XML версии 1.0. Класс XmlTextWriter поддерживает пространства имен и средства разрешения конфликтов пространств имен.

XmlReader

Класс XmlReader читает XML-данные и проверяет их на соответствие определениям DTD, XDR (XML Schema Reduced) и XSD (XML Schema Definition). Источником проверяемых XML-данных является объект Reader или строка, переданная конструктору.

XslTransform

Класс XslTransform преобразует XML-документ, применяя таблицу стилей XSL. Класс XslTransform поддерживает синтаксис XSLT версии 1.0 и предоставляет два метода: Load и Transform.

Метод Load загружает таблицу стилей XSLT из файла или потока. Метод Transform используется для выполнения преобразования. Transform имеет несколько перегруженных версий, но в качестве первого параметра обычно принимает XmlDocument или XmlNode, а Класс XmlReader

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

XmlReader - это абстрактный класс. Чтобы начать чтение, в статический метод Create передается объект класса XmlReaderSettings. Эта функция подсчитывает число узлов в документе.

using System.Xml; 
using System.IO; 
private int CountNodes(string xmlFile) 
{ 
  int NodesCount=0; 
  XmlReaderSettings settings = new XmlReaderSettings(); 
  settings.IgnoreWhitespace = true; 
  settings.IgnoreComments = true; 
  using (XmlReader reader = XmlReader.Create(xmlFile, settings)) 
  { 
    while (reader.Read()) 
    { 
      if (reader.NodeType == XmlNodeType.Element) 
      { 
          NodesCount++; 
      } 
    } 
  } 
  return NodesCount; 
}

Класс XmlReader позволяет извлекать из документа классы CLR. Пусть у нас есть меню ресторана.

Класс XPathDocument

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

Возьмем XML-документ "Quotes.xml" и файл трансформации XSL "Quotes.xsl". В выходной поток страницы будет направлен результат преобразования XML-документа.

<%  XPathDocument doc =  new PathDocument(Server.MapPath("App_Data\\Quotes.xml")); 
                XslCompiledTransform xsl = new XslCompiledTransform(); 
                xsl.Load(Server.MapPath("App_Data\\Quotes.xsl")); 
                xsl.Transform(doc, null, Response.OutputStream); %>

Благодаря тому, что в файле трансформации определены табличные теги, на странице появится таблица с нужной информацией.

Элемент управления XML

Элемент управления XML предоставляет способ преобразовать XML-документ, используя таблицу стилей XSL. Свойство DocumentSource позволяют задать XML-файл, в котором находятся данные, TransformSource - файл трансформации XSLT.

<asp:Xml ID="Xml1" runat="server" DocumentSource="~/App_Code/Quotes.xml" 
         TransformSource="~/App_Data /Quotes.xsl"></asp:Xml>

XMLDataSource

Элемент - источник данных XMLDataSource обеспечивает простой способ подключения XML-документов как источников данных к элементам, отображающим информацию. Также можно задать запрос XPath для того, чтобы отфильтровать данные. Как и SqlDataSource, он позволяет редактировать, удалять, добавлять записи данных. Для этого нужно получить доступ к находящемуся в нем объекту XmlDataDocument с помощью вызова метода GetXmlDocument. После редактирования документ сохраняется с помощью метода Save.

В отличие от табличных данных в СУБД, данные в XML-файлах иерархичны, поэтому XMLDataSource удобно привязывать к иерархичным элементам управления, например Menu.

Синтаксис привязки к данным XML

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

<% XPathBinder.Eval(Container.DataItem, "name"); %>

Как и при связывании с помощью SQLDataSource, можно сокращенно писать:

<%# XPath("name")%>

Так же, как и у DataBinder, метод Eval класса XPathBinder поддерживает строки форматирования:

<% XPath("employees/employee/HireDate", 
                      "{0:mm dd yyyy}") %>

Применим этот синтаксис в элементе DataList, который получает данные из источника данных XmlDataSource:

<asp:XmlDataSource ID="XmlDataSource1" runat="server" 
                   DataFile="~/nobel.xml" XPath="//nobel/literature/writer"> 
</asp:XmlDataSource> 
<asp:DataList ID="DataList1" DataSourceID="XmlDataSource1" 
              runat="server"> 
  <ItemTemplate> 
    <p> 
      <%# XPath("name")%>  получил премию по литературе в 
      <%# XPath("winningdate")%> 
        за произведение <%# XPath("work")%>
      </b> 
    </p> 
  </ItemTemplate> 
</asp:DataList>
< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Екатерина Соколова
Екатерина Соколова
Россия, Ухта
Никита Гекторов
Никита Гекторов
Украина, Донецк