Проектирование и разработка веб-приложений на основе технологий Microsoft

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

Разбить на страницы
Показывать лекцию целиком

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>

Создание XmlDocument "с нуля"

Чтобы создать XmlDocument, следует создать объект XmlDocument. Объект XmlDocument поддерживает методы CreateElement и CreateAttribute, используемые для добавления узлов в объект XmlDocument. Объект XmlElement содержит свойство Attributes, в которое входит набор XmlAttributeCollection. Класс XmlAttributeCollection происходит от класса XmlNamedNodeMap, представляющего собой набор пар "имя—значение".

protected void Button1_Click(object sender, EventArgs e) {
  //Объявить и создать XmlDocument XmlDocument xmlDoc = new XmlDocumentО;
  XmlElement el;
  int childCounter;
  int grandChildCounter;
  //Создать описание xml xmlDoc.AppendChild(
  xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));

  //Создать корневой узел и добавить его в документ 
  el = xmlDoc.CreateElementC'myRoot"); 
  xmlDoc.AppendChild(el);

  //Цикл для обработки дочерних узлов
  for (childCounter = 1; childCounter <= 4; childCounter++) {
   XmlElement childelmt; XmlAttribute childattr;
   //Создать дочерний узел с атрибутом ID 
   childelmt = xmlDoc.CreateElement("myChild"); 
   childattr = xmlDoc.CreateAttribute("ID"); 
   childattr. Value = childCounter. ToStringO; 
   childelmt.Att ributes.Append(childatt r);
   //Добавить элемент в корневой элемент el.AppendChild(childelmt);
   for (grandChildCounter = 1; grandChildCounter <= 3; grandChildCounter++) {
    //Создать "внучатый" узел
    childelmt.AppendChild(xmlDoc.CreateElement("Grandchild"));
   }
 }
 //Сохранить в файл
 xmlDoc.Save(MapPath("XmlDocumentTest.xml"));
 Label lbl = GetLabel(275, 20);
 lbl.Text = "XmlDocumentTest.xml Created";
}

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

<?xml version="1.О" encoding="utf-8" ?> 
<myRoot> 
  <myChild ID="1"> 
    <GrandChild /> 
    <GrandChild /> 
    <GrandChild /> 
  </myChild>
  <myChild ID="2">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </myChild> 
  <myChild ID="3 ">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </myChild> 
  <myChild ID=*'4">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </nyCnild> 
</myRoot>

Код, представленный выше, подходит и для объекта XmlDataDocument, но объект XmlDataDocument имеет больше возможностей для работы с реляционными данными.

Чтение и запись XML документов средствами ASP.NET 3.0

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

Чтобы получить доступ к классам XML, достаточно добавить using System.Xml.

Пространство имен System.Xml дополняется также файлом System.Data.dll, где размещен класс XmlDataDocument. Если для работы требуется указанный класс, следует установить ссылку на файл System.Data.dll.

Чтение XML с помощью класса XmlReader

Класс XmlReaderабстрактный класс, который предоставляет однопроходный доступ к XML-данным, только для чтения и без кэширования. Он согласуется с рекомендациями XML 1.0 консорциума W3C и рекомендациями пространства имен в XML.

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

Класс XmlReader позволяет следующее.

  • Проверить, что все символы являются допустимыми XML-символами, и что имена элементов и атрибутов являются допустимыми именами XML.
  • Проверить, что XML-документ правильного формата.
  • Проверить данные на соответствие DTD или схеме.
  • Получить данные из потока XML или пропустить ненужные записи, используя модель Pull.
  • StringBuilder output = new StringBuilder();
    
    String xmlString =
        @"<bookstore>
            <book genre='роман'>
              <title>Сто лет одиночества</title>
              <author>
                <first-name>Габриэль</first-name>
                <last-name>Маркес</last-name>
              </author>
              <price>120rur</price>
            </book>
        </bookstore>";
    
    // Создание  XmlReader
    using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
    {
      reader.ReadToFollowing("book");
      reader.MoveToFirstAttribute();
      string genre = reader.Value;
      output.AppendLine("The genre value: " + genre);
    
      reader.ReadToFollowing("title");
      output.AppendLine("Content of the title element: " + 
                        reader.ReadElementContentAsString());
    }
    
    Label1.Text = output.ToString();

    В результате, в качестве текста элемента управления Label1 получим следующее:

    The genre value: роман Content of the title element: Сто лет одиночества

    Запись XML с помощью класса XmlWriter

    Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку.

    Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку. Предоставляет средства для создания XML-данных правильного формата однопроходным способом с возможностью только для записи без кэширования. Класс XmlWriter поддерживает рекомендации W3C XML 1.0 и пространств имен в XML. В этом разделе рассматривается создание экземпляра XmlWriter с указанным набором функций, проверкой соответствия данных, записи типизированных данных и т. д.

    string xmlFile = Request.PhysicalApplicationPath + @"App_Data\BookStore.xml";
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.ConformanceLevel = ConformanceLevel.Auto;
    settings.OmitXmlDeclaration = false;
    using (XmlWriter writer = XmlWriter.Create(xmlFile, settings))
    {
      writer.WriteStartDocument(false);
      writer.WriteComment("Комментарий.");
      writer.WriteStartElement("books");
      writer.WriteStartElement("book");
      writer.WriteElementString("id","1");
      writer.WriteElementString("name", "Сто лет одиночества");
      writer.WriteElementString("author", "Габриэль Гарсиа Маркес");
      writer.WriteElementString("price","120rur");
      writer.WriteEndElement();
      writer.WriteEndElement();
      writer.Flush();
    }

    Записанный Xml файл:

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
      <!-- Комментарий -->
      <books>
        <book>
          <id> 1 </id>
          <name> Сто лет одиночества </name>
          <author> Габриэль Гарсиа Маркес </author>
          <price> 120rur </price>
        </book>
      </books>

    Дополнительные источники

  • http://www.interface.ru/home.asp?artId=5830
  • http://www.beansoftware.com/ASP.NET-Tutorials/Using-XML.aspx
  • http://www.aspnetmania.com/Articles/Article/59.html
  • http://www.w3schools.com/aspnet/aspnet_xml.asp
  • http://msdn.microsoft.com/ru-ru/library/9d83k261.aspx
  • http://msdn.microsoft.com/ru-ru/library/tx3wa6ka.aspx
  • Страницы:

    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>

    Создание XmlDocument "с нуля"

    Чтобы создать XmlDocument, следует создать объект XmlDocument. Объект XmlDocument поддерживает методы CreateElement и CreateAttribute, используемые для добавления узлов в объект XmlDocument. Объект XmlElement содержит свойство Attributes, в которое входит набор XmlAttributeCollection. Класс XmlAttributeCollection происходит от класса XmlNamedNodeMap, представляющего собой набор пар "имя—значение".

    protected void Button1_Click(object sender, EventArgs e) {
      //Объявить и создать XmlDocument XmlDocument xmlDoc = new XmlDocumentО;
      XmlElement el;
      int childCounter;
      int grandChildCounter;
      //Создать описание xml xmlDoc.AppendChild(
      xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));
    
      //Создать корневой узел и добавить его в документ 
      el = xmlDoc.CreateElementC'myRoot"); 
      xmlDoc.AppendChild(el);
    
      //Цикл для обработки дочерних узлов
      for (childCounter = 1; childCounter <= 4; childCounter++) {
       XmlElement childelmt; XmlAttribute childattr;
       //Создать дочерний узел с атрибутом ID 
       childelmt = xmlDoc.CreateElement("myChild"); 
       childattr = xmlDoc.CreateAttribute("ID"); 
       childattr. Value = childCounter. ToStringO; 
       childelmt.Att ributes.Append(childatt r);
       //Добавить элемент в корневой элемент el.AppendChild(childelmt);
       for (grandChildCounter = 1; grandChildCounter <= 3; grandChildCounter++) {
        //Создать "внучатый" узел
        childelmt.AppendChild(xmlDoc.CreateElement("Grandchild"));
       }
     }
     //Сохранить в файл
     xmlDoc.Save(MapPath("XmlDocumentTest.xml"));
     Label lbl = GetLabel(275, 20);
     lbl.Text = "XmlDocumentTest.xml Created";
    }

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

    <?xml version="1.О" encoding="utf-8" ?> 
    <myRoot> 
      <myChild ID="1"> 
        <GrandChild /> 
        <GrandChild /> 
        <GrandChild /> 
      </myChild>
      <myChild ID="2">
        <GrandChild />
        <GrandChild />
        <GrandChild /> 
      </myChild> 
      <myChild ID="3 ">
        <GrandChild />
        <GrandChild />
        <GrandChild /> 
      </myChild> 
      <myChild ID=*'4">
        <GrandChild />
        <GrandChild />
        <GrandChild /> 
      </nyCnild> 
    </myRoot>

    Код, представленный выше, подходит и для объекта XmlDataDocument, но объект XmlDataDocument имеет больше возможностей для работы с реляционными данными.

    Чтение и запись XML документов средствами ASP.NET 3.0

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

    Чтобы получить доступ к классам XML, достаточно добавить using System.Xml.

    Пространство имен System.Xml дополняется также файлом System.Data.dll, где размещен класс XmlDataDocument. Если для работы требуется указанный класс, следует установить ссылку на файл System.Data.dll.

    Чтение XML с помощью класса XmlReader

    Класс XmlReaderабстрактный класс, который предоставляет однопроходный доступ к XML-данным, только для чтения и без кэширования. Он согласуется с рекомендациями XML 1.0 консорциума W3C и рекомендациями пространства имен в XML.

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

    Класс XmlReader позволяет следующее.

  • Проверить, что все символы являются допустимыми XML-символами, и что имена элементов и атрибутов являются допустимыми именами XML.
  • Проверить, что XML-документ правильного формата.
  • Проверить данные на соответствие DTD или схеме.
  • Получить данные из потока XML или пропустить ненужные записи, используя модель Pull.
  • StringBuilder output = new StringBuilder();
    
    String xmlString =
        @"<bookstore>
            <book genre='роман'>
              <title>Сто лет одиночества</title>
              <author>
                <first-name>Габриэль</first-name>
                <last-name>Маркес</last-name>
              </author>
              <price>120rur</price>
            </book>
        </bookstore>";
    
    // Создание  XmlReader
    using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
    {
      reader.ReadToFollowing("book");
      reader.MoveToFirstAttribute();
      string genre = reader.Value;
      output.AppendLine("The genre value: " + genre);
    
      reader.ReadToFollowing("title");
      output.AppendLine("Content of the title element: " + 
                        reader.ReadElementContentAsString());
    }
    
    Label1.Text = output.ToString();

    В результате, в качестве текста элемента управления Label1 получим следующее:

    The genre value: роман Content of the title element: Сто лет одиночества

    Запись XML с помощью класса XmlWriter

    Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку.

    Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку. Предоставляет средства для создания XML-данных правильного формата однопроходным способом с возможностью только для записи без кэширования. Класс XmlWriter поддерживает рекомендации W3C XML 1.0 и пространств имен в XML. В этом разделе рассматривается создание экземпляра XmlWriter с указанным набором функций, проверкой соответствия данных, записи типизированных данных и т. д.

    string xmlFile = Request.PhysicalApplicationPath + @"App_Data\BookStore.xml";
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.ConformanceLevel = ConformanceLevel.Auto;
    settings.OmitXmlDeclaration = false;
    using (XmlWriter writer = XmlWriter.Create(xmlFile, settings))
    {
      writer.WriteStartDocument(false);
      writer.WriteComment("Комментарий.");
      writer.WriteStartElement("books");
      writer.WriteStartElement("book");
      writer.WriteElementString("id","1");
      writer.WriteElementString("name", "Сто лет одиночества");
      writer.WriteElementString("author", "Габриэль Гарсиа Маркес");
      writer.WriteElementString("price","120rur");
      writer.WriteEndElement();
      writer.WriteEndElement();
      writer.Flush();
    }

    Записанный Xml файл:

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
      <!-- Комментарий -->
      <books>
        <book>
          <id> 1 </id>
          <name> Сто лет одиночества </name>
          <author> Габриэль Гарсиа Маркес </author>
          <price> 120rur </price>
        </book>
      </books>

    Дополнительные источники

  • http://www.interface.ru/home.asp?artId=5830
  • http://www.beansoftware.com/ASP.NET-Tutorials/Using-XML.aspx
  • http://www.aspnetmania.com/Articles/Article/59.html
  • http://www.w3schools.com/aspnet/aspnet_xml.asp
  • http://msdn.microsoft.com/ru-ru/library/9d83k261.aspx
  • http://msdn.microsoft.com/ru-ru/library/tx3wa6ka.aspx
  • Вернуться к учебному плану