Extensible Markup Language (XML)

  • Используется для обмена структурированным документами (имеет универсальный формат).
  • Является подмножеством Standard Generalized Markup Language (SGML)

XSL (eXtensible Stylesheet Language) расширение реализует XSL стандарты, поведение XSLT трансформации при использовании библиотеки libxslt.

Основные понятия

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

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

Объявление типа документа (Document Type Declaration) набор инструкций (DTD), который описывает применяемую структуру и содержимое XML документа. Так же как и сущности (enity) может быть объявлен внутри документа или во внешнем ресурсе.

Well-formed документ XML считается well-formed когда он содержит один корневой элемент, все тэги отрыты и закрыты соответственно и все сущности (<, >, &, ’, ") экранированы.

Valid документ XML считается valid если он одновременно является well-formed и соответствует заданному DTD. Документ может быть well-formed но не valid. Но никогда valid и при этом не well-formed.

Пример well-formed документа:

<?xml version="1.0"?>
<message>Hello, World!</message>

Имеет один корневой элемент и он выделен начальным и конечным тэгами. Но документ не является valid так как он не соответствует ни одному DTD. Вот пример valid документа:

<?xml version="1.0"?>
<!DOCTYPE message SYSTEM "message.dtd">
<message>Hello, World!</message>

В этом случае внешний DTD будет загружен из локального хранилища. Но также объявления могут быть заданы и локально:

<?xml version="1.0"?>
<!DOCTYPE message [
  <!ELEMENT message (#PCDATA)>
]>
<message>Hello, World!</message>

В большинстве случаев XML документы не содержат DTD и не являются valid. Так как DTD не является обязательным, только если нет необходимости валидации структуры документа. Не смотря на это все документы XML должны быть well-formed для функционала PHP, чтобы можно было корректно их распарсить.

Анализаторы

PHP поддерживает следующие методы парсинга XML:

  • SAX
  • DOM
  • XPath
  • XML to Object Mapping

SAX (Simple API for XML) - способ последовательного чтения/записи XML-файлов. Обычно SAX-парсеры требуют фиксированного количества памяти для своей работы, но не позволяют изменять содержимое документа. Всё, что делает SAX-парсер, это сообщает вызвавшему приложению о встреченных распознанных элементах XML-разметки или о встреченных ошибках.

DOM (Document Object Model) - это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов.

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML.

Кодировка

Исходный документ:

  • Задается во время парсинга.
  • Не может быть изменена во время парсинга.
  • Типы: UTF-8, US-ASCII, ISO-8859-1.

Выходные данные

  • Задается во время передачи данных к XML обработчикам.
  • По умолчанию устанавливается такая же как и у входных данных.
  • Может меняться в любое время.

resource xml_parser_create ([ string $encoding ] )

  • Создает новый XML анализатор и возвращает ссылающийся на него ресурс, который можно использовать в других XML функциях.
  • encoding Начиная с PHP 5, кодировка входных данных определяется автоматически, а encoding задает кодировку только для выводимых данных. Если передается пустая строка, анализатор попытается определить кодировку, просматривая первые 3 или 4 байта. В PHP 5.0.0 и 5.0.1 кодировка по умолчанию ISO-8859-1. Для версий PHP 5.0.2 и выше - UTF-8. Список поддерживаемых кодировок: ISO-8859-1, UTF-8 и US-ASCII.

resource xml_parser_create_ns ([ string $encoding [, string $separator = ":" ]] )

  • Создание XML анализатора с поддержкой пространств имен.

bool xml_set_element_handler ( resource $parser , callable $start_element_handler , callable $end_element_handler )

  • Установка обработчика начального и конечного элементов.
  • Устанавливает функцию обработчик элементов для XML анализатора parser. start_element_handler и end_element_handler - строки, содержащие имена функций, которые должны быть определены на момент вызова функции xml_parse() из анализатора parser.
  • Замечание: В качестве аргумента вместо имени функции может быть передан массив, содержащий ссылку на объект и имя метода.

bool xml_set_object ( resource $parser , object &$object )

  • Использование XML анализатора внутри объекта.
<?php
class xml  {
    var $parser;

    function xml() 
    {
        $this->parser = xml_parser_create();

        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
    }

    function parse($data) 
    {
        xml_parse($this->parser, $data);
    }

    function tag_open($parser, $tag, $attributes) 
    {
        var_dump($parser, $tag, $attributes); 
    }

    function cdata($parser, $cdata) 
    {
        var_dump($parser, $cdata);
    }

    function tag_close($parser, $tag) 
    {
        var_dump($parser, $tag);
    }

} // окончание определения класса xml

$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
?>

int xml_parse ( resource $parser , string $data [, bool $is_final = false ] )

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

int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )

  • Эта функция разбирает XML строку и помещает данные в 2 массива. Массив index содержит указатели на размещение значений в массиве values. Аргументы, задающие массивы, должны передаваться в функцию по ссылке.