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. Аргументы, задающие массивы, должны передаваться в функцию по ссылке.