Подсветка XML-кода

<?php
function highlight_xml($text)
{
return '<code>'.nl2br(
  preg_replace("~(&quot;|&#039;)[^<>]*(&quot;|&#039;)~iU", '<span style="color: #DD0000">$0</span>',
  preg_replace("~&lt;!--.*--&gt;~iU", '<span style="color: #FF8000">$0</span>',
  preg_replace("~(&lt;[^\s!]*\s)([^<>]*)([/?]?&gt;)~iU", '$1<span style="color: #007700">$2</span>$3',
  preg_replace("~&lt;[^<>]*&gt;~iU", '<span style="color: #0000BB">$0</span>',
  htmlspecialchars($text,ENT_QUOTES)))))).'</code>';
}

$text='<strong>тело</strong><br/>';

echo highlight_xml($text);
?>

Добавлено: 24 Мая 2018 20:44:33 Добавил: Андрей Ковальчук

Полезный класс для конвертации Array в XML php

Задача проста: конвертировать php массив любой вложенности в xmlдокумент. Готового решения в самом языке так и не обнаружил. Есть функции которые конвертируют из массива в JSON и обратно, а вот в XML нет. Я конечно заядлый велосипедостроитель, но был не тот случай - время поджимало а проект надо было завершать. Ну что же немного поискав на просторах сети нашел нужное решение

class ArrayToXML
{
  /**
   * Функция конвертации массива в XML объект
   * На вход подается мульти вложенный массив, на выходе получается с помощью рекурсии валидный xml
   *
   * @param array $data
   * @param string $rootNodeName - корень вашего xml.
   * @param SimpleXMLElement $xml - используется рекурсивно
   * @return string XML
   */
  public static function toXml($data, $rootNodeName = 'data', $xml=null)
  {
    // включить режим совместимости, не совсем понял зачем это но лучше делать
    if (ini_get('zend.ze1_compatibility_mode') == 1)
    {
      ini_set ('zend.ze1_compatibility_mode', 0);
    }
  
    if ($xml == null)
    {
      $xml = simplexml_load_string("<?xml version=\"1.0\" encoding=\"utf-8\"?><$rootNodeName />");
    }
  
    //цикл перебора массива
    foreach($data as $key => $value)
    {
      // нельзя применять числовое название полей в XML
      if (is_numeric($key))
      {
        // поэтому делаем их строковыми
        $key = "unknownNode_". (string) $key;
      }
  
      // удаляем не латинские символы
      $key = preg_replace('/[^a-z0-9]/i', '', $key);
  
      // если значение массива также является массивом то вызываем себя рекурсивно
      if (is_array($value))
      {
        $node = $xml->addChild($key);
        // рекурсивный вызов
        ArrayToXML::toXml($value, $rootNodeName, $node);
      }
      else
      {
        // добавляем один узел
                                $value = htmlentities($value);
        $xml->addChild($key,$value);
      }
  
    }
    // возвратим обратно в виде строки  или просто XML-объект
    return $xml->asXML();
  }
}

Использовать это чудо можно так

$data = array('color'=>'red','colors'=>array('#fff','#ddd','#eee'));
echo ArrayToXML::toXML($data);

В итоге на выходе получаем

<?xml version="1.0" encoding="utf-8"?>
<data>
 <color>red</color>
 <colors>
  <unknownNode>#fff</unknownNode>
  <unknownNode>#ddd</unknownNode>
  <unknownNode>#eee</unknownNode>
 </colors>
</data>

Добавлено: 20 Апреля 2018 19:06:06 Добавил: Андрей Ковальчук

XML-Sapiens - орудие разделения функциональности сайта и программного ядра

Xml

С каждым днем, и даже с каждым часом, объем котента в Интернете неизменно растет и тенденция эта прогрессирует. Более того, конкурентная среда вынуждает сайтостроителей разрабатывать все более и более сложные интерфейсы для доступа к этому самому контенту. Поколения систем управления контентом (CMS) сменяют друг друга с впечатляющей динамикой. Сегодняшние решения в сфере информационной архитектуры сайтов требуют от CMS принципиально новых возможностей, каковые были не доступны вчера. Завтрашние решения потребуют возможностей недоступных сегодня. Классическая эволюция технологий. Однако вопрос в том, как, разрабатывая новую CMS сохранить вложенные инвестиции и вложить требуемый потенциал для, хотя бы, ближайших поколений систем.

Если проанализировать тенденции развития CMS, то можно заметить, что одним из наиболее узких мест является жесткая привязанность функциональности сайта к его программному ядру. Это столь же очевидное ограничение, как некогда и контент, неотделенный от представления в технологии HTML. На смену HTML пришла технология XML/XSL и проблема была решена. Что же поможет решить проблемы неразделенной функциональности и программного ядра CMS? Может быть XML Sapiens?

XML Sapiens (http://xmlsapiens.org) - это спецификация программных интерфейсов для CMS-базированных сайтов, предложенная компанией Red Graphic Systems. Данная спецификация как раз и описывает концепцию сайта с разделенными функциональностью, контентом и его представлением. То есть, в CMS, отвечающих требованиям XML Sapiens интерфейсы сайта не привязаны к программному ядру. Для создания нового интерфейса на сайте нет необходимости переделывать CMS, а достаточно лишь добавить описание нового интерфейса в справочник XML Sapiens.

Как это все работает? В общем и целом, при обращении по URI к заданному документу сайта определяются переменные окружения XML Sapiens. В соответствии со значениями аргументов из среды окружения из хранилища данных (например, из базы данных) запрашиваются данные документа и шаблон их представления. И то и другое передается на обработку парсеру XML Sapiens. Парсер разбирает шаблон представления, анализирует найденные элементы XML Sapiens и обрабатывает в соответствии с их описаниями в справочнике XML Sapiens. Так, скажем элементы динамических контейнеров данных будут заменены кодом, сгенерированным на основании модели, представленной в описании этого объекта и аргументов среды окружения. Контейнеры запросов в случае процесса доставки данных (отображения сайта посетителю) будут заменены, соответствующими данными для данного документа, принятыми из хранилища данных. В случае процесса администрирования элементы этих контейнеров будут заменены формами запросов данных, соответствующего типа.

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

Добавлено: 18 Февраля 2015 07:36:04 Добавил: Андрей Ковальчук

XML Sapiens - магия оживления сайтов

Несколько слов о новой спецификации языка разметки для разработчиков CMS XML Sapiens

Случалось ли вам искать Open Source CMS для сборки своего сайта? Наверняка, вы столкнулись со сложностями при реализации своих функциональных моделей. Возможно, вам пришлось даже отказаться от некоторых идей по части интерфейса и ограничиться базовыми возможностями CMS. Скорее всего, у вас даже возникала мысль: "Хорошо было бы с помощью какого-нибудь макроязыка самостоятельно описывать интерфейсы сайтов, не ограничиваясь какими-либо штампами".

И действительно, существует ряд реализаций CMS, но нет общей концепции, описывающей модель CMS, где функциональность сайта не была бы привязана к программному ядру. Нет?! Все же есть. Это концепция представлена в спецификации XML Sapiens - XML-ориентированного языка, описания пользовательских интерфейсов, представленной компанией Red Graphic Systems.

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

Как это работает? Скажем, мы планируем разместить на всех страницах сайта типа, определенного шаблоном A вертикальное навигационное меню. Для этого нам следует создать описание этого контейнера динамических данных в XML Sapiens. В этом описании будет размещен указатель на приложение CMS, возвращающее массив со структурой сайта. Мы располагаем возможностью задания условий и стиля вывода в код контейнера содержания данного массива. Теперь осталось лишь разместить указатель на данный контейнер в шаблоне А. Таким же образом формируются самые различные навигационные формы, интерактивные формы, информационные каналы различных типов. Более того, шаблон и его контейнеры можно настроить для отображения веб-документов в виде XML, что будет корректно воспринято Flash, Java-applet, WAP, SVG.

Зачем ограничивать себя в проектировании? Используйте XML Sapiens и ваши проекты будут не похожи на чужие.

Добавлено: 17 Февраля 2015 20:47:20 Добавил: Андрей Ковальчук

Как узнать версию ejabberd

Xml

ejabberd - XMPP сервер, написанный на Erlang. Узнать версию установленную в системе можно так:
1. Если остались файлы дистрибутива, то версию можно узнать по имени пакета ejabberd-x.x.x
2. Найти в системе файл ejabberd.app и найти там строку вида: {vsn, "x.x.x"}
3. Если у вас нет доступа к системе, но нужно открыть в XML-консоль (например в QIP, Miranda) и послать серверу команду:

<iq to="jabber.host" type="get">
  <query xmlns="jabber:iq:version">
</query></iq>

Сервер он вам ответит приблизительно так:
<iq from="jabber.test" to="username@jabber.host/Miranda" type="result">
  <query xmlns="jabber:iq:version">
    <name>ejabberd</name>
    <version>2.1.10</version>
  <os>unix/linux 3.2.0</os>
  </query>
</iq>

Добавлено: 16 Сентября 2013 04:27:36 Добавил: Андрей Ковальчук

Преобразование XML + XSLT с помощью Sablotron

Xml

Альтернативное введение в использование XSL Transformations в PHP при помощи Sablotron.

Данный материал следует воспринимать как альтернативное введение в использование XSLT с Sablotron в PHP.

Термины XSL и XSLT близки друг к другу, и новичкам их можно считать синонимами. Подробности, в чём же различия, описаны в спецификации XSL Transformations W3C.

Все, кто интересовался возможностями XSLT, читал стандартный пример из мануала, либо примеры, приводимые в статьях, посвящённых XSLT, на разных сайтах. Работающий пример из этой же серии:

<?php

$xmlData = '<?xml version="1.0" encoding="Windows-1251"?>
<document>
<game>
    <title>Railroad Tycoon II Platinum</title>
    <genre>экономическая стратегия</genre>
    <designer>PopTop software</designer>
    <publisher>G.O.D. games</publisher>
    <year>2001</year>
</game>
<game>
    <title>Grand Prix 4</title>
    <genre>автосимулятор</genre>
    <designer>Geoff Crammond & Simergy</designer>
    <publisher>Infogrames Entertainment</publisher>
    <year>2002</year>
</game>
</document>';

$xslData = '<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template> 

<xsl:template match="document">
    <html><head>
    <title>Игры</title>
    </head>
    <body>
    <h1>Игры</h1>
    <table cellpadding="2" cellspacing="2" border="1">
    <tr>
        <td>Название</td>
        <td>жанр</td>
        <td>год</td>
        <td>разработчик</td>
        <td>издатель</td>
    </tr>
        <xsl:apply-templates select="game"/>
    </table>
    </body></html>
</xsl:template> 

<xsl:template match="game">
    <tr>
        <td><b><xsl:value-of select="title"/></b></td>
        <td><xsl:value-of select="genre"/></td>
        <td><xsl:value-of select="year"/></td>
        <td><xsl:value-of select="designer"/></td>
        <td><xsl:value-of select="publisher"/></td>
    </tr>
</xsl:template> 

</xsl:stylesheet>';

$xh = xslt_create();

    $arguments = array(
        '/_xml' => $xmlData,
        '/_xsl' => $xslData
    ); 

    $result = @xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
    

if ($result)
    print ($result);
else {
    print ("There was an error that occurred in the XSL transformation...\n");
    print ("\tError number: " . xslt_errno($xh) . "\n");
    print ("\tError string: " . xslt_error($xh) . "\n");
    exit;
}

?>

Подобных примеров в Сети полно. Все они хорошо показывают, что XSL-трансформация в php работает, но после их прочтения остаётся неясным, зачем XSL нужен, скорее даже наоборот — почему XSL не нужен.

"Действительно", — подумает читатель, — "если данные лежат в базе, зачем городить огород, формируя сперва XML, а затем ещё преобразовывать через XSL? С тем же успехом это сделает класс HTML-шаблона."

После этого разочарованный программист напрочь теряет интерес к XSL и вешает на технологию ярлык "ненужная заумь".

Вам, уважаемые читатели, повезло найти такой замечательный сайт, как "php в деталях". Здесь вы прочитаете о том, что XSL может не только преобразовывать XML в HTML, но и то, как можно при помощи XSL облегчить работу с php-скриптами.
Начало работы

Приведённый выше пример, хоть и слишком прост, хорошо иллюстрирует, каким образом делается XSL-преобразование в php.

Чтобы этот код работал, нужно установить XSLT-процессор Sablotron. На виндовой машине это делается так:
положить iconv(-1.3).dll, expat.dll и sablot.dll в C:\windows\System (все файлы есть в стандартном дистрибутиве php)
открыть C:\windows\php.ini и в нём найти параметр extension_dir. Если значение параметра — "." или нечто вроде "./", исправить на, скажем, "f:\usr\local\php\extension" (или адрес директории, в которой у вас лежат/будут лежать расширения php). Теперь это будет директория расширений php.
положить в директорию расширений файл php_xslt.dll (это для php версии 4.2.x), либо php_sablot.dll (для версии 4.0.x)
в php.ini раскомментируйте строчку extension=php_xslt.dll (4.2.x) или extension=php_sablot.dll (4.0.x)
Теория

Использование XSLT позволяет отделить от php-скриптов работу по форматированию и представлению данных. Это не только уменьшение объёма кода, но и вынос большого количества логических конструкций (if, else, switch), а следовательно, облегчение работы по написанию и отладке программ. Смею утверждать, что тот, кто не пробовал работать с XSLT, не представляет себе, насколько php-кодирование облегчится.

Впрочем, не надо обольщаться: если у вас было несколько конструкций if ... else в php-скрипте, они, скорее всего, появятся в том же количестве в XSL-файле.

Теперь к примерам.
Вывод списков

Все усложнения, происходящие от необходимости выводить список в удобочитаемом виде, переносятся на плечи XSL. Пример #2. Список статей на сайте с подсветкой статьи, которую читают сейчас, чередование цвета в строках и нумерация списка.

XML:
<current-date>2002-05-30</current-date>

<list-article date="2002-10-03">Ловля ошибок в PHP</list-article>
<list-article date="2002-10-02">Живой проект и мёртвый журнал</list-article>
<list-article date="2002-06-03">Работа с MySQL. Часть 7. Деревья</list-article>
<list-article date="2002-05-30">Ручная сортировка в веб-интерфейсе</list-article>
<list-article date="2002-05-29">Как поладить дизайнеру с программистом</list-article>
<list-article date="2002-05-27">Relax this is PHP</list-article>

XSLT:
...
<table>
<xsl:apply-templates select="list-article"/>
</table>
...

<xsl:template match="list-article">
    <tr>
    <xsl:if test="position() mod 2 = 1">
        <xsl:attribute name="bgcolor">#cccccc</xsl:attribute>
    </xsl:if>
    <td>
    <xsl:value-of select="position()">
    <a href="/{@date}.htm"><xsl:value-of select="."/></a>
    <xsl:if test="@date = ../current-date"> <</xsl:if>
    </td>
    </tr>
</xsl:template>

Произвольная разметка

Переводя на XML сайт с текстами (как этот), естественно хотеть сделать собственную разметку статей. Например, в контейнером important выделять очень важные места и иметь возможность выделять их не обязательно жирным шрифтом, но, может быть, цветом, CSS-стилем. Или писать цитаты как <quote>текст цитаты<quote> и иметь возможность менять стиль их оформления вместе с дизайном сайта.

Медленно продвигаясь от самого простого первого примера, многие натыкаются на эту проблему и не могут найти решения. Ведь если выделить абзац в тег <para> и делать для него шаблон, на первый взгляд, существуют три способа вывода содержимого:
тег xsl:value-of выводит текст, но удаляет все теги в абзаце
тег xsl:copy-of выводит копию всего содержимого (без возможности применять шаблоны к детям — внутренним тегам) и самого контейнера <para>...</para> (что не очень красиво в HTML).
наконец, xsl:apply-templates применит шаблоны к детям, но пропустит текст

Проблема кажется безвыходной, но решение есть. Я использую "магические" шаблоны, которые выводят и текст и теги в нём со всеми атрибутами и без изменений. Пример #3:

XML:
<text>
    <para>Данный пример использует <strong>магические шаблоны</strong> 
		для разбора произвольной разметки. Это позволяет избежать таких жалоб:
    </para>
    <quote>Люди, памажите сами мы не местные! Не могу вывести теги в тексте 
		при помощи value-of!
    </quote>
    <hr/>
    <strong>Запомните эти шаблоны раз и навсегда!</strong>
    <para>Тогда вы сможете обрабатывать <u>любой</u> <a href="http://www.txt.ru">текст</a>
	 Почти любой.
    </para>
</text>

XSLT:
<xsl:template match="text"><xsl:apply-templates/></xsl:template>

<xsl:template match="strong">
    <font color="#cc0000"><b><xsl:apply-templates/></b></font>
</xsl:template>

<!-- три магических шаблона -->
<!-- 1. общий -->
<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- 2. для текста -->
<xsl:template match="text()">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

<!-- 3. для тегов и аттрибутов -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

Первым делом XSLT-процессор при вызове инструкции apply-templates ищет шаблон для каждого элемента. Для элемента strong шаблон есть, и именно в соответствии с ним такие элементы будут обработаны. Для гиперссылки шаблона нет, поэтому она будет выведена, как есть. Можно добавить в XSL шаблон и для ссылки, который бы выводил рядом с каждой текстовой ссылкой картинку для открытия её в новом окне:
<xsl:template match="a[@href]">
	<xsl:copy-of select="."/> <a href="{@href}" 
		target="_blank"><img src="/window.gif" width="15" height="15" 
		alt="открыть в новом окне"/></a>
</xsl:template>

* в шаблоне использован параметр match="a[@href]" — этот шаблон будет применён только к тем тегам ссылок, в которых есть поле href и пропустит якоря (<a name="xxx"></a>).
Невалидный код и  

Кажущаяся необходимость писать валидный XML-код так же отпугивает многих неофитов XSLT. Хорошо, с завтрашнего дня будем писать статьи только валидно, благо дома можно проверить, нет ли в тексте XML-ошибки — mismatched tag или invalid token, — с этим как-нибудь справимся. Но ведь, по-хорошему, нужно и весь архив перевести в валидный код! И я так тоже думал, когда появилась возможность переделывать сайт на XML.

Решение проблемы довольно простое: не хочешь — не пиши валидно. Пиши, как привык, — без кавычек в атрибутах тегов, используй простой <br> и прочее. Достаточно заключить текст в контейнер <![CDATA[ ... ]]> (пример ниже).

Что касается  , то здесь дела такие: элемента nbsp в XML нет. Есть lt, gt, quot, но не nbsp (вполне логично — это ведь non-braking space, который относится к форматированию и придуман для HTML). Поэтому его нужно объявить в документе, либо использовать только внутри <![CDATA[...]]>.

Пример #4:

XML:
<text>
    <bad-markup><![CDATA[В этом <a href=http://phpclub.ru/detail>тексте</a> применена 
		невалидная разметка. <br> И ничего страшного.]]></bad-markup>
    <quote>Люди, памажите, сами мы не местные!</quote>
    <hr/>
    <strong>Запомните и эти шаблоны тоже!</strong>
</text>

XSLT:
<xsl:template match="text"><![CDATA[ >>> и в XSL можно делать то же самое! <<< ]]> 
<xsl:apply-templates/></xsl:template>

<xsl:template match="bad-markup">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

Очень удобно! Большие изменения в архив вносить не придётся. Можно начать писать валидно, а продолжать как попало. А можно комбинировать эти два подхода. Чтобы не писать в архивные файлы тег CDATA, я сделал простое преобразование при помощи регулярных выражений (важно так же помнить, что один тег CDATA не должен содержать в себе другой).
$doc = preg_replace("~<(p|h[1-3]|pre)>(.*?)</\\1>~", "<\\1>\\2</\\1>", $doc);

Циклы

Допустим, нам нужно сделать форму для редактирования статьи, в том числе её даты. Для удобства пользования надо сделать три раскрывающихся списка (далее — "крутилки") — дата от 1 до 31, месяц, год. Первое решение, которое приходит в голову — сделать HTML-код крутилок в php, вставить в XML в контейнере CDATA, а затем вывести в XSL с параметром disable-output-escaping="yes".

На самом деле, XSLT может и это. Достаточно вставить в данные XML число, номер месяца и год. Крутилки можно нарисовать сразу в XSLT.

Напишем шаблон, не предназначенный ни для какого элемента документа. Он будет вызываться командой xsl:call-template и получать два параметра: значение счётчика и максимум. Сперва он будет выводить нужные нам данные со значением счётчика, затем вызывать самого себя с параметрами максимум и счётчик, увеличенный на 1. Пример #5:

XML:
<month-name>Январь</month-name>
<month-name>Февраль</month-name>
<month-name>Март</month-name>
<month-name>Апрель</month-name>
<month-name>Май</month-name>
<month-name>Июнь</month-name>
<month-name>Июль</month-name>
<month-name>Август</month-name>
<month-name>Сентябрь</month-name>
<month-name>Октябрь</month-name>
<month-name>Ноябрь</month-name>
<month-name>Декабрь</month-name>

<article>
    ...
    <day>7</day>
    <month>10</month>
    <year>2002</year>
</article>

XSLT:
<xsl:template match="article">
    ...
    <select name="d">
    <xsl:call-template name="day">
        <xsl:with-param name="count">1</xsl:with-param>
    </xsl:call-template>
    </select>
    <select name="m">
    <xsl:call-template name="month">
        <xsl:with-param name="count">1</xsl:with-param>
    </xsl:call-template>
    </select>
    ...
</xsl:template>

<xsl:template name="day">
    <xsl:param name="count"/>
    <option value="{$count}">
        <xsl:if test="$count = //artcile/day">
            <xsl:attribute name="selected">yes</xsl:attribute>
        <xsl:if>
        <xsl:value-of select="$count"/>
    </option>
    <xsl:if test="$count < 31">
        <xsl:call-template name="day">
            <xsl:with-param name="count">
                <xsl:value-of select="$count + 1"/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<xsl:template name="month">
    <xsl:param name="count"/>
    <option value="{$count}">
        <xsl:if test="$count = //artcile/month">
            <xsl:attribute name="selected">yes</xsl:attribute>
        <xsl:if>
        <xsl:value-of select="//month-name[position() = $count]"/>
    </option>
    <xsl:if test="$count < 12">
        <xsl:call-template name="month">
            <xsl:with-param name="count">
                <xsl:value-of select="$count + 1"/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

Оставляю вам в качестве домашнего задания шаблон для вывода крутилки с годом.
Резюме

Как видите, многое из того, что пишется в php-скриптах, даже при использовании класса шаблона, можно успешно спустить в XSLT. Но стОит ли заниматься этим?

Ответ зависит от условий работы в вашем проекте. Второй момент — технологичность работы.

Допустим, я захочу сделать на этом сайте меню быстрой навигации — раскрывающийся список со всеми статьями, — чтобы пользователь мог выбрать статью из списка и сразу перейти к ней. Ещё я захочу оставить список последних материалов (сейчас он находится справа вверху).

Если делать это при помощи класса шаблона типа FastTemplate, нужно два специальных блока и дополнительный код в php, который бы объявлял в шаблоне блок для списка всех статей и отдельно блок для списка 10 последних. Аналогичные действия необходимы в таком случае и при работе без класса шаблона. При работе с XML достаточно всего лишь одного набора данных "Дата => Статья", из которого в XSL-документе строятся и листбокс быстрого перехода, и список последних статей.

А если вдруг понадобится неважно для чего сделать другое оформление сайта (например, версия для WAP, или просто редизайн), в котором будет решено отказаться от списка 10 последних материалов. В случае первых двух технологий — класс шаблона и смешанный код — нужно будет убрать часть php кода, в случае XSLT изменения коснутся только XSL-файла. Такой процесс более технологичен, поскольку невозможно сделать новые ошибки в php-скриптах (а теперь представьте обратный случай — списка 10 последних статей не было, но его решили добавить!).

Итак, выбор остаётся за вами, а я как мог привёл сильные стороны технологии и доводы в пользу использования XML в проектах./p>

Добавлено: 21 Августа 2013 12:37:19 Добавил: Андрей Ковальчук

Обработка запросов к БД при помощи PEAR::XML

Xml

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

Уважаемые читатели, обратите внимание: это не продолжение серии "Всеобъемлющая история шаблонов". Это отдельная статья. Следующая статья про шаблоны появится чуть позже.

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

Скажем, как после добавления в проект поддержки XSLT формировать в XML данные, получаемые из базы? Оказывается, что делать это при помощи класса шаблона ничуть не проще, чем составлять документ прямо в скрипте:

<?php

$result = mysql_query("SELECT DATE_FORMAT(news_date, '%e.%c.%Y') AS date_typed, 
	DATE_FORMAT(news_date, '%d.%m.%Y') AS date_url, title, announce FROM news 
	ORDER BY news_date DESC LIMIT 10");

if(!mysql_error()) {
    $xml .= "\r\n";

    while($row = mysql_fetch_assoc($result))
        $xml .= "
            
                {$row[date_url]}
                {$row[date_typed]}
                
                {$row[announce]}
            \r\n";

    $xml .= "\r\n";
    }

?>

Согласитесь, с классом шаблона мы получили бы примерно тот же объём кода (а ещё файлы .tpl на диске).

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

Размышление: Если вы хотите решить какую-то проблему на php, поищите в архивах скриптов — скорее всего для вашей задачи найдётся уже готовое решение. Чужой скрипт, конечно, не будет идеальным решением (потому что наилучшим приближением к идеалу будет решение, написанное специально для задачи), но, скорее всего, будет пригодно к использованию. Вы можете быть противником применения чужого кода в своих проектах, либо не быть уверены в том, что найденный код будет работать как надо (разработчики PEAR, как известно, предупреждают, что весь их проект — вечная бета). Однако посмотреть, как чужой скрипт работает, будет полезно, чтобы написать свой собственный. Заглянув в чужой код, и профессиональный разработчик, и разработчик среднего уровня смогут лучше понять подходы к решению задачи и написать своё собственное, если это понадобится.

В конце сентября, прочитав присланный мне материал про PEAR::DB, я решил поискать на PEAR и класс для автоматического преобразования результатов запроса к базе данных в XML. В разделе XML я нашёл класс, созданный как раз для моей проблемы — XML_sql2xml.

Класс использует для доступа к базам данных другой класс библиотеки PEAR — PEAR::DB. Для операций с XML-документом использует функции DOM XML (это требует установки соответствующего модуля php). Преобразует результат запроса в XML-дерево и возвращает его либо как текст XML-документа, либо как DOM-объект.
Установка PEAR

Тема не была серьёзно описана в материале о PEAR::DB, поэтому будем разбираться.

Библиотеки PEAR раньше распространялись с дистрибутивом php, но больше этого не будет — видимо, чтобы устаревшие версии классов не распространялись с дистрибутивами php, их оттуда убрали. Теперь архивы с классами нужно брать с сервера pear.php.net.

Проблемы с установкой PEAR вызваны тем, что во всех его файлах указываются пути относительно корня директории pear, то есть для вызова PEAR::DB делается команда
include_once("DB/${type}.php");

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

Как вы могли увидеть из строки кода выше, файлы подключаются относительно include_path (который по умолчанию является директорией, из которой работает скрипт, либо директорией, в которую установлен PEAR). Если в проекте include_path устанавливается, вам повезло. Можно положить вызываемые скрипты в эту директорию и наслаждаться жизнью.

Если include_path не устанавливается, его можно установить в .htaccess такой строкой:
php_value include_path my_dir/pear

Вместо my_dir поставьте адрес нужной директории. Можно поменять include_path "на лету" в скрипте:
<?php

ini_set("include_path", "my_dir/pear");

include("DB.php");

$dsn = "mysql://user:pass@host/db_name";
$db = DB::connect($dsn, true);

if (DB::isError($db)) {
	die ($db->getMessage());
}

$db->setFetchMode(DB_FETCHMODE_ASSOC);

ini_restore("include_path");

?>

После подключения файлов PEAR лучше вернуть include_path на место командой ini_restore. В комментариях к предыдущей статье меня спросили, зачем нужен ini_restore. Во-первых, у меня все скрипты работают из корня сайта, а подключаемые файлы находятся в разных директориях (например, содержимое страницы сайта может быть статичным XML-файлом, а может быть скриптом, который будет вызываться основными скриптами). Пути к подключаемым файлам я указываю тоже от корня. PEAR на сайте появилась не сразу, поэтому ini_restore нужен, чтобы подключить библиотеку, и это не мешало остальным скриптам работать по-старому. Во-вторых, в php.ini или в .htaccess может указываться путь к директории с подключаемыми файлами, а PEAR, по-моему, лучше положить в отдельную директорию, чтобы библиотека не захламляла рабочую. Впрочем, каждый делает как ему удобнее.

Однако хостинг-провайдер может держать php в безопасном режиме, который запрещает менять include_path. В таком случае, конечно, можно попробовать положить файлы PEAR в корень сайта или вручную править все include в файлах — больше ничем разработчики помочь не могут. В новостях PEAR пишут, что Стиг Баккен сообщил о плане добавить новую директиву '{get,set,restore}_include_path()', чтобы можно было менять iclude_path даже в безопасном режиме.
DOM XML в PHP

DOM (Document Object Model) — модель работы с документом, в которой документ содержит объекты, которыми можно манипулировать. Модель DOM является стандартом W3C. Функции DOM XML в php — это одна из реализаций данной модели.

При работе с DOM вы оперируете с переменными, являющимися ссылками на объекты нескольких классов. Список классов и их функций можно узнать в соответствующем разделе руководства по php.

Стандартный модуль php_domxml не поддерживает кириллицу. При работе с ним вам придётся конвертировать данные на входе в UTF-8, а на выходе — обрабатывать сущности вроде &x440;. Чтобы установить DOM XML с поддержкой кириллицы на рабочей машине под Win32, рекомендую скачать мой архив, в котором находится модуль php_domxml скомпилированный с поддержкой кириллицы и необходимые для его работы библиотеки iconv, libxml, libxslt и libexslt. Положите файл php_domxml.dll в extenstion_dir, а остальные библиотеки — в директорию c:\windows\system.

Несколько примеров по работе с DOM XML:
<?php

// Создание XML-документа
$xmldoc = domxml_new_doc("1.0");

// В условиях документа создаётся элемент под названием my_root. 
$my_element = $xmldoc->create_element("my_root");

// Затем этот элемент присоединяется к документу как узел-потомок. До этой операции в 
//документе нет корневого узла!
$my_root = $xmldoc->append_child($my_element);

// Создаётся ещё один элемент — текст и добавляется как потомок к корневому узлу.
$my_element = $xmldoc->create_text_node(iconv("windows-1251", "UTF-8", "Это содержимое 
//корневого узла XML-документа."));
$my_root->append_child($my_element);

// XML-документ преобразуется в текстовый вид и выводится
print($xmldoc->dump_mem());

?>

К сожалению, в приведённом примере возникнут проблемы с русскими символами — на выходе они опять превращаются в &xXXX;. Чтобы модуль domxml понял, что идёт работа с русской кодировкой, нужно на входе дать XML-документ с параметром encoding="windows-1251" вот так:
<?php

// Создание объекта документа из текстовой строки
$xmldoc = domxml_open_mem('<?xml version="1.0" encoding="windows-1251"?>');

// Cсылку на корневой узел документа записываем в переменную $my_root (название 
//переменной значения не имеет).
$my_root = $xmldoc->document_element();

// Создаём текстовый узел.
$my_element = $xmldoc->create_text_node(iconv("windows-1251", "UTF-8", 
	"Это содержимое корневого узла XML-документа."));

// Присоединяем текстовый узел к корневому.
$my_root->append_child($my_element);

print($xmldoc->dump_mem());

?>

Следующий пример показывает, как можно удалять элементы:
<?php

$xmldoc = domxml_open_mem('<?xml version="1.0" encoding="windows-1251"?>
Нечто
');

$my_root = $xmldoc->document_element();

// В массив $children записываются все потомки узла my_root.
$children = $my_root->child_nodes();

// Уничтожается первый потомок (узел something)
$children[0]->unlink_node();

// Создаётся новый узел под названием new и записывается в переменную $new
$new = $my_root->append_child($xmldoc->create_element("new"));

// К этому узлу добавляется потомок — текстовый узел
$new->append_child($xmldoc->create_text_node(iconv("windows-1251", "UTF-8", 
	"Это содержимое нового узла XML-документа.")));

print($xmldoc->dump_mem());

?>

в результате получится такой XML-документ:
<?xml version="1.0" encoding="windows-1251"?>
<my_root><new>Это содержимое нового узла XML-документа.</new></my_root>

Кстати, если изменить исходный XML-документ на такой:
<?php

$xmldoc = domxml_open_mem('<?xml version="1.0" encoding="windows-1251"?>

    Нечто

');

?>

Результат будет иным:
<?xml version="1.0" encoding="windows-1251"?>
<my_root><something>Нечто</something>
<new>Это содержимое нового узла XML-документа.</new></my_root>

Предоставляю вам возможность догадаться, почему это произошло.

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

На ум приходит следующая схема преемника классов шаблонов: вызывается скрипт, который открывает стандартный XML-файл и включает буферизацию данных. Все скрипты тупо выдают XML-данные в print. Вызывается второй скрипт, который останавливает буферизацию, берёт данные из буфера, дописывает к ним в начале "<?xml version="1.0" encoding="windows-1251"?><root>" и "</root>" в конце, затем преобразует в объект DOM, открывает корневой элемент и берёт всех массив потомков. Полученные узлы вставляет в основной XML-документ (который тоже открыт как объект), результат преобразует через XSLT и выдаёт пользователю.

На этом заканчиваем краткое описание DOM XML и переходим к классу sql2xml.
Класс SQL2XML

Вся функциональность, которая нужна для преобразования результатов SQL-запросов в XML, есть в этом классе. Для соединения с базой данных класс использует либо существующее соединение класса PEAR::DB, либо своё собственное (точнее, он создаёт в себе объект класса DB). Из результата запроса строится XML-дерево. Пример из руководства по классу:
mysql> select * from bands;
+----+--------------+------------+-------------+-------------+
| id | name         | birth_year | birth_place | genre       |
+----+--------------+------------+-------------+-------------+
|  1 | The Blabbers |       1998 | London      | Rock'n'Roll |
|  2 | Only Stupids |       1997 | New York    | Hip Hop     |
+----+--------------+------------+-------------+-------------+

mysql> select * from albums;
+----+---------+------------------+------+-----------------+
| id | bandsID | title            | year | comment         |
+----+---------+------------------+------+-----------------+
|  1 |       1 | BlaBla           | 1998 | Their first one |
|  2 |       1 | More Talks       | 2000 | The second one  |
|  3 |       2 | All your base... | 1999 | The Classic     |
+----+---------+------------------+------+-----------------+

Это набор данных. А теперь вызов класса и результаты работы. php-код:
<?php
include_once("XML/sql2xml.php");
$sql2xmlclass = new xml_sql2xml("mysql://username:password@localhost/xmltest");
$xmlstring = $sql2xmlclass->getxml("select * from bands");
?>

XML-документ:
<?xml version="1.0"?>
    <root>
        <result>
            <row>
                <id>1</id>
                <name>The Blabbers</name>
                <birth_year>1998</birth_year>
                <birth_place>London</birth_place>
                <genre>Rock'n'Roll</genre>
            </row>
            <row>
                <id>2</id>
                <name>Only Stupids</name>
                <birth_year>1997</birth_year>
                <birth_place>New York</birth_place>
                <genre>Hip Hop</genre>
            </row>
        </result>
    </root>

Результат выводится и в текстовом виде, и как DOM-объект (что весьма удобно при генерации документов через DOMXML). Так же можно из всего XML-дерева выдернуть одно значение при помощи выражения XPath. Ещё очень хорошая особенность: раз уж строятся деревья, и всё оперируется в XML, почему бы запросы с объединением "один-ко-многим" не делать в виде вложенных друг в друга узлов <row>. php-код:
<?php
include_once("XML/sql2xml.php");
$sql2xml = new xml_sql2xml("mysql://username:password@localhost/xmltest");
$xmlstring = $sql2xml->getxml("select * from bands left join albums on bands.id = bandsID");
?>

XML-документ:
<?xml version="1.0"?>
    <root>
        <result>
            <row>
                <id>1</id>
                <name>The Blabbers</name>
                <birth_year>1998</birth_year>
                <birth_place>London</birth_place>
                <genre>Rock'n'Roll</genre>
                <row>
                    <id>1</id>
                    <bandsID>1</bandsID>
                    <title>BlaBla</title>
                    <year>1998</year>
                    <comment>Their first one</comment>
                </row>
                <row>
                    <id>2</id>
                    <bandsID>1</bandsID>
                    <title>More Talks</title>
                    <year>2000</year>
                    <comment>The second one</comment>
                </row>
            </row>
            <row>
                <id>2</id>
                <name>Only Stupids</name>
                <birth_year>1997</birth_year>
                <birth_place>New York</birth_place>
                <genre>Hip Hop</genre>
                <row>
                    <id>3</id>
                    <bandsID>2</bandsID>
                    <title>All your base...</title>
                    <year>1999</year>
                    <comment>The Classic</comment>
                </row>
            </row>
        </result>
    </root>

Впрочем, если вы хотите получить обычный результат запроса, это свойство можно отключить. Если имена узлов для результата и для ряда вас не устраивают, можно их поменять. Если вас не устраивает формат (всё в текстовых узлах, а не, например, в атрибутах), можно преобразовать полученный DOM-объект в нужный вам. На мой взгляд, этого не понадобится, поскольку если на сайте до этого уже использовался XSLT, исправить XSL-файл не представляет особой сложности.

Итак, класс вполне пригоден к использованию. Если он вас чем-то не устраивает, можно, глядя на существующий, написать свой собственный. Исправлять данный класс вполне можно, поскольку манипуляции с DOM-объектами не намного сложнее внутреннего устройства классов шаблонов. Я для себя исправил ошибки call-time pass-by-reference в классе версии 0.3 (версия 0.3.1 — это как раз мой багфикс) а так же заменил старые не поддерживаемые функции и конструкции DOM XML на новые. Сейчас работаю над тем, как справиться с проблемой кодировки документа (объект документа там создаётся функцией domxml_new_doc, а для создания из текстовой строки требуется основательно переделать существующую в классе sql2xml функцию).

Добавлено: 20 Августа 2013 08:47:29 Добавил: Андрей Ковальчук

XML в 10 тезисах

XML, XLink, Namespace, DTD, Schema, CSS, XHTML ... Если вы впервые столкнулись с XML, трудно даже понять, с чего начать. Этот короткий обзор представляет собой попытку охватить основные идеи XML, чтобы новичок мог увидеть концепцию в целом, не путаясь в деталях. Если же вы кому-то представляете XML, почему бы не начать с этих 10 тезисов?

1. XML — это способ записи структурированных данных

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

2. XML немного похож на HTML

Также как и в HTML, в XML используются тэги (слова, заключенные в '<' и '>') и атрибуты (вида имя="значение"). Но если в HTML фиксируется смысловое значение каждого тэга и атрибута и часто то, как текст между ними будет выглядеть в браузере, в XML тэги используются только для логической разметки данных, и их интерпретация оставляется на усмотрение обрабатывающей программы. Другими словами, если вы встречаете "

" в XML-файле, то не стоит думать, что это параграф. В зависимости от контекста, это может быть цена (price), параметр (parameter), человек (person)... (вообще, кто сказал, что это должно быть слово, начинающееся с "p"?)

3. XML — это текст, но он не предназначен для чтения

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

4. XML умышленно многословен

Так как XML — текстовый формат и использует тэги для разметки данных, XML-файлы почти всегда больше по размеру, чем аналогичные в двоичном формате. Это было сознательным решением разработчиков XML. Преимущества текстового формата очевидны (см. пункт 3), и недостатки обычно могут быть компенсированы на ином уровне. Дисковое пространство уже не столь дорого, как было раньше, а программы типа zip и gzip могут сжимать текстовые файлы очень хорошо и очень быстро. К тому же коммуникационные протоколы, такие как модемные протоколы и HTTP/1.1 (основной протокол Сети) могут сжимать данные "на лету", сохраняя, таким образом, пропускную способность так же эффективно, как и в случае с двоичным форматом.

5. XML — это семейство технологий

В спецификации XML 1.0 определяется, что такое "тэги" и "атрибуты". Но за XML 1.0 следует "семейство XML" — все более растущее множество модулей, предоставляющих полезные сервисы для решения важных и часто возникающих задач. Например, в спецификации XLink описывается стандартный способ добавления гиперссылок в XML-документ. XPointer — синтаксис для адресации частей XML-документа. XPointer немного похож на URL, но вместо указания на документы в Сети, обращается к фрагментам данных внутри XML-файла. Каскадные таблицы стилей CSS могут применяться к XML-документам так же, как и к HTML. XSL — более продвинутый язык стилевых таблиц. Он, в свою очередь, базируется на XSLT языке трансформаций, использующемся для переформирования, добавления и удаления тэгов и атрибутов. DOM представляет собой стандартный интерфейс для манипулирования файлами XML (и HTML) из различных языков программирования. Языки XML Schema 1 и 2 призваны помочь разработчикам четко определять их собственные форматы, основанные на XML. Кроме перечисленных готово к использованию или находится в разработке еще множество модулей и средств. Следите за обновлениями на странице технических отчетов W3C.

6. XML нов, но не совсем

Разработка XML началась в 1996 году, и с февраля 1998 года является стандартом W3C, что может заставить вас думать об этой технологии как о довольно не зрелой. Но, в действительности, она не так уж и нова. До XML был SGML, разработанный в начале 80-х и принятый в качестве стандарта ISO в 1986 году, который широко использовался в проектах, связанных с большим количеством документации. И, конечно, HTML, разработка которого началась в 1990 году. Создатели XML просто взяли лучшее из SGML, и, основываясь на опыте HTML, создали нечто новое, что по своей мощи не уступает SGML, но гораздо аккуратнее и проще для использования. Иногда эволюцию, однако, трудно отличить от революции... И надо заметить, что пока SGML в основном используется для технической документации и в значительно меньшей степени для других видов данных, с XML все с точностью до наоборот.

7. XML ведет HTML к XHTML

Существует важное XML-приложение, являющееся форматом документов: W3C XHTML, преемник HTML. Большинство элементов XHTML такие же, как и в HTML. Синтаксис был немного изменен для соответствия правилам XML. Документ, являющийся "XML-based", наследует синтаксис XML и ограничивает его определенным способом (например, в XHTML разрешается "

", но не ""); этот синтаксис также наделяется смысловым значением (XHTML определяет, что "

" обозначает "параграф" (paragraph), а не "цена" (price), "персона" (person) или что-либо еще).

8. XML - модульная технология

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

", обозначающий "paragraph" в одном формате, от "person" в другом?). Для устранения возможной путаницы при одновременном использовании разных форматов XML предоставляет механизм пространств имен. XSL и RDF являются хорошими примерами основанных на XML форматов, использующих пространства имен. XML Schema разработан для отражения подобной поддержки модульности на уровне определения структур XML-документа, облегчая процесс построения новой схемы на основе существующих.

9. XML — основа для RDF и Семантической Сети

W3C Resource Description Framework (RDF) является текстовым форматом, основанным на XML, который поддерживает описание ресурсов и метаданных приложений, такие как списки музыкальных композиций, фотогалереи и библиографий. Например, RDF может позволить вам идентифицировать людей в сетевом фотоальбоме, используя информацию из персонального списка контактов; затем ваша почтовая программа может автоматически начинать письма этим людям с утверждения, что их фотографии находятся в Сети. Подобно тому, как HTML объединил документы, меню и формы, дав начало сегодняшней Сети, RDF объединяет приложения и агенты в Семантическую Сеть. Точно так же, как люди нуждаются в соглашениях о смысле слов, которые они используют между собой в общении, так и компьютеры для эффективного взаимодействия нуждаются в механизме согласования значений терминов. Формальные описания терминов некоторой области (например, похода по магазинам или производства) называются онтологиями и являются необходимой частью Семантической Сети. RDF, онтологии, и представление значений так, чтобы компьютеры могли помогать людям в их работе — это все темы деятельности Semantic Web Activity.

10. Технология XML свободна от лицензирования, платформо-независима и хорошо поддерживаема

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

Добавлено: 15 Августа 2013 09:38:45 Добавил: Андрей Ковальчук

Понимание XML

Xml

Из этой статьи вы узнаете, как Расширяемый язык разметки (Extensible Markup Language - XML) облегчает универсальный доступ к данным. XML — основанный на Unicode метаязык: язык для описания языков разметки. Он не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. XML обеспечивает доступ к огромному количеству технологий по манипулированию, структурированию, трансформированию и запрашиванию данных.

Введение

Расширяемый язык разметки (XML) изначально был задуман как язык для описания новых форматов документов World Wide Web. XML происходит от Стандартного обобщенного языка разметки (Standard Generalized Markup Language - SGML) и может считаться метаязыком: языком для определения языков разметки. SGML и XML — это ориентированные на текст форматы, которые обеспечивают механизмы описания структур документов с помощью тэгов разметки (слов, взятых в угловые скобки '<' и '>'). Web-разработчики могут заметить некоторую схожесть между HTML и XML, обусловленную тем фактом, что они оба происходят от SGML.

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

XML является предпочтительным для существовавших ранее форматов данных, потому что XML может запросто представить и табличные данные (такие как реляционные данные из базы данных или больших таблиц), и псевдоструктурированные данные (такие как Web-страницы или деловые документы). Популярные ранние форматы, такие как файлы с разделяемыми запятой значениями (CSV), или подходят для табличных данных и плохо описывают псевдоструктурированные данные, или, как RTF, слишком специализированы для псевдоструктурированных текстовых документов. Это привело к широкому распространению XML как языка для обмена информацией.

XML везде

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

Расширяемость XML проявляется многими способами. Прежде всего, в отличие от HTML, у него нет фиксированного словаря. С XML каждый может определить специальные словари для конкретных приложений или различных отраслей промышленности. Во-вторых, приложения, обрабатывающие или использующие форматы XML, более устойчивы к изменениям в структуре предлагаемого им XML, чем приложения, которые используют другие форматы. Например, приложение, которое зависит от обработки элемента с атрибутом customer-id, обычно не должно прерываться, если другой атрибут, такой как last-purchase-date, был добавлен в элемент . Такая гибкость несвойственна другим форматам данных и является существенным преимуществом использования XML.

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

Преимущества представления данных в виде XML были признаны многими и привели к распространению XML-источников данных. Деловые документы, базы данных и межделовое общение — все это примеры информационных источников, которые переходят или перешли к использованию XML как формата представления. Такие продукты Microsoft как Microsoft Office®, Microsoft SQL Server™ и Microsoft .NET Framework дают возможность конечным пользователям и разработчикам создавать и использовать документы, сетевые сообщения и другие данные в виде XML.

Синтаксис XML 1.0

Как было упомянуто ранее, рекомендация W3C XML 1.0 описывает текстовый формат для описания структурированных и псевдоструктурированных данных, используя синтаксис, подобный HTML.

Сравнение XML и HTML

И HTML, и XML документы состоят из элементов, каждый из которых включает «начальный тэг» (), «конечный тэг» () и информацию, заключенную между этими двумя тэгами (которая называется содержимым элемента). Элементы могут быть аннотированы атрибутами, содержащими метаданные об элементе и его содержимом.

Однако между HTML и XML есть существенные отличия. XML чувствителен к регистру, в то время как HTML — нет. Это значит, что в XML начальные тэги

и
различны, тогда как в HTML — это одно и то же. Другое различие между HTML и XML в том, что XML представляет концепцию правильного построения. Правила построения XML устраняют некоторую неопределенность, присущую обработке таких языков разметки как HTML, вводя такие постулаты, как то, что все значения атрибутов должны быть заключены в кавычки, и что у всех элементов должны быть или начальный и конечный тэги, или явное указание того, что это пустые элементы. Краткое описание правил построения дается в XML FAQ в разделе D.2.

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

Анатомия XML-документа

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

Из этой статьи вы узнаете, как Расширяемый язык разметки (Extensible Markup Language - XML) облегчает универсальный доступ к данным. XML — основанный на Unicode метаязык: язык для описания языков разметки. Он не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. XML обеспечивает доступ к огромному количеству технологий по манипулированию, структурированию, трансформированию и запрашиванию данных.

Введение

Расширяемый язык разметки (XML) изначально был задуман как язык для описания новых форматов документов World Wide Web. XML происходит от Стандартного обобщенного языка разметки (Standard Generalized Markup Language - SGML) и может считаться метаязыком: языком для определения языков разметки. SGML и XML — это ориентированные на текст форматы, которые обеспечивают механизмы описания структур документов с помощью тэгов разметки (слов, взятых в угловые скобки '<' и '>'). Web-разработчики могут заметить некоторую схожесть между HTML и XML, обусловленную тем фактом, что они оба происходят от SGML.

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

XML является предпочтительным для существовавших ранее форматов данных, потому что XML может запросто представить и табличные данные (такие как реляционные данные из базы данных или больших таблиц), и псевдоструктурированные данные (такие как Web-страницы или деловые документы). Популярные ранние форматы, такие как файлы с разделяемыми запятой значениями (CSV), или подходят для табличных данных и плохо описывают псевдоструктурированные данные, или, как RTF, слишком специализированы для псевдоструктурированных текстовых документов. Это привело к широкому распространению XML как языка для обмена информацией.

XML везде

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

Расширяемость XML проявляется многими способами. Прежде всего, в отличие от HTML, у него нет фиксированного словаря. С XML каждый может определить специальные словари для конкретных приложений или различных отраслей промышленности. Во-вторых, приложения, обрабатывающие или использующие форматы XML, более устойчивы к изменениям в структуре предлагаемого им XML, чем приложения, которые используют другие форматы. Например, приложение, которое зависит от обработки элемента с атрибутом customer-id, обычно не должно прерываться, если другой атрибут, такой как last-purchase-date, был добавлен в элемент . Такая гибкость несвойственна другим форматам данных и является существенным преимуществом использования XML.

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

Преимущества представления данных в виде XML были признаны многими и привели к распространению XML-источников данных. Деловые документы, базы данных и межделовое общение — все это примеры информационных источников, которые переходят или перешли к использованию XML как формата представления. Такие продукты Microsoft как Microsoft Office®, Microsoft SQL Server™ и Microsoft .NET Framework дают возможность конечным пользователям и разработчикам создавать и использовать документы, сетевые сообщения и другие данные в виде XML.

Синтаксис XML 1.0

Как было упомянуто ранее, рекомендация W3C XML 1.0 описывает текстовый формат для описания структурированных и псевдоструктурированных данных, используя синтаксис, подобный HTML.

Сравнение XML и HTML

И HTML, и XML документы состоят из элементов, каждый из которых включает «начальный тэг» (), «конечный тэг» () и информацию, заключенную между этими двумя тэгами (которая называется содержимым элемента). Элементы могут быть аннотированы атрибутами, содержащими метаданные об элементе и его содержимом.

Однако между HTML и XML есть существенные отличия. XML чувствителен к регистру, в то время как HTML — нет. Это значит, что в XML начальные тэги
и
различны, тогда как в HTML — это одно и то же. Другое различие между HTML и XML в том, что XML представляет концепцию правильного построения. Правила построения XML устраняют некоторую неопределенность, присущую обработке таких языков разметки как HTML, вводя такие постулаты, как то, что все значения атрибутов должны быть заключены в кавычки, и что у всех элементов должны быть или начальный и конечный тэги, или явное указание того, что это пустые элементы. Краткое описание правил построения дается в XML FAQ в разделе D.2.

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

Анатомия XML-документа

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

<?xml version="1.0" encoding="iso-8859-1" ?>
<?xml-stylesheet href="orders.xsl"?>

<order id="ord123456">
 <customer id="cust0921">
 <first-name>Dare</first-name>
 <last-name>Obasanjo</last-name>
 <address>
 <street>One Microsoft Way</street>
 <city>Redmond</city>
 <state>WA</state>
 <zip>98052</zip>
 </address>
 </customer>
 <items>
 <compact-disc>
 <price>16.95</price>
 <artist>Nelly</artist>
 <title>Nellyville</title>
 </compact-disc>
 <compact-disc>
 <price>17.55</price>
 <artist>Baby D</artist>
 <title>Lil Chopper Toy</title>
 </compact-disc>
 </items>

 <!-- Доставка должна быть произведена в любом случае -->
 <special-instructions xmlns:html="http://www.w3.org/1999/xhtml/">
 <html:p>Если заказчика нет по указанному адресу, тогда попытайтесь
 оставить пакет в одном из следующих мест, список которых приведен в 
 порядке приоритетности доставки
 <html:ol>
 <html:li>Соседняя дверь</html:li>
 <html:li>У консьержа</html:li>
 <html:li>На пороге</html:li>
 </html:ol>
 <html:b>Примечание</html:b> Не забудьте оставить записку с точным
 указанием, где находится пакет.
 </html:p>
 </special-instructions>
</order>


Документ начинается с необязательного описания XML, в котором указывается, какая версия XML и кодирование символом используются. Далее следует инструкция обработки xml-stylesheet, которая используется для связывания таблицы стилей, содержащей инструкции по форматированию, с XML-документом. Таблица стилей используется для формирования привлекательного внешнего вида документа в пользовательских приложениях, таких как Web-браузеры. Инструкции обработки обычно используются для введения информации о приложении в XML-документ. Например, большинство приложений, обрабатывающих содержимое приведенного выше документа, вероятно, проигнорируют инструкцию обработки xml-stylesheet. С другой стороны, приложения, используемые для отображения XML-документа, такие как Web-браузер, могли бы использовать информацию инструкции обработки для того, чтобы определить, где располагается таблица стилей, содержащая специальные инструкции для отображения документа.

Unicode + угловые скобки = возможность взаимодействовать

Сочетание тех фактов, что синтаксис XML 1.0 — текстовый и слишком простой для синтаксического разбора, привело к использованию XML как нового формата обмена данными в случаях, когда требуется возможность межплатформенного взаимодействия. Широкая доступность синтаксических анализаторов XML для большинства популярных операционных систем упрощает для неравноправных сторон на разных платформах стандартизацию XML как формата преобразования в случае необходимости совместного использования информации.

Infoset и семейство XML-технологий

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

Информационное множество (Infoset) XML

Рекомендация информационного множества W3C XML (W3C XML Information Set recommendation) описывает абстрактное представление XML-документа. XML Infoset, главным образом, изначально выступает в роли набора определений, используемых XML-технологиями для формального описания того, с какими частями XML-документа они работают. В терминах XML Infoset описаны несколько W3C XML-технологий, включая SOAP 1.2, XML Schema и XQuery.

XML Infoset — древовидное иерархическое представление XML-документа.

Информационное множество XML-документа состоит из ряда единиц информации, которые являются абстрактным представлением компонентов XML-документа. Существуют единицы информации, представляющие документ, его элементы, атрибуты, инструкции обработки, комментарии, символы, нотации, пространства имен, неразбираемые синтаксическим анализатором сущности, неразвернутые ссылки на сущности и объявление типа документа. XML Infoset — официальная попытка определить то, что должно считаться важной информацией в XML-документе. Например, Infoset не делает различий между двумя формами пустого элемента. Таким образом, следующее

<test></test>
 <test/>


согласно XML Infoset, считается эквивалентным. Аналогично, не имеет значения и тип кавычек, используемых для атрибутов; таким образом, элементы

<test attr='value'/>
 <test attr="value"/>


согласно XML Infoset, эквивалентны. Список аспектов синтаксиса XML 1.0, которые не рассматриваются XML Infoset, приведен в Приложении D рекомендации Информационного множества W3C XML.

Рекомендация Информационного множества W3C XML описывает концепцию синтетических информационных множеств, которые создаются средствами, отличными от синтаксического разбора текстового XML-документа. Синтетические информационные множества подготавливают почву для обработки с помощью XML-технологий не-XML-данных, которые могут быть преобразованы в XML Infoset. Примером обработки синтетического информационного множества является ObjectXPathNavigator (http://msdn.microsoft.com/library/en-us/dnexxml/html/xml03172003.asp), который обеспечивает возможность запрашивать объекты в .NET Framework, используя XPath, или преобразовывать их, используя XSLT.

Языки Схемы

Язык XML-схемы используется для описания структуры и содержимого XML-документа. Например, схема может использоваться для определения документа, состоящего из одного или более элементов compact-disc, каждый из которых включает в качестве дочерних элементы price, title и artist. Во время обмена документами XML-схема описывает контракт между производителем и потребителем XML, поскольку она описывает то, что составляет действительное XML-сообщение передаваемое между двумя сторонами. Хотя для XML существует несколько языков схемы, от DTD до XDR, ведущим является Язык описания XML-схемы W3C (W3C XML Schema Definition Language), сокращенно XSD.

XSD уникален среди языков XML-схемы, потому что он первым пытается вывести роль XML-схемы за рамки традиционного ее применения для описания контракта между двумя сущностями, обменивающимися документами. XSD представляет концепцию Post Schema Validation Infoset (PSVI). Совместимый XSD-обработчик принимает XML Infoset как входные данные и после проверки преобразовывает его в Информационное множества после проверки схемы (PSVI). PSVI — это исходные входные данные XML Infoset с добавленными к существующим новыми единицами информации и новыми свойствами. В Рекомендации XML-схема W3C приведен список дополнений в Информационное множества после проверки схемы (PSVI).

Одним важным классом дополнений PSVI является аннотации типов. Элементы и атрибуты получают строгий контроль типов и имеют ассоциированную информацию о типе данных. Такие XML со строгим контролем типов весьма универсальны, потому что теперь они с помощью таких технологий как XmlSerializer (http://msdn.microsoft.com/library/en-us/dnexxml/html/xml01202003.asp) из .NET Framework могут быть преобразованы в объекты, с помощью технологий SQLXML (http://msdn.microsoft.com/sqlxml) и DataSet (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataDataSetClassTopic.asp) из .NET Framework они могут быть преобразованы в реляционные таблицы или их можно обработать с помощью языков запросов XML, таких как XPath 2.0 и XQuery, которые используют преимущество строгого контроля типов.

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="items">
 <xs:complexType>
 <xs:sequence>
 <xs:element ref="compact-disc" minOccurs="0" maxOccurs="unbounded" />
 </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:element name="compact-disc">
 <xs:complexType>
 <xs:sequence>
 <xs:element name="price" type="xs:decimal" />
 <xs:element name="artist" type="xs:string" />
 <xs:element name="title" type="xs:string" />
 </xs:sequence>
 </xs:complexType>
</xs:element>

</xs:schema>


API, использующие модель дерева
Древовидная модель API представляет XML-документ как дерево узлов, которые обычно загружаются в память все сразу. Самая популярная древовидная модель API для XML — Объектная модель документа W3C (W3C Document Object Model - DOM). DOM обеспечивает возможность программно читать, манипулировать и изменять XML-документ.

Ниже приведен пример использования класса XmlDocument (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXmlDocumentClassTopic.asp) в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

using System; 
using System.Xml; 

public class Test{

 public static void Main(string[] args){

 XmlDocument doc = new XmlDocument(); 
 doc.Load("test.xml"); 

 XmlElement firstCD = (XmlElement) doc.DocumentElement.FirstChild;
XmlElement artist = 
(XmlElement) firstCD.GetElementsByTagName("artist")[0];
 XmlElement title =
(XmlElement) firstCD.GetElementsByTagName("title")[0]

 Console.WriteLine("Artist={0}, Title={1}", artist.InnerText, title.InnerText);
 }
}


Курсорные APIs

Курсорные API в XML можно представить как лупу, которая проходит по XML-документу, согласно указаниям фокусируясь на отдельных аспектах документа. Класс XPathNavigator в .NET Framework — это пример курсорного API в XML. Преимущество курсорных API над древовидной моделью API в том, что для них не требуется, чтобы весь XML-документ был загружен в память, что открывает двери оптимизациям со стороны создателя XML, в которых документ загружается «по мере надобности».

Вот пример использования класса XPathNavigator (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp) в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

using System; 
using System.Xml; 
using System.Xml.XPath; 

public class Test{

 public static void Main(string[] args){

 XmlDocument doc = new XmlDocument(); 
 doc.Load("test.xml"); 

 XPathNavigator nav = doc.CreateNavigator(); 

 nav.MoveToFirstChild(); //переходит от корневого элемента к элементу документа (items)
 nav.MoveToFirstChild(); // переходит от элемента items к первому элементу compact-disc
 
 // переходит от элемента compact-disc к элементу artist
 nav.MoveToFirstChild();
 nav.MoveToNext(); 
 string artist = nav.Value; 

 // переходит от элемента artist к элементу title
 nav.MoveToNext(); 
 string title = nav.Value; 

 Console.WriteLine("Artist={0}, Title={1}", artist, title);
 }
}


Потоковые API

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

Передающие синтаксические анализаторы, такие как SAX, проходят по XML-потоку, а затем при встрече с XML-узлами «выталкивают» события в зарегистрированные обработчики событий (методы обратного вызова). Принимающие анализаторы, такие как класс XmlReader (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXmlReaderClassTopic.asp) в .NET Framework, работают в XML-потоке как однонаправленные курсоры.

Ниже представлен пример использования класса XmlReader в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

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

Передающие синтаксические анализаторы, такие как SAX, проходят по XML-потоку, а затем при встрече с XML-узлами «выталкивают» события в зарегистрированные обработчики событий (методы обратного вызова). Принимающие анализаторы, такие как класс XmlReader (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXmlReaderClassTopic.asp) в .NET Framework, работают в XML-потоке как однонаправленные курсоры.

Ниже представлен пример использования класса XmlReader в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

XML-запрос

В некоторых случаях может быть слишком сложно извлечь информацию из XML-документа с помощью API или по причине нетривиальности критерия поиска данных, или из-за того, что API не удается раскрыть определенные аспекты XML-документа, поддающиеся определенным запросам. Языки XML-запросов, такие как XPath 1.0 и будущий XQuery, обеспечивают богатые механизмы извлечения информации и информационных множеств XML.

Вот пример, показывающий, как использовать XPath для получения имени исполнителя и названия первого compact-disc в элементе items.



using System; 
using System.Xml.XPath; 

public class Test{

 public static void Main(string[] args){
 
 XPathDocument doc = new XPathDocument("test.xml"); 
 XPathNavigator nav = doc.CreateNavigator(); 

 XPathNodeIterator iterator = 
nav.Select("/items/compact-disc[1]/artist | /items/compact-disc[1]/title");

 iterator.MoveNext();
 Console.WriteLine("Artist={0}", iterator.Current);

 iterator.MoveNext();
 Console.WriteLine("Title={0}", iterator.Current);

 }
}




XML-преобразование

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

XSLT (http://www.w3.org/TR/xslt) — первый язык XML-преобразования. Преобразование, выраженное в XSLT, описывает правила преобразования исходного дерева в результирующее дерево. Преобразование достигается путем ассоциирования шаблонов. Шаблон — это выражение XPath, может рассматриваться как регулярное выражение, ставящее части исходного дерева XML в соответствие частям строки. Шаблон ставится в соответствие элементам исходного дерева. В случаях совпадения создается экземпляр шаблона для создания части результирующего дерева. При создании результирующего дерева элементы исходного дерева могут быть отфильтрованы и реорганизованы, а произвольная структура может быть добавлена.

Следующая таблица стилей XSLT преобразовывает элемент items в Web-страницу XHTML, содержащую таблицу с информацией о компакт дисках.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns="http://www.w3.org/1999/xhtml">

<xsl:output method="xml" indent="yes"
 doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
 doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" />


 <xsl:template match="/">

 <html lang="en" xml:lang="en">
 <head>
 <title>Order Information - ord123456</title>
 </head>
 <body>
 <table border="1">
 <tr><th>Artist</th><th>Title</th><th>Price</th></tr>

 <xsl:for-each select="items/compact-disc">
 <tr>
 <td><xsl:value-of xmlns="" select="artist" /></td>
 <td><xsl:value-of xmlns="" select="title" /></td>
 <td><xsl:value-of xmlns="" select="price" /></td>
 </tr>
 </xsl:for-each>

 </table>
 </body> 
 </html>
 
 </xsl:template>

</xsl:stylesheet>


XHTML-документ, созданный с использованием этой таблицы стилей, показан ниже:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>Order Information - ord123456</title>
 </head>
 <body>
 <table border="1">
 <tr>
 <th>Artist</th>
 <th>Title</th>
 <th>Price</th>
 </tr>
 <tr>
 <td>Nelly</td>
 <td>Nellyville</td>
 <td>16.95</td>
 </tr>
 <tr>
 <td>Baby D</td>
 <td>Lil Chopper Toy</td>
 <td>17.55</td>
 </tr>
 </table>
 </body>
</html>


Заключение

XML — это больше, чем просто текстовый формат для описания документов. Это механизм для описания структурированных и псевдоструктурированных данных, который обеспечивает доступ к богатому семейству технологий обработки таких данных. Мощные абстракции, такие как Информационное множество XML, открывают двери к обработке нетекстовых данных, таких как файловые системы, реестр Windows®, реляционные базы данных и даже объекты языков программирования, с помощью XML-технологий. XML еще на один шаг приблизил нас к универсальному доступу к данным.

Добавлено: 14 Августа 2013 02:57:41 Добавил: Андрей Ковальчук