Александр Некрасов · Автономное руководство

PHP: полный мануал с примерами, функциями и ООП

Разделы этой страницы
  1. XMLWriter: полный справочник записи XML
  2. Задача: выгрузить товар и не сломать XML
  3. Установка, зависимости и версии
  4. Класс XMLWriter, его состояние и жизненный цикл
  5. Стек элементов: что именно закрывает endElement
  6. Текст, атрибут, raw и CDATA: четыре разных задачи
  7. Пространство имён: URI, префикс и область действия
  8. Память, файл и поток: выбрать приёмник
  9. Кодировка, отступы и смешанное содержимое
  10. DTD, сущности, комментарии и PI без скрытого исполнения
  11. Применение: контролируемая выгрузка каталога
  12. Ответ браузеру и отправка в API
  13. Упражнение: поменять требования выгрузки
  14. Все методы и процедурные функции
  15. Вопросы из практики и дальнейший маршрут
  16. Получить catalog.xml из таблицы остатков
  17. Функции и методы этой темы
  18. Код и руководство с собой
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 117 · С нуля → справочник

XMLWriter: полный справочник записи XML

От первого XML-элемента до потоковой выгрузки: все методы и процедурные функции, пространства имён, буферы, CDATA и DTD.

Задача: выгрузить товар и не сломать XML

Наглядная модель

Из данных товара в корректную XML-запись

Writer различает структуру XML и обычный текст, который надо экранировать.

  1. Книга & блокнот

    Исходное название — обычный текст, не готовая разметка.

  2. startElement("product")

    Открываем товар, затем записываем атрибуты и дочерние элементы в нужном порядке.

  3. text / writeElement

    Амперсанд становится &, сохраняя смысл названия в XML.

  4. endElement и вывод

    Закрываем структуру и забираем буфер либо завершаем запись в поток.

writeRaw не экранирует данные и подходит только для заранее проверенной разметки. Запись XML не заменяет проверку схемой.

Магазин передаёт названия и остатки партнёру, который принимает XML. Значение «Книга & блокнот» нельзя просто вклеить между тегами: символ & имеет специальный смысл в XML. XMLWriter разделяет структуру документа и данные, последовательно записывает их в память, файл или поток.

Название товара → корректная строка для получателя
  1. Исходное значение: Книга & блокнот
  2. writeElement(title, значение) создаёт тег и экранирует текст
  3. outputMemory возвращает <title>Книга &amp; блокнот</title>
  4. XML-получатель восстановит текст Книга & блокнот

$w — переменная с объектом писателя; new XMLWriter() создаёт объект, а openMemory() подготавливает его для записи в память. Знак -> вызывает действие именно этого объекта. В скобках передаются аргументы, строки заключены в кавычки; ; завершает инструкцию. echo выводит полученную строку, но сам писатель до этого лишь собирает её. В процедурной записи тот же объект передают первым аргументом: xmlwriter_text($w, 'Книга').

В первом примере if ($writer === false) проверяет отказ подготовки; throw new RuntimeException(...) останавливает работу с понятной ошибкой вместо попытки использовать неготовый писатель. Основы: переменные, вызовы функций.

Из названия товара получить XML для интеграцииСамостоятельный пример
<?php
$writer = xmlwriter_open_memory();
if ($writer === false) {
    throw new RuntimeException('Не удалось подготовить XML');
}
xmlwriter_write_element($writer, 'title', 'Книга & блокнот');
$xml = xmlwriter_output_memory($writer);
echo $xml, "
";
Ожидаемый результат
<title>Книга &amp; блокнот</title>

Нам нужна строка с названием товара, которую XML-получатель прочитает без ошибки на &. Функция записи получает исходное название и создаёт элемент title. $xml хранит результат; его можно передать HTTP-клиенту или записать в файл.

XMLWriter работает поверх libxml и не хранит редактируемое дерево всего документа. Образ «принтер печатает строку за строкой» помогает понять движение только вперёд; он не означает, что каждый вызов немедленно пишет на диск или передаёт байты клиенту: существуют внутренние буферы.

Дальше развиваем именно этот результат: один элемент → товар с атрибутом и полями → несколько соседних товаров → файл catalog.xml → настоящий HTTP-ответ. Если нужна обратная задача «XML-файл → строки ведомости», перейдите к потоковому чтению. Документ — вся XML-запись, элемент title — её узел, текст названия — содержимое узла; атрибуты располагаются внутри открывающего тега.

Установка, зависимости и версии

XMLWriter входит в исходный код PHP, по умолчанию включён при сборке; отключается флагом --disable-xmlwriter. Требуется расширение libxml: текущий сборочный флаг --with-libxml, до PHP 7.4 использовали --enable-libxml. В дистрибутиве ОС расширение может поставляться отдельным пакетом PHP XML; название пакета зависит от ОС/репозитория. Не добавляйте наугад строку extension для несуществующей DLL.

Проверяем именно исполнитель выгрузки
  1. CLI/FPM/веб-SAPI запускает свою сборку PHP
  2. В этой сборке нужны libxml и XMLWriter
  3. extension_loaded и class_exists подтверждают доступность здесь
Убедиться, что расширение доступно в текущем PHPСамостоятельный пример
<?php
echo extension_loaded('xmlwriter') ? "XMLWriter доступен
" : "Нужно включить XMLWriter
";
echo class_exists('XMLWriter') ? "Класс найден
" : "Класс отсутствует
";
Ожидаемый результат
XMLWriter доступен
Класс найден

CLI и веб-сервер могут использовать разные php.ini и сборки PHP. Проверять нужно то окружение, которое выполнит выгрузку; показанный результат относится к среде примеров.

Версия/настройкаЧто меняется
PHP 5.1.2 / исторический PECLОсновная библиотека включена в PHP; старые страницы упоминают PECL XMLWriter. Для современной поставки PECL-установка обычно не требуется.
PHP 5.2.0 / 5.2.1fullEndElement/writeRaw появились в 5.2.0; DTD-entity операции — в 5.2.1.
PHP 8.0Процедурный writer теперь XMLWriter, а не ресурс. open-функции возвращают объект/false; flush больше не возвращает false.
PHP 8.4Статические toMemory/toUri/toStream; ValueError для NUL в encoding startDocument.
Настройки и константыСвоих директив php.ini и публичных констант XMLWriter не объявляет. На процесс/пути действуют общие ограничения PHP, права ОС и возможности libxml; setIndent — настройка конкретного объекта.
WindowsФайл openUri удерживается до освобождения писателя. Это не обещание межпроцессного протокола блокировок для вашей бизнес-логики.

Зависимости и обработка ошибок библиотеки: справочник libxml. История ресурсов нужна для чтения старого кода: is_resource($writer) больше не подходит для проверки XMLWriter.

Класс XMLWriter, его состояние и жизненный цикл

У писателя нет публичного набора свойств с XML-деревом. Его полезное состояние — приёмник, буфер и последовательность открытых конструкций. Вызов $w->writeElement(...) делает действие с этим состоянием; двойное двоеточие XMLWriter::toMemory() вызывает фабрику, создающую уже готовый объект. Для PHP 8.2/8.3 остаётся new плюс открытие.

Жизнь одного писателя
  1. new XMLWriter создаёт объект без приёмника
  2. openMemory/openUri подготавливает вывод
  3. Запись меняет стек открытых конструкций и буфер
  4. Финализация/получение результата, затем освобождение объекта
Тот же полезный результат объектными вызовамиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('status', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<status>ready</status>

В объекте хранится текущий приёмник и позиция записи. Процедурный API тоже использует этот же объект с PHP 8.0; выбирайте согласованный стиль проекта, а не ожидаемую разницу в скорости.

Создать объект ещё не значит открыть приёмникСамостоятельный пример
<?php
$w = new XMLWriter();
try {
    $w->writeElement('status', 'ready');
} catch (Error $error) {
    echo "Сначала откройте приёмник
";
}
Ожидаемый результат
Сначала откройте приёмник

new выделил объект, но не определил, куда писать. openMemory/openUri либо фабрика PHP 8.4 выполняют этот следующий шаг.

В PHP 8.5.11 объект нельзя клонировать. Сериализация не служит способом сохранить живой приёмник и позицию записи: создавайте новый писатель для нового документа. Отдельного close() нет. unset($w) освобождает только эту ссылку; объект уничтожится после последней ссылки. Сначала явно завершайте документ/сбрасывайте буфер, чтобы видеть ошибки. Не оставляйте успешность выгрузки на деструктор. Повторное открытие заменяет приёмник: это не продолжение прежнего документа.

Наследование не нужно для обычной выгрузки. Фабрики возвращают static, поэтому вызов у подкласса создаёт подкласс; не требуйте у его конструктора аргументы, которых фабрика не передаёт. Практические формы создания: XMLWriter::openMemory(), xmlwriter_open_memory(), XMLWriter::toMemory().

Стек элементов: что именно закрывает endElement

После startElement('order') текущим родителем становится order. После startElement('item') — item внутри order. endElement() закрывает item; следующий item снова будет ребёнком order. Метод не ищет тег по имени и не исправляет несбалансированную бизнес-логику.

Два соседних товара
  1. Открыть order, затем item A
  2. Закрыть item A — вернуться в order
  3. Открыть и закрыть item B
  4. Закрыть order
Строки заказа: каждый цикл закрывает свой itemСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
foreach (['A' => '2', 'B' => '1'] as $sku => $qty) {
    xmlwriter_start_element($w, 'item');
    xmlwriter_write_attribute($w, 'sku', $sku);
    xmlwriter_write_element($w, 'qty', $qty);
    xmlwriter_end_element($w); // item
}
xmlwriter_end_element($w); // order
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order><item sku="A"><qty>2</qty></item><item sku="B"><qty>1</qty></item></order>

=> связывает ключ с количеством; foreach берёт следующую пару. Закрытие item внутри цикла делает товары соседями. Если закрыть его только после цикла, товары окажутся вложены друг в друга.

Нужно сделатьОперация
Текстовый узел за один шагXMLWriter::writeElement()
Узел с атрибутами/детьмиXMLWriter::startElement() → атрибуты → текст/дети → XMLWriter::endElement()
Закрыть пустой узел отдельным тегомXMLWriter::fullEndElement()
Получить строку без закрытия теговXMLWriter::outputMemory() / XMLWriter::flush()

У полноценного XML-документа один корневой элемент. Writer позволяет создавать фрагменты и некоторые неверные последовательности; наличие API не означает, что любая цепочка вызовов образует well-formed документ.

Текст, атрибут, raw и CDATA: четыре разных задачи

Что есть на входеКак записатьЧто получится
Название A & BXMLWriter::text() / XMLWriter::writeElement()Символы защищены XML-сущностями; значение при разборе сохраняется.
Значение атрибутаXMLWriter::writeAttribute()Учитываются границы кавычек; записать до текста/детей.
Доверенный готовый XMLXMLWriter::writeRaw()Байты вставляются без экранирования и проверки дерева.
Текстовая HTML-строка по требованию форматаXMLWriter::writeCdata()Текст внутри CDATA; не вложенные XML-элементы и не HTML-санитайзер.
Одна граница между данными и разметкой
  1. Пользователь прислал название с символом &
  2. writeElement экранирует его внутри узла title
  3. XML-парсер восстановит исходный текст; raw здесь не нужен
Одна операция для имени и обычного текстаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('title', 'Paper & pen');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<title>Paper &amp; pen</title>

Передайте исходную строку с &, а не заранее подготовленное &amp;. Экранирование выполняет writer; двойное экранирование испортит смысл текста.

Произвольный текст: выбрать CDATA или обычное экранированиеСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$description = 'The marker ]]> is part of the manual';
xmlwriter_start_element($w, 'description');
if (str_contains($description, ']]>')) {
    xmlwriter_text($w, $description);
} else {
    xmlwriter_write_cdata($w, $description);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description>The marker ]]&gt; is part of the manual</description>

str_contains проверяет наличие запрещённой для CDATA границы. Обычный текст сохранит значение без ручной сборки сложных границ. Если получатель требует именно CDATA, нужно согласованное разбиение на несколько секций, а не удаление данных.

Экранирование не делает любой бинарный набор байтов допустимым XML: нужны корректная кодировка и разрешённые символы. Для бинарного вложения договор формата может требовать base64. Для URL &amp; в исходном XML корректен; вручную заменять его на & перед отправкой нельзя. Не вызывайте htmlspecialchars перед text/writeElement без отдельного осознанного требования сохранить буквально запись сущности.

Пространство имён: URI, префикс и область действия

В одном документе встречаются id магазина и id CRM. Пространство имён связывает локальное имя с URI: это идентичность словаря. Префикс crm — короткая метка для ссылки на URI; он может быть другим у получателя. XML namespaces не имеют отношения к пространствам имён PHP.

Две системы со своим id
  1. Магазин передаёт обычный id="7"
  2. CRM-поле получает crm:id="90" и xmlns:crm
  3. XML-получатель различает пару URI + локальное имя
Обычный id и id другого пространства — разные атрибутыСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs(null, 'item', 'urn:shop:catalog');
$w->writeAttribute('id', '7');
$w->writeAttributeNs('crm', 'id', 'urn:shop:crm', '90');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item id="7" crm:id="90" xmlns:crm="urn:shop:crm" xmlns="urn:shop:catalog"/>

Обычный id не принадлежит default namespace, crm:id принадлежит URI CRM. Службы могут иметь свои идентификаторы без конфликта локального имени id.

Пространство по умолчанию без префиксаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element_ns($w, null, 'catalog', 'urn:shop:catalog');
xmlwriter_write_element_ns($w, null, 'sku', null, 'A');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<catalog xmlns="urn:shop:catalog"><sku>A</sku></catalog>

Дочерний непрефиксный элемент наследует default namespace. Выключение пространства требует явного xmlns=""; простое null не отменяет наследование XML.

Без префикса элемент может наследовать default namespace. Обычные непрефиксные атрибуты его не наследуют. namespace=null в NS-операции означает «не выводить объявление xmlns здесь», а не «удалить унаследованное пространство». Префикс должен быть уже объявлен. URI не является командой скачать схему. Не копируйте namespace из внешних данных без схемы/соглашения сторон.

Память, файл и поток: выбрать приёмник

РежимПодходитСтоимость и возврат
openMemory / toMemoryНебольшое тело HTTP-запроса или XML-строка для тестаНакопление пропорционально размеру вывода; outputMemory/flush возвращает строку.
openUri / toUriБольшой файл или php://outputWriter постепенно пишет в приёмник; flush возвращает число, не содержимое.
toStream (8.4+)Приложение уже открыло поток с нужным режимомИспользуется текущая позиция; не закрывайте ресурс раньше writer.
Потоковая выгрузка
  1. Получить одну подготовленную запись
  2. Сформировать один item, сбросить накопление по выбранной политике
  3. Перейти к следующей записи, сохранив открытый корень
  4. Закончить корень, проверить финализацию, опубликовать готовый файл
Забирать документ частями, сохраняя состояние теговСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'items');
xmlwriter_write_element($w, 'item', 'A');
$first = xmlwriter_output_memory($w);
xmlwriter_write_element($w, 'item', 'B');
xmlwriter_end_element($w);
$second = xmlwriter_output_memory($w);
echo $first . $second, "
";
Ожидаемый результат
<items><item>A</item><item>B</item></items>

Точка соединяет строки. Здесь две части собраны для наглядности; при большой выгрузке отправляйте каждую в приёмник сразу, иначе общее накопление всё равно потребует память.

PHP 8.4: передать уже открытый потокСамостоятельный пример
<?php
$stream = fopen('php://temp', 'w+b');
if ($stream === false) {
    throw new RuntimeException('Нет потока');
}
$w = XMLWriter::toStream($stream);
$w->writeElement('total', '499');
if ($w->flush() < 0) {
    throw new RuntimeException('Ошибка записи');
}
unset($w);
rewind($stream);
echo stream_get_contents($stream), "
";
fclose($stream);
Ожидаемый результат
<total>499</total>

fopen возвращает ресурс потока; w+b разрешает запись и чтение. rewind переводит позицию в начало. XMLWriter не владеет чужим ресурсом эксклюзивно: после удаления писателя этот поток ещё доступен.

Если предварительно загрузить миллион товаров в массив или собирать все выданные куски обратно в одну строку, потоковый writer не устранит это потребление памяти. Частый flush увеличивает число операций ввода-вывода; размер партии выбирают измерением и требованиями к задержке. Это не универсальный метод ускорения. Термины и режимы: потоки PHP.

Кодировка, отступы и смешанное содержимое

XMLWriter получает текст в UTF-8. startDocument('1.0', 'UTF-8') объявляет кодировку результата; для другой кодировки библиотека может преобразовать байты и представить неподдерживаемые символы числовыми ссылками. Это не потеря символа при корректном разборе. Не меняйте одно имя encoding без понимания входных/выходных байтов.

Текст с вложенным выделением
  1. Обычный текст Buy с пробелом
  2. Вложенный b содержит today
  3. Обычный ! продолжает тот же текст; отступы не добавляем
Смешанный текст: оставить автоматические отступы выключеннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_set_indent($w, false);
xmlwriter_start_element($w, 'p');
xmlwriter_text($w, 'Buy ');
xmlwriter_write_element($w, 'b', 'today');
xmlwriter_text($w, '!');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<p>Buy <b>today</b>!</p>

Текст и вложенный элемент идут вперемешку. Автоматические пробелы и переносы изменили бы текстовое содержимое. Оформление XML не всегда безобидно.

Объявить UTF-8 и написать один кореньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDocument('1.0', 'UTF-8');
$w->writeElement('title', 'Книга');
$w->endDocument();
echo $w->outputMemory();
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<title>Книга</title>

XML-декларация относится к формату документа, а не к версии PHP. Ввод текста в XMLWriter должен быть UTF-8; encoding задаёт кодирование выходного документа.

Для обменных таблиц с чисто дочерними элементами отступы полезны человеку; для смешанного текста добавленные пробелы могут изменить значение. Сравнение XML по байтам, подписи и каноникализация — отдельные задачи. Настройки задают после открытия приёмника, потому что новое открытие их сбрасывает.

DTD, сущности, комментарии и PI без скрытого исполнения

DTD описывает структуру; комментарий предназначен для человека; PI передаёт инструкцию приложению-получателю. Writer записывает эти конструкции, но не исполняет их и не валидирует документ. Внешние сущности/DTD становятся риском на стороне последующего парсера, если тот разрешает неподходящие ресурсы. Передавайте такие декларации только как контролируемую часть формата.

Правила и данные различаются
  1. DOCTYPE объявляет message с текстом (#PCDATA)
  2. writeElement записывает фактическое сообщение Ready
  3. Отдельный валидирующий получатель может проверить соответствие правилам
Объявить один текстовый элемент во внутренней DTDСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

message после DOCTYPE — имя корня. (#PCDATA) разрешает разобранный текст внутри message. Квадратные скобки ограничивают внутренние объявления; writer расставляет границы сам.

КонструкцияОграничение
CDATAНельзя включать ]]> внутрь одной секции. Обычный text часто проще.
КомментарийНельзя -- и завершающий дефис. Комментарии видны получателю.
PIНельзя ?> в содержимом; target xml зарезервирован. Writer не запускает PHP/XSLT.
DTD ENTITYОбычные &name; и параметрические %name; имеют разные области применения. Раскрытие/загрузка происходит при чтении, если разрешено.
Проверка XMLtrue от write-операции не означает соответствие DTD/XSD или даже well-formed документ.

Параметры libxml относятся к конкретной операции библиотеки: ошибки, флаги и ограничения libxml. Не включайте загрузку внешних сущностей только ради проверки своего простого экспорта.

Применение: контролируемая выгрузка каталога

Начните с небольшого набора проверенных товаров. Артикул станет атрибутом, название и остаток — дочерними элементами. Функция requireWrite($ok, $step) ниже проверяет результат каждого записывающего вызова; вторая строка аргумента нужна только для диагностики. try/finally освобождает writer и при ошибке. Подробнее: исключения и finally, массивы товаров.

Что проверяет пример
  1. Две подготовленные записи A/B
  2. Для каждой: открыть item → sku → title → qty → закрыть item
  3. Завершить catalog/document; проверить flush
  4. Освободить writer, затем прочитать созданный файл
Записать два товара в собственный файл и выдать его после успехаСамостоятельный пример
<?php
function requireWrite($ok, $step) {
    if (!$ok) {
        throw new RuntimeException('XML: ' . $step);
    }
}
$products = [
    ['sku' => 'A', 'title' => 'Paper & pen', 'qty' => '2'],
    ['sku' => 'B', 'title' => 'Книга', 'qty' => '7'],
];
$path = __DIR__ . '/catalog.xml';
$w = new XMLWriter();
requireWrite($w->openUri($path), 'open');
try {
    requireWrite($w->startDocument('1.0', 'UTF-8'), 'document');
    requireWrite($w->startElement('catalog'), 'catalog');
    foreach ($products as $product) {
        requireWrite($w->startElement('item'), 'item');
        requireWrite($w->writeAttribute('sku', $product['sku']), 'sku');
        requireWrite($w->writeElement('title', $product['title']), 'title');
        requireWrite($w->writeElement('qty', $product['qty']), 'qty');
        requireWrite($w->endElement(), 'end item');
    }
    requireWrite($w->endElement(), 'end catalog');
    requireWrite($w->endDocument(), 'end document');
    if ($w->flush() < 0) {
        throw new RuntimeException('Ошибка сброса');
    }
} finally {
    unset($w);
}
$xml = file_get_contents($path);
if ($xml === false) {
    throw new RuntimeException('Ошибка чтения результата');
}
echo $xml;
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<catalog><item sku="A"><title>Paper &amp; pen</title><qty>2</qty></item><item sku="B"><title>Книга</title><qty>7</qty></item></catalog>

Функция requireWrite получает bool операции и название шага, останавливает экспорт при отказе. finally выполняет освобождение даже при исключении; он не подавляет ошибку. Данные здесь заранее подготовлены. Для реальной выгрузки отдельно проверяют обязательные поля, типы/диапазоны, получают строки БД порциями и публикуют только полностью готовый файл.

Файл примера новый и находится в его временном каталоге. В приложении стройте путь из контролируемого каталога и собственного имени, а не из поля запроса. При публикации выгрузки сначала пишут отдельный временный файл, завершают/проверяют его и только затем выполняют согласованную замену; атомарность замены зависит от ОС/файловой системы. Успех XMLWriter не заменяет учёт дисковых ошибок, лимитов и бизнес-валидацию. Чтение всего файла обратно здесь нужно только для видимого результата, не для большого экспорта.

Ответ браузеру и отправка в API

Сначала сам обработчик: он создаёт короткий документ в памяти, задаёт Content-Type и отправляет его. Сохраните как xml-server.php; затем приведённый ниже клиент запустит его локально и покажет фактический HTTP-ответ.

xml-server.php — исполняемый HTTP-обработчик из архива
<?php
declare(strict_types=1);
$writer = new XMLWriter();
if (!$writer->openMemory()
    || !$writer->startDocument('1.0', 'UTF-8')
    || !$writer->writeElement('status', 'ready')
    || !$writer->endDocument()) {
    http_response_code(500);
    exit;
}
$body = $writer->outputMemory();
header('Content-Type: application/xml; charset=UTF-8');
echo $body;

XML-файл на диске, строка тела запроса и HTTP-ответ — разные результаты. Веб-обработчик должен отдать правильный Content-Type и только XML-байты в теле. Имя созданного файла не является его содержимым. В отправке через cURL аналогично передают сформированную строку как тело и согласованный Content-Type, проверяя HTTP-статус отдельно от генерации XML.

Небольшой XML-ответ
  1. Сформировать документ в памяти и проверить записи
  2. Установить Content-Type application/xml; charset=UTF-8
  3. Отдать только полученную строку тела ответа
Проверить настоящий HTTP-ответ, его тип и XML-телоСамостоятельный пример
<?php
declare(strict_types=1);

require __DIR__ . '/xml-lab.php';
[$server, $base] = startXmlLab();
try {
    $response = fopen($base . '/status.xml', 'rb');
    if ($response === false) { throw new RuntimeException('Нет HTTP-ответа'); }
    $headers = stream_get_meta_data($response)['wrapper_data'];
    $body = stream_get_contents($response);
    fclose($response);
    echo $headers[0], "\n";
    foreach ($headers as $header) {
        if (stripos($header, 'Content-Type:') === 0) { echo $header, "\n"; }
    }
    echo $body;
} finally { stopXmlLab($server); }
Ожидаемый результат
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<status>ready</status>

Приложенный xml-server.php выполняется настоящим локальным HTTP-сервером и создаёт XML через XMLWriter. Клиент отдельно видит строку статуса, Content-Type и байты тела: одно имя файла не заменяет документ. xml-lab.php запускает PHP на 127.0.0.1 и останавливает его в finally. Никакой публичный сервер не используется.

Если начать потоковый HTTP-вывод раньше и позже получить ошибку, уже отправленную часть XML невозможно отозвать. Поэтому выбор между памятью, временным файлом и прямым потоком зависит от размера, требований к ошибкам и инфраструктуры. Поведение браузера в режиме text/html не является проверкой XML. См. HTTP-запрос и ответ и отправка через cURL.

Упражнение: поменять требования выгрузки

Получатель требует два товара A/B под одним catalog, артикул в атрибуте sku, пустой note только в форме пары тегов. До просмотра решения распишите порядок операций и покажите место, где поздний атрибут уже не получится добавить.

План решения
  1. Открыть catalog
  2. Для каждого артикула: item → sku → note → fullEndElement → endElement
  3. Закрыть catalog и получить строку
Решение: два товара с обязательной парой пустых noteСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('catalog');
foreach (['A', 'B'] as $sku) {
    $w->startElement('item');
    $w->writeAttribute('sku', $sku);
    $w->startElement('note');
    $w->fullEndElement();
    $w->endElement();
}
$w->endElement();
echo $w->outputMemory(), "
";
Ожидаемый результат
<catalog><item sku="A"><note></note></item><item sku="B"><note></note></item></catalog>

Контроль: оба item — соседи, sku находится до дочернего note, у пустого note отдельный закрывающий тег. Измените note на текст с &, используя text, и убедитесь, что его XML-запись экранирована.

Следующий шаг: поместите логику одного item в функцию, которая получает XMLWriter и данные товара. Это оставит один общий писатель и сделает границу ответственности заметной: функция должна закрыть ровно те элементы, которые сама открыла. Затем добавьте проверку обязательного sku до начала его записи.

Все методы и процедурные функции

У каждой операции две формы приведены рядом, кроме трёх статических фабрик PHP 8.4. Карточки содержат отдельные сигнатуры, параметры, возврат/ошибки и прогрессивные примеры. У openMemory/openUri результат метода и процедурной функции различается; в остальных парных операциях меняется способ передать writer.

Приёмник и буфер

Оформление

Начало и конец документа

Элементы и текст

Атрибуты

Пространства имён

CDATA, комментарии и PI

DTD и сущности

Вопросы из практики и дальнейший маршрут

  • Обсуждение задачи: Кто отвечает за объявление и повторное использование namespace-префиксов; объясняем область действия xmlns и null URI.
  • Обсуждение задачи: Unicode и числовые ссылки в XML: различаем входной UTF-8, выходную кодировку и текстовое значение.
  • Обсуждение задачи: CDATA не создаёт элемент и не заменяет безопасную запись любого текста; показываем возврат к text для ]]>.
  • Обсуждение задачи: endElement не принимает имя; неверное закрытие приводит к неожиданной вложенности.
  • Обсуждение задачи: startElement начинает новый узел, а не выбирает старый; зафиксирован порядок цикла товаров.
  • Обсуждение задачи: writeRaw для необработанных полей БД портит XML; исходный текст направляем через text/writeElement.
  • Обсуждение задачи: Файл и HTTP-ответ — разные приёмники. Записать файл и вывести его имя не означает отправить XML.
  • Обсуждение задачи: DOM браузера может отличаться от исходных байтов XML из-за HTML-разбора; для XML нужен верный Content-Type.

Обсуждения использованы как источник реальных затруднений; код и объяснения здесь самостоятельные, контракты сверены с PHP/libxml/XML. Для изменения уже готового дерева нужен DOM; для последовательного чтения больших документов — XMLReader; для удобного доступа к небольшому дереву — SimpleXML. Эти инструменты решают другие этапы обмена, а не заменяют правила кодировки и доверия к данным.

Получить catalog.xml из таблицы остатков

Коллега прислал stock.csv. Обратная задача к XMLReader: прочитать по одной строке таблицы и записать по одному product. Амперсанд в названии остаётся обычными данными; XMLWriter сам запишет его как сущность.

stock.csv — входная таблица
sku,name,stock
A1,Desk & Lamp,3
B2,Chair,0
Одна строка таблицы становится одним узлом
  1. A1, Desk & Lamp, 3 — три CSV-поля
  2. Открыть product, затем записать атрибут sku
  3. name и stock — дочерние элементы
  4. Закрыть product; следующая строка станет соседом
  5. Закрыть catalog и проверить файл catalog.xml

Сначала разделим работу: fgetcsv читает одну строку и возвращает массив её полей; [$sku, $name, $stock] даёт этим полям понятные имена. Ниже источником writer служит строка CSV, а остальные операции уже разобраны на одном элементе и на соседних товарах.

Проверить, что три CSV-поля прочитаны правильноСамостоятельный пример
<?php
declare(strict_types=1);

$input = fopen(__DIR__ . '/stock.csv', 'rb');
if ($input === false) { throw new RuntimeException('Нет таблицы'); }
fgetcsv($input, 0, ',', '"', '');
[$sku, $name, $stock] = fgetcsv($input, 0, ',', '"', '');
fclose($input);
echo $sku, ': ', $name, ' — ', $stock, "\n";
Ожидаемый результат
A1: Desk & Lamp — 3

Первая строка — заголовок, её пропускаем. Следующая содержит три значения; & пока обычный символ названия. Здесь подготовленный исправный CSV. Полная версия ниже проверяет заголовок, число полей и форму остатка.

Записать строки CSV в новый XML-файлСамостоятельный пример
<?php
declare(strict_types=1);

function written(bool $ok): void {
    if (!$ok) { throw new RuntimeException('XML не записан'); }
}
$input = fopen(__DIR__ . '/stock.csv', 'rb');
if ($input === false) { throw new RuntimeException('Нет входной таблицы'); }
$writer = new XMLWriter();
try {
    $header = fgetcsv($input, 0, ',', '"', '');
    if ($header !== ['sku', 'name', 'stock']) { throw new UnexpectedValueException('Нужны столбцы sku,name,stock'); }
    written($writer->openUri(__DIR__ . '/catalog.pending.xml'));
    written($writer->startDocument('1.0', 'UTF-8'));
    written($writer->startElement('catalog'));
    while (($row = fgetcsv($input, 0, ',', '"', '')) !== false) {
        if (count($row) !== 3) { throw new UnexpectedValueException('Нужны три поля'); }
        [$sku, $name, $stock] = $row;
        if ($sku === '' || $name === '' || preg_match('/\A(?:0|[1-9][0-9]{0,3})\z/', $stock) !== 1) {
            throw new UnexpectedValueException('Неверная запись ' . $sku);
        }
        written($writer->startElement('product'));
        written($writer->writeAttribute('sku', $sku));
        written($writer->writeElement('name', $name));
        written($writer->writeElement('stock', $stock));
        written($writer->endElement());
    }
    written($writer->endElement());
    written($writer->endDocument());
    if ($writer->flush() < 0) { throw new RuntimeException('Ошибка сброса XML'); }
} finally { fclose($input); unset($writer); }
if (!rename(__DIR__ . '/catalog.pending.xml', __DIR__ . '/catalog.xml')) {
    throw new RuntimeException('Не удалось завершить файл');
}
echo file_get_contents(__DIR__ . '/catalog.xml');
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<catalog><product sku="A1"><name>Desk &amp; Lamp</name><stock>3</stock></product><product sku="B2"><name>Chair</name><stock>0</stock></product></catalog>

Новая учебная папка получает catalog.xml после финализации writer и освобождения файла. Все записывающие шаги проверяет written, flush проверяется отдельно по числу. Название не передаётся через writeRaw и не экранируется заранее. При отказе до rename итоговый файл не создаётся; может остаться собственный промежуточный файл. Для приложения дополнительно нужны договор кодировки/размера/уникальности SKU, обработка ошибок чтения и политика замены общего файла.

Чтение всего catalog.xml в конце сделано только для короткого учебного результата. Большую готовую выгрузку передают как файл или поток. Замените & в исходной таблице на кавычки и другие обычные символы и сравните XML; допустимость управляющих символов XML1.0 и неверного UTF8 проверяется отдельной политикой данных.

Отклонить строку с неверным остатком до завершения XMLСамостоятельный пример
<?php
declare(strict_types=1);

try { require __DIR__ . '/converter.php'; }
catch (UnexpectedValueException $error) { echo 'Отказ: ', $error->getMessage(), "\n"; }
echo file_exists(__DIR__ . '/catalog.xml') ? "Есть итоговый файл\n" : "catalog.xml не создан\n";
Ожидаемый результат
Отказ: Неверная запись A1
catalog.xml не создан

converter.php содержит ровно полный конвертер из предыдущего шага. Входной stock.csv имеет слово many вместо числа. Отказ проверен в новой отдельной папке; нулевой stock другого товара сам по себе допустим.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

XMLWriter::openMemoryПодготовить писатель для небольшой XML-строки: например тела запроса к службе доставки.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::openMemory(): bool

Подготовить писатель для небольшой XML-строки: например тела запроса к службе доставки.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Метод возвращает bool; xmlwriter_open_memory() возвращает XMLWriter|false. Повторное открытие заменяет прежний приёмник и сбрасывает настройки отступов: сначала заберите нужный результат. Объём XML в памяти растёт; для большой выгрузки выбирайте URI/поток.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_open_memory(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. openMemory создаёт пустой буфер
  2. writeElement добавляет <status>ready</status>
  3. outputMemory возвращает строку; echo выводит её
Одна строка из памятиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('status', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<status>ready</status>

openMemory возвращает признак успешной подготовки. XML пока не попадает ни в файл, ни в браузер: строку получаем отдельным вызовом.

Функция, возвращающая готовый XMLСамостоятельный пример
<?php
function statusXml($status) {
    $writer = xmlwriter_open_memory();
    if ($writer === false) {
        throw new RuntimeException('Нет буфера');
    }
    xmlwriter_write_element($writer, 'status', $status);
    return xmlwriter_output_memory($writer);
}
echo statusXml('paid'), "
";
echo statusXml('sent'), "
";
Ожидаемый результат
<status>paid</status>
<status>sent</status>

function объявляет действие; $status получает переданную строку; return отдаёт результат вызывающему коду. Каждый вызов создаёт независимый писатель. Это две отдельные XML-строки, а не один документ с двумя корнями.

Соседние операции: XMLWriter::outputMemory(), XMLWriter::openUri(), XMLWriter::toMemory().

xmlwriter_open_memoryПодготовить писатель для небольшой XML-строки: например тела запроса к службе доставки.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_open_memory(): XMLWriter|false

Подготовить писатель для небольшой XML-строки: например тела запроса к службе доставки.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Метод возвращает bool; xmlwriter_open_memory() возвращает XMLWriter|false. Повторное открытие заменяет прежний приёмник и сбрасывает настройки отступов: сначала заберите нужный результат. Объём XML в памяти растёт; для большой выгрузки выбирайте URI/поток.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::openMemory(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. openMemory создаёт пустой буфер
  2. writeElement добавляет <status>ready</status>
  3. outputMemory возвращает строку; echo выводит её
Одна строка из памятиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('status', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<status>ready</status>

openMemory возвращает признак успешной подготовки. XML пока не попадает ни в файл, ни в браузер: строку получаем отдельным вызовом.

Функция, возвращающая готовый XMLСамостоятельный пример
<?php
function statusXml($status) {
    $writer = xmlwriter_open_memory();
    if ($writer === false) {
        throw new RuntimeException('Нет буфера');
    }
    xmlwriter_write_element($writer, 'status', $status);
    return xmlwriter_output_memory($writer);
}
echo statusXml('paid'), "
";
echo statusXml('sent'), "
";
Ожидаемый результат
<status>paid</status>
<status>sent</status>

function объявляет действие; $status получает переданную строку; return отдаёт результат вызывающему коду. Каждый вызов создаёт независимый писатель. Это две отдельные XML-строки, а не один документ с двумя корнями.

Соседние операции: XMLWriter::outputMemory(), XMLWriter::openUri(), XMLWriter::toMemory().

XMLWriter::openUriЗаписывать XML в файл или поддерживаемый URI, не накапливая весь результат в одной строке.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::openUri(string $uri): bool

Записывать XML в файл или поддерживаемый URI, не накапливая весь результат в одной строке.

ПараметрЧто передать
$uriПуть к файлу либо URI поддерживаемой оболочки, например php://output. Путь выбирает приложение.

Метод возвращает bool, процедурная функция — XMLWriter|false. Пустая строка/нулевой байт в пути недопустимы; в PHP 8 это ValueError. Неразрешимый путь/невозможность записи дают отказ, иногда предупреждение. Открытие файла предназначено для новой записи и может обнулить существующий: не передавайте чужой путь. На Windows файл удерживается до освобождения писателя. flush не уничтожает объект.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_open_uri(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Путь status.xml задан самим приложением
  2. openUri подготавливает файл для записи
  3. flush проталкивает XML в файл; освобождение writer отпускает приёмник
Выгрузить статус в собственный файлСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openUri(__DIR__ . '/status.xml')) {
    throw new RuntimeException('Файл недоступен');
}
$w->writeElement('status', 'ready');
if ($w->flush() < 0) {
    throw new RuntimeException('Ошибка записи');
}
unset($w);
echo file_get_contents(__DIR__ . '/status.xml'), "
";
Ожидаемый результат
<status>ready</status>

__DIR__ — каталог текущего примера. Проверяем открытие, завершаем вывод буфера, освобождаем писатель перед чтением; это важно и для Windows. Имя файла задано программой.

Процедурная запись прямо в вывод программыСамостоятельный пример
<?php
$w = xmlwriter_open_uri('php://output');
if ($w === false) {
    throw new RuntimeException('Вывод недоступен');
}
xmlwriter_write_element($w, 'result', 'ok');
$written = xmlwriter_flush($w);
if ($written < 0) {
    throw new RuntimeException('Ошибка вывода');
}
unset($w);
echo "
";
Ожидаемый результат
<result>ok</result>

Здесь XML выводится через приёмник; нельзя делать echo xmlwriter_flush($w), иначе к документу добавится число байтов. В HTTP заранее отправляют Content-Type application/xml; CLI-пример проверяет только вывод.

Соседние операции: XMLWriter::toUri(), XMLWriter::toStream(), XMLWriter::flush(), XMLWriter::openMemory().

xmlwriter_open_uriЗаписывать XML в файл или поддерживаемый URI, не накапливая весь результат в одной строке.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_open_uri(string $uri): XMLWriter|false

Записывать XML в файл или поддерживаемый URI, не накапливая весь результат в одной строке.

ПараметрЧто передать
$uriПуть к файлу либо URI поддерживаемой оболочки, например php://output. Путь выбирает приложение.

Метод возвращает bool, процедурная функция — XMLWriter|false. Пустая строка/нулевой байт в пути недопустимы; в PHP 8 это ValueError. Неразрешимый путь/невозможность записи дают отказ, иногда предупреждение. Открытие файла предназначено для новой записи и может обнулить существующий: не передавайте чужой путь. На Windows файл удерживается до освобождения писателя. flush не уничтожает объект.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::openUri(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Путь status.xml задан самим приложением
  2. openUri подготавливает файл для записи
  3. flush проталкивает XML в файл; освобождение writer отпускает приёмник
Выгрузить статус в собственный файлСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openUri(__DIR__ . '/status.xml')) {
    throw new RuntimeException('Файл недоступен');
}
$w->writeElement('status', 'ready');
if ($w->flush() < 0) {
    throw new RuntimeException('Ошибка записи');
}
unset($w);
echo file_get_contents(__DIR__ . '/status.xml'), "
";
Ожидаемый результат
<status>ready</status>

__DIR__ — каталог текущего примера. Проверяем открытие, завершаем вывод буфера, освобождаем писатель перед чтением; это важно и для Windows. Имя файла задано программой.

Процедурная запись прямо в вывод программыСамостоятельный пример
<?php
$w = xmlwriter_open_uri('php://output');
if ($w === false) {
    throw new RuntimeException('Вывод недоступен');
}
xmlwriter_write_element($w, 'result', 'ok');
$written = xmlwriter_flush($w);
if ($written < 0) {
    throw new RuntimeException('Ошибка вывода');
}
unset($w);
echo "
";
Ожидаемый результат
<result>ok</result>

Здесь XML выводится через приёмник; нельзя делать echo xmlwriter_flush($w), иначе к документу добавится число байтов. В HTTP заранее отправляют Content-Type application/xml; CLI-пример проверяет только вывод.

Соседние операции: XMLWriter::toUri(), XMLWriter::toStream(), XMLWriter::flush(), XMLWriter::openMemory().

XMLWriter::toMemoryСоздать сразу готовый писатель в памяти через статическую фабрику.

PHP 8.4+ · xmlwriter / libxml

XMLWriter::toMemory(): static

Создать сразу готовый писатель в памяти через статическую фабрику.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает объект вызываемого класса (static), не bool. При невозможности создать внутренний writer возникает Error. Вызов у подкласса создаёт этот подкласс; его конструктор не должен требовать обязательных аргументов. Процедурного xmlwriter_to_memory нет.

static после двоеточия означает объект того класса, у которого вызвана фабрика. В этих примерах это XMLWriter. Фабрика создаёт и подготавливает объект; при отказе не следует ожидать обычный false.

Что произойдёт в этом состоянии писателя
  1. Статическая фабрика создаёт новый writer
  2. writeElement записывает sku B-12 в его буфер
  3. outputMemory забирает XML-строку
PHP 8.4: готовый писатель одним вызовомСамостоятельный пример
<?php
$w = XMLWriter::toMemory();
$w->writeElement('sku', 'B-12');
echo $w->outputMemory(), "
";
Ожидаемый результат
<sku>B-12</sku>

Двойное двоеточие вызывает статическую фабрику: она создаёт и подготавливает объект. new и openMemory уже не нужны. На PHP 8.2/8.3 используйте две предыдущие операции.

Два назначения — два независимых буфераСамостоятельный пример
<?php
$order = XMLWriter::toMemory();
$stock = XMLWriter::toMemory();
$order->writeElement('order', '42');
$stock->writeElement('stock', '7');
echo $stock->outputMemory(), "
";
echo $order->outputMemory(), "
";
Ожидаемый результат
<stock>7</stock>
<order>42</order>

Порядок чтения не меняет содержимое другого писателя. Две независимые XML-строки можно отправить разным получателям.

Соседние операции: XMLWriter::openMemory(), XMLWriter::toStream(), XMLWriter::toUri().

XMLWriter::toUriСоздать объект, который сразу пишет в выбранный файл/URI.

PHP 8.4+ · xmlwriter / libxml

XMLWriter::toUri(string $uri): static

Создать объект, который сразу пишет в выбранный файл/URI.

ПараметрЧто передать
$uriНепустой путь или URI приёмника; применяется тот же принцип, что у openUri.

Возвращает static. Пустой/неразрешимый путь — ValueError; невозможность создать writer — Error, а не false (возможна дополнительная диагностика нижнего уровня). На Windows освободите объект перед заменой/перемещением файла. Фабрика не создаёт отсутствующие родительские каталоги. Процедурного аналога с именем to_uri нет.

static после двоеточия означает объект того класса, у которого вызвана фабрика. В этих примерах это XMLWriter. Фабрика создаёт и подготавливает объект; при отказе не следует ожидать обычный false.

Что произойдёт в этом состоянии писателя
  1. Приложение выбирает shipment.xml
  2. Фабрика возвращает writer, уже связанный с файлом
  3. Запись shipment → flush → освобождение writer
PHP 8.4: фабрика файлаСамостоятельный пример
<?php
$path = __DIR__ . '/shipment.xml';
$w = XMLWriter::toUri($path);
$w->writeElement('shipment', 'ready');
if ($w->flush() < 0) {
    throw new RuntimeException('Ошибка записи');
}
unset($w);
echo file_get_contents($path), "
";
Ожидаемый результат
<shipment>ready</shipment>

Объект уже связан с файлом. Для настоящего экспорта права доступа и свободное место тоже имеют значение; успешное создание объекта не гарантирует все будущие записи.

Проверить отказ фабрики для пустого путиСамостоятельный пример
<?php
try {
    XMLWriter::toUri('');
} catch (ValueError $error) {
    echo "Нужен путь к файлу
";
}
Ожидаемый результат
Нужен путь к файлу

try/catch перехватывает ошибку значения. Конкретно пустой путь — ошибка аргумента, а не возвращённый false. Не показывайте посетителю системные пути из диагностики.

Соседние операции: XMLWriter::openUri(), XMLWriter::toMemory(), XMLWriter::toStream().

XMLWriter::toStreamПодключить XMLWriter к уже открытому записываемому PHP-потоку.

PHP 8.4+ · xmlwriter / libxml

XMLWriter::toStream(resource $stream): static

Подключить XMLWriter к уже открытому записываемому PHP-потоку.

ПараметрЧто передать
$streamОткрытый stream-ресурс, полученный, например, fopen; нужна возможность записи. Это не имя файла и не любой ресурс.

Возвращает static. Нересурс/ресурс другого вида вызывает TypeError. Создание внутренних структур может вызвать Error; непригодность потока к записи обнаруживается также при записи/flush. Позиция и владение ресурсом остаются важными: сначала flush, затем освободить writer, затем fclose. Объект удерживает ссылку на ресурс, но явное раннее fclose всё равно ломает дальнейший вывод. Нестроковый режим flush возвращает число, outputMemory к этому приёмнику не подходит.

static после двоеточия означает объект того класса, у которого вызвана фабрика. В этих примерах это XMLWriter. Фабрика создаёт и подготавливает объект; при отказе не следует ожидать обычный false.

Что произойдёт в этом состоянии писателя
  1. fopen открывает php://temp на чтение и запись
  2. toStream связывает writer с текущей позицией потока
  3. flush → удалить writer → rewind → прочитать XML
PHP 8.4: передать уже открытый потокСамостоятельный пример
<?php
$stream = fopen('php://temp', 'w+b');
if ($stream === false) {
    throw new RuntimeException('Нет потока');
}
$w = XMLWriter::toStream($stream);
$w->writeElement('total', '499');
if ($w->flush() < 0) {
    throw new RuntimeException('Ошибка записи');
}
unset($w);
rewind($stream);
echo stream_get_contents($stream), "
";
fclose($stream);
Ожидаемый результат
<total>499</total>

fopen возвращает ресурс потока; w+b разрешает запись и чтение. rewind переводит позицию в начало. XMLWriter не владеет чужим ресурсом эксклюзивно: после удаления писателя этот поток ещё доступен.

Добавить доверенный XML-фрагмент к уже записанному началуСамостоятельный пример
<?php
$stream = fopen('php://temp', 'w+b');
if ($stream === false) {
    throw new RuntimeException('Нет потока');
}
fwrite($stream, '<batch>');
$w = XMLWriter::toStream($stream);
$w->writeElement('item', 'A');
$w->flush();
unset($w);
fwrite($stream, '</batch>');
rewind($stream);
echo stream_get_contents($stream), "
";
fclose($stream);
Ожидаемый результат
<batch><item>A</item></batch>

Писатель использует текущую позицию, а не начинает файл заново. В этом специальном примере внешняя программа отвечает за корневые теги; обычно проще поручить весь документ одному XMLWriter. Не закрывайте поток, пока writer ещё может писать.

Соседние операции: XMLWriter::toUri(), XMLWriter::flush(), XMLWriter::outputMemory().

XMLWriter::outputMemoryПолучить накопленный XML как строку из режима памяти.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::outputMemory(bool $flush = true): string

Получить накопленный XML как строку из режима памяти.

ПараметрЧто передать
$flushtrue — вернуть и очистить накопление; false — вернуть копию, оставив содержимое.

Всегда string. Вызов проталкивает внутренний буфер writer в память, но не закрывает структуру документа. Для URI/потока не читает файл обратно: в PHP 8.5.11 возвращает пустую строку. Не путайте очистку буфера с openMemory: состояние незакрытых элементов сохраняется.

string после двоеточия означает строку. Пустая строка — допустимый результат для пустого буфера, а не автоматический признак ошибки. Получение строки и её вывод через echo — разные действия.

Другая форма вызова с тем же смыслом: xmlwriter_output_memory(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Буфер содержит <sku>A</sku>
  2. outputMemory(false) возвращает копию и сохраняет буфер
  3. outputMemory(true) возвращает содержимое и очищает накопление
Посмотреть буфер, не забирая егоСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('sku', 'A');
echo $w->outputMemory(false), "\n";
echo $w->outputMemory(), "\n";
var_dump($w->outputMemory());
Ожидаемый результат
<sku>A</sku>
<sku>A</sku>
string(0) ""

false сохраняет уже полученную строку в буфере; стандартное true забирает и очищает её. Третий вызов видит пустой буфер. Это не завершает текущие XML-теги.

Забирать документ частями, сохраняя состояние теговСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'items');
xmlwriter_write_element($w, 'item', 'A');
$first = xmlwriter_output_memory($w);
xmlwriter_write_element($w, 'item', 'B');
xmlwriter_end_element($w);
$second = xmlwriter_output_memory($w);
echo $first . $second, "
";
Ожидаемый результат
<items><item>A</item><item>B</item></items>

Точка соединяет строки. Здесь две части собраны для наглядности; при большой выгрузке отправляйте каждую в приёмник сразу, иначе общее накопление всё равно потребует память.

Соседние операции: XMLWriter::flush(), XMLWriter::openMemory().

xmlwriter_output_memoryПолучить накопленный XML как строку из режима памяти.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_output_memory(XMLWriter $writer, bool $flush = true): string

Получить накопленный XML как строку из режима памяти.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$flushtrue — вернуть и очистить накопление; false — вернуть копию, оставив содержимое.

Всегда string. Вызов проталкивает внутренний буфер writer в память, но не закрывает структуру документа. Для URI/потока не читает файл обратно: в PHP 8.5.11 возвращает пустую строку. Не путайте очистку буфера с openMemory: состояние незакрытых элементов сохраняется.

string после двоеточия означает строку. Пустая строка — допустимый результат для пустого буфера, а не автоматический признак ошибки. Получение строки и её вывод через echo — разные действия.

Другая форма вызова с тем же смыслом: XMLWriter::outputMemory(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Буфер содержит <sku>A</sku>
  2. outputMemory(false) возвращает копию и сохраняет буфер
  3. outputMemory(true) возвращает содержимое и очищает накопление
Посмотреть буфер, не забирая егоСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('sku', 'A');
echo $w->outputMemory(false), "\n";
echo $w->outputMemory(), "\n";
var_dump($w->outputMemory());
Ожидаемый результат
<sku>A</sku>
<sku>A</sku>
string(0) ""

false сохраняет уже полученную строку в буфере; стандартное true забирает и очищает её. Третий вызов видит пустой буфер. Это не завершает текущие XML-теги.

Забирать документ частями, сохраняя состояние теговСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'items');
xmlwriter_write_element($w, 'item', 'A');
$first = xmlwriter_output_memory($w);
xmlwriter_write_element($w, 'item', 'B');
xmlwriter_end_element($w);
$second = xmlwriter_output_memory($w);
echo $first . $second, "
";
Ожидаемый результат
<items><item>A</item><item>B</item></items>

Точка соединяет строки. Здесь две части собраны для наглядности; при большой выгрузке отправляйте каждую в приёмник сразу, иначе общее накопление всё равно потребует память.

Соседние операции: XMLWriter::flush(), XMLWriter::openMemory().

XMLWriter::flushПротолкнуть накопленные байты в выбранный приёмник и получить результат сброса.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::flush(bool $empty = true): string|int

Протолкнуть накопленные байты в выбранный приёмник и получить результат сброса.

ПараметрЧто передать
$emptyДля памяти: true очищает накопленную строку после возврата, false сохраняет её. Для URI/потока это не механизм повторного чтения.

Режим памяти возвращает string; URI/поток — int с результатом libxml (число записанных при сбросе байтов, при отказе отрицательное значение). С PHP 8.0 false больше не возвращается. flush не закрывает теги и не обещает физическую запись на диск уровня fsync, доставку HTTP-клиенту или завершение прокси-буферизации.

string|int означает строку или целое число в зависимости от приёмника. Проверка должна учитывать этот режим: пустая строка и ноль могут быть допустимым результатом, поэтому простое if (!$result) не подходит.

Другая форма вызова с тем же смыслом: xmlwriter_flush(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Writer накопил <sku>A</sku>
  2. В памяти flush возвращает строку; у URI пишет её в приёмник
  3. Тип результата различается: string или число записанных байтов
flush в памяти возвращает текстСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('ready', 'yes');
$xml = $w->flush(false);
echo $xml, "\n";
echo $w->flush(), "\n";
Ожидаемый результат
<ready>yes</ready>
<ready>yes</ready>

Оба вызова видят один текст, потому что первый оставил буфер. echo результата здесь уместен именно из-за режима памяти.

flush в файле возвращает число, а не документСамостоятельный пример
<?php
$w = xmlwriter_open_uri(__DIR__ . '/export.xml');
if ($w === false) {
    throw new RuntimeException('Не открыт файл');
}
xmlwriter_write_element($w, 'sku', 'A');
$bytes = xmlwriter_flush($w);
echo is_int($bytes) && $bytes >= 0 ? "Сброс выполнен
" : "Ошибка записи
";
unset($w);
echo file_get_contents(__DIR__ . '/export.xml'), "
";
Ожидаемый результат
Сброс выполнен
<sku>A</sku>

Счётчик относится к этому сбросу; ранее часть вывода уже могла уйти в приёмник. Не используйте его как общий размер файла. Отрицательное значение означает ошибку libxml; ноль не обязательно ошибка.

Соседние операции: XMLWriter::outputMemory(), XMLWriter::endDocument(), XMLWriter::openUri().

xmlwriter_flushПротолкнуть накопленные байты в выбранный приёмник и получить результат сброса.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_flush(XMLWriter $writer, bool $empty = true): string|int

Протолкнуть накопленные байты в выбранный приёмник и получить результат сброса.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$emptyДля памяти: true очищает накопленную строку после возврата, false сохраняет её. Для URI/потока это не механизм повторного чтения.

Режим памяти возвращает string; URI/поток — int с результатом libxml (число записанных при сбросе байтов, при отказе отрицательное значение). С PHP 8.0 false больше не возвращается. flush не закрывает теги и не обещает физическую запись на диск уровня fsync, доставку HTTP-клиенту или завершение прокси-буферизации.

string|int означает строку или целое число в зависимости от приёмника. Проверка должна учитывать этот режим: пустая строка и ноль могут быть допустимым результатом, поэтому простое if (!$result) не подходит.

Другая форма вызова с тем же смыслом: XMLWriter::flush(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Writer накопил <sku>A</sku>
  2. В памяти flush возвращает строку; у URI пишет её в приёмник
  3. Тип результата различается: string или число записанных байтов
flush в памяти возвращает текстСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('ready', 'yes');
$xml = $w->flush(false);
echo $xml, "\n";
echo $w->flush(), "\n";
Ожидаемый результат
<ready>yes</ready>
<ready>yes</ready>

Оба вызова видят один текст, потому что первый оставил буфер. echo результата здесь уместен именно из-за режима памяти.

flush в файле возвращает число, а не документСамостоятельный пример
<?php
$w = xmlwriter_open_uri(__DIR__ . '/export.xml');
if ($w === false) {
    throw new RuntimeException('Не открыт файл');
}
xmlwriter_write_element($w, 'sku', 'A');
$bytes = xmlwriter_flush($w);
echo is_int($bytes) && $bytes >= 0 ? "Сброс выполнен
" : "Ошибка записи
";
unset($w);
echo file_get_contents(__DIR__ . '/export.xml'), "
";
Ожидаемый результат
Сброс выполнен
<sku>A</sku>

Счётчик относится к этому сбросу; ранее часть вывода уже могла уйти в приёмник. Не используйте его как общий размер файла. Отрицательное значение означает ошибку libxml; ноль не обязательно ошибка.

Соседние операции: XMLWriter::outputMemory(), XMLWriter::endDocument(), XMLWriter::openUri().

XMLWriter::setIndentВключить или выключить автоматические отступы при записи.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::setIndent(bool $enable): bool

Включить или выключить автоматические отступы при записи.

ПараметрЧто передать
$enabletrue включает, false выключает отступы.

Возвращает bool. Настройка сбрасывается при открытии writer. Для смешанного содержимого отступы могут добавлять значимые пробелы перед вложенными элементами и переносы: такие документы лучше писать без форматирования.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_set_indent(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт буфер и включён setIndent(true)
  2. order содержит дочерний id
  3. Writer добавляет отступ перед id и переносы между элементами
Отступы для выгрузки с дочерними элементамиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->setIndent(true);
$w->setIndentString('  ');
$w->startElement('order');
$w->writeElement('id', '42');
$w->endElement();
echo $w->outputMemory();
Ожидаемый результат
<order>
  <id>42</id>
</order>

Настройки задают после открытия writer. Два пробела повторяются на каждом уровне; переносы строк входят в XML-строку.

Смешанный текст: оставить автоматические отступы выключеннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_set_indent($w, false);
xmlwriter_start_element($w, 'p');
xmlwriter_text($w, 'Buy ');
xmlwriter_write_element($w, 'b', 'today');
xmlwriter_text($w, '!');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<p>Buy <b>today</b>!</p>

Текст и вложенный элемент идут вперемешку. Автоматические пробелы и переносы изменили бы текстовое содержимое. Оформление XML не всегда безобидно.

Соседние операции: XMLWriter::setIndentString(), XMLWriter::openMemory().

xmlwriter_set_indentВключить или выключить автоматические отступы при записи.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_set_indent(XMLWriter $writer, bool $enable): bool

Включить или выключить автоматические отступы при записи.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$enabletrue включает, false выключает отступы.

Возвращает bool. Настройка сбрасывается при открытии writer. Для смешанного содержимого отступы могут добавлять значимые пробелы перед вложенными элементами и переносы: такие документы лучше писать без форматирования.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::setIndent(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт буфер и включён setIndent(true)
  2. order содержит дочерний id
  3. Writer добавляет отступ перед id и переносы между элементами
Отступы для выгрузки с дочерними элементамиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->setIndent(true);
$w->setIndentString('  ');
$w->startElement('order');
$w->writeElement('id', '42');
$w->endElement();
echo $w->outputMemory();
Ожидаемый результат
<order>
  <id>42</id>
</order>

Настройки задают после открытия writer. Два пробела повторяются на каждом уровне; переносы строк входят в XML-строку.

Смешанный текст: оставить автоматические отступы выключеннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_set_indent($w, false);
xmlwriter_start_element($w, 'p');
xmlwriter_text($w, 'Buy ');
xmlwriter_write_element($w, 'b', 'today');
xmlwriter_text($w, '!');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<p>Buy <b>today</b>!</p>

Текст и вложенный элемент идут вперемешку. Автоматические пробелы и переносы изменили бы текстовое содержимое. Оформление XML не всегда безобидно.

Соседние операции: XMLWriter::setIndentString(), XMLWriter::openMemory().

XMLWriter::setIndentStringЗадать пробельную строку, повторяемую для отступа каждого уровня.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::setIndentString(string $indentation): bool

Задать пробельную строку, повторяемую для отступа каждого уровня.

ПараметрЧто передать
$indentationОбычно два/четыре пробела либо табуляция; строка, а не количество пробелов.

Возвращает bool. Само задание строки не включает форматирование: нужно setIndent(true). При новом открытии настройка сбрасывается. Форматирование меняет байты, поэтому важно для сравнения файлов и подписей; XML-подпись требует своих правил каноникализации.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_set_indent_string(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. setIndent(true) включает оформление
  2. Строка из четырёх пробелов задаёт один уровень
  3. Дочерний qty получает один отступ относительно stock
Использовать четыре пробела на уровеньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->setIndent(true);
$w->setIndentString('    ');
$w->startElement('stock');
$w->writeElement('qty', '2');
$w->endElement();
echo $w->outputMemory();
Ожидаемый результат
<stock>
    <qty>2</qty>
</stock>

setIndentString задаёт единицу отступа; отдельно нужно включить setIndent(true). Выбирайте пробельную строку, а не декоративные символы.

Табуляция в файле для согласованного формата обменаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_set_indent($w, true);
xmlwriter_set_indent_string($w, "	");
xmlwriter_start_element($w, 'stock');
xmlwriter_write_element($w, 'qty', '2');
xmlwriter_end_element($w);
echo str_replace("	", '[TAB]', xmlwriter_output_memory($w));
Ожидаемый результат
<stock>
[TAB]<qty>2</qty>
</stock>

Двойные кавычки превращают \t в символ табуляции. str_replace здесь только делает невидимый символ заметным в ожидаемом выводе; сам XML содержит табуляцию.

Соседние операции: XMLWriter::setIndent(), XMLWriter::startElement().

xmlwriter_set_indent_stringЗадать пробельную строку, повторяемую для отступа каждого уровня.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_set_indent_string(XMLWriter $writer, string $indentation): bool

Задать пробельную строку, повторяемую для отступа каждого уровня.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$indentationОбычно два/четыре пробела либо табуляция; строка, а не количество пробелов.

Возвращает bool. Само задание строки не включает форматирование: нужно setIndent(true). При новом открытии настройка сбрасывается. Форматирование меняет байты, поэтому важно для сравнения файлов и подписей; XML-подпись требует своих правил каноникализации.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::setIndentString(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. setIndent(true) включает оформление
  2. Строка из четырёх пробелов задаёт один уровень
  3. Дочерний qty получает один отступ относительно stock
Использовать четыре пробела на уровеньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->setIndent(true);
$w->setIndentString('    ');
$w->startElement('stock');
$w->writeElement('qty', '2');
$w->endElement();
echo $w->outputMemory();
Ожидаемый результат
<stock>
    <qty>2</qty>
</stock>

setIndentString задаёт единицу отступа; отдельно нужно включить setIndent(true). Выбирайте пробельную строку, а не декоративные символы.

Табуляция в файле для согласованного формата обменаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_set_indent($w, true);
xmlwriter_set_indent_string($w, "	");
xmlwriter_start_element($w, 'stock');
xmlwriter_write_element($w, 'qty', '2');
xmlwriter_end_element($w);
echo str_replace("	", '[TAB]', xmlwriter_output_memory($w));
Ожидаемый результат
<stock>
[TAB]<qty>2</qty>
</stock>

Двойные кавычки превращают \t в символ табуляции. str_replace здесь только делает невидимый символ заметным в ожидаемом выводе; сам XML содержит табуляцию.

Соседние операции: XMLWriter::setIndent(), XMLWriter::startElement().

XMLWriter::startDocumentНачать документ с XML-декларации перед корневым элементом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startDocument(?string $version = "1.0", ?string $encoding = null, ?string $standalone = null): bool

Начать документ с XML-декларации перед корневым элементом.

ПараметрЧто передать
$versionВерсия XML, обычно 1.0; null использует стандартное значение libxml.
$encodingКодировка выходного XML; null не добавляет явное encoding. Исходные PHP-строки передают в UTF-8.
$standaloneyes, no либо null — без атрибута standalone.

Возвращает bool. Сначала открывают приёмник, затем начинают документ. Уже выведенный HTML/BOM/отладочный текст перед декларацией испортит HTTP XML. Нулевой байт в encoding вызывает ValueError с PHP 8.4. Поддержка выходной кодировки зависит от libxml и его преобразователей.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_document(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. UTF-8 строка «Книга» подготовлена приложением
  2. startDocument пишет XML-декларацию
  3. writeElement создаёт корень title; endDocument завершает документ
Объявить UTF-8 и написать один кореньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDocument('1.0', 'UTF-8');
$w->writeElement('title', 'Книга');
$w->endDocument();
echo $w->outputMemory();
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<title>Книга</title>

XML-декларация относится к формату документа, а не к версии PHP. Ввод текста в XMLWriter должен быть UTF-8; encoding задаёт кодирование выходного документа.

Самодостаточная выгрузка без внешних объявленийСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_document($w, '1.0', 'UTF-8', 'yes');
xmlwriter_write_element($w, 'batch', '12');
xmlwriter_end_document($w);
echo xmlwriter_output_memory($w);
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<batch>12</batch>

standalone — строка yes/no либо null (атрибут отсутствует). yes является утверждением о независимости от внешних объявлений, а не командой отключить сеть.

PHP 8.4: неверное имя кодировки отвергаетсяСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
try {
    $w->startDocument('1.0', "UTF-8\0bad");
} catch (ValueError $error) {
    echo "Кодировка не должна содержать NUL\n";
}
Ожидаемый результат
Кодировка не должна содержать NUL

Нулевой байт в encoding вызывает ValueError с PHP 8.4. Ошибки аргументов нельзя трактовать как обычное false.

Соседние операции: XMLWriter::endDocument(), XMLWriter::writeElement().

xmlwriter_start_documentНачать документ с XML-декларации перед корневым элементом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_document(XMLWriter $writer, ?string $version = "1.0", ?string $encoding = null, ?string $standalone = null): bool

Начать документ с XML-декларации перед корневым элементом.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$versionВерсия XML, обычно 1.0; null использует стандартное значение libxml.
$encodingКодировка выходного XML; null не добавляет явное encoding. Исходные PHP-строки передают в UTF-8.
$standaloneyes, no либо null — без атрибута standalone.

Возвращает bool. Сначала открывают приёмник, затем начинают документ. Уже выведенный HTML/BOM/отладочный текст перед декларацией испортит HTTP XML. Нулевой байт в encoding вызывает ValueError с PHP 8.4. Поддержка выходной кодировки зависит от libxml и его преобразователей.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startDocument(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. UTF-8 строка «Книга» подготовлена приложением
  2. startDocument пишет XML-декларацию
  3. writeElement создаёт корень title; endDocument завершает документ
Объявить UTF-8 и написать один кореньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDocument('1.0', 'UTF-8');
$w->writeElement('title', 'Книга');
$w->endDocument();
echo $w->outputMemory();
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<title>Книга</title>

XML-декларация относится к формату документа, а не к версии PHP. Ввод текста в XMLWriter должен быть UTF-8; encoding задаёт кодирование выходного документа.

Самодостаточная выгрузка без внешних объявленийСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_document($w, '1.0', 'UTF-8', 'yes');
xmlwriter_write_element($w, 'batch', '12');
xmlwriter_end_document($w);
echo xmlwriter_output_memory($w);
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<batch>12</batch>

standalone — строка yes/no либо null (атрибут отсутствует). yes является утверждением о независимости от внешних объявлений, а не командой отключить сеть.

PHP 8.4: неверное имя кодировки отвергаетсяСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
try {
    $w->startDocument('1.0', "UTF-8\0bad");
} catch (ValueError $error) {
    echo "Кодировка не должна содержать NUL\n";
}
Ожидаемый результат
Кодировка не должна содержать NUL

Нулевой байт в encoding вызывает ValueError с PHP 8.4. Ошибки аргументов нельзя трактовать как обычное false.

Соседние операции: XMLWriter::endDocument(), XMLWriter::writeElement().

XMLWriter::endDocumentЗавершить текущий XML-документ после записи его данных.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endDocument(): bool

Завершить текущий XML-документ после записи его данных.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool, закрывает оставшиеся элементы и выполняет финализацию libxml. Не является валидацией всего XML и не освобождает сам PHP-объект. Для URI отдельно проверьте flush и освободите writer; для памяти получите строку.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_document(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. order открыт, id уже записан
  2. endDocument закрывает оставшийся order и завершает документ
  3. outputMemory возвращает законченную строку
Завершить незакрытый кореньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDocument();
$w->startElement('order');
$w->writeElement('id', '42');
$w->endDocument();
echo $w->outputMemory();
Ожидаемый результат
<?xml version="1.0"?>
<order><id>42</id></order>

endDocument закрывает оставшиеся открытые элементы и завершает документ. Это удобно для финализации, но явные пары start/end обычно лучше показывают правильную вложенность.

Завершить экспорт после последовательной записи строкСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_document($w, '1.0', 'UTF-8');
xmlwriter_start_element($w, 'stock');
foreach (['A', 'B'] as $sku) {
    xmlwriter_write_element($w, 'sku', $sku);
}
xmlwriter_end_element($w);
xmlwriter_end_document($w);
echo xmlwriter_output_memory($w);
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<stock><sku>A</sku><sku>B</sku></stock>

foreach повторяет запись для каждого артикула. Один корень объединяет строки. endDocument не проверяет, что артикулы существуют в магазине, и не исправляет ранее вставленный неправильный raw XML.

Соседние операции: XMLWriter::startDocument(), XMLWriter::endElement(), XMLWriter::flush().

xmlwriter_end_documentЗавершить текущий XML-документ после записи его данных.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_document(XMLWriter $writer): bool

Завершить текущий XML-документ после записи его данных.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool, закрывает оставшиеся элементы и выполняет финализацию libxml. Не является валидацией всего XML и не освобождает сам PHP-объект. Для URI отдельно проверьте flush и освободите writer; для памяти получите строку.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endDocument(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. order открыт, id уже записан
  2. endDocument закрывает оставшийся order и завершает документ
  3. outputMemory возвращает законченную строку
Завершить незакрытый кореньСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDocument();
$w->startElement('order');
$w->writeElement('id', '42');
$w->endDocument();
echo $w->outputMemory();
Ожидаемый результат
<?xml version="1.0"?>
<order><id>42</id></order>

endDocument закрывает оставшиеся открытые элементы и завершает документ. Это удобно для финализации, но явные пары start/end обычно лучше показывают правильную вложенность.

Завершить экспорт после последовательной записи строкСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_document($w, '1.0', 'UTF-8');
xmlwriter_start_element($w, 'stock');
foreach (['A', 'B'] as $sku) {
    xmlwriter_write_element($w, 'sku', $sku);
}
xmlwriter_end_element($w);
xmlwriter_end_document($w);
echo xmlwriter_output_memory($w);
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<stock><sku>A</sku><sku>B</sku></stock>

foreach повторяет запись для каждого артикула. Один корень объединяет строки. endDocument не проверяет, что артикулы существуют в магазине, и не исправляет ранее вставленный неправильный raw XML.

Соседние операции: XMLWriter::startDocument(), XMLWriter::endElement(), XMLWriter::flush().

XMLWriter::startElementОткрыть новый XML-элемент для текста, атрибутов и вложенных узлов.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startElement(string $name): bool

Открыть новый XML-элемент для текста, атрибутов и вложенных узлов.

ПараметрЧто передать
$nameИмя элемента, например order. Оно является частью XML-схемы, а не произвольным текстом пользователя.

Возвращает bool. PHP 8 проверяет имя и при недопустимом имени выбрасывает ValueError. Метод оставляет элемент открытым. Атрибуты добавляют до текста/детей; затем закрывают endElement. Для полного простого текстового элемента короче writeElement.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт order
  2. startElement(item) делает item текущим
  3. endElement возвращает запись к order; следующий item будет соседом
Открыть элемент, записать текст и закрыть егоСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('title');
$w->text('Книга');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<title>Книга</title>

startElement начинает новый элемент, а не ищет существующий. endElement без имени завершает последний незакрытый элемент. Пока он открыт, text записывает его содержимое.

Строки заказа: каждый цикл закрывает свой itemСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
foreach (['A' => '2', 'B' => '1'] as $sku => $qty) {
    xmlwriter_start_element($w, 'item');
    xmlwriter_write_attribute($w, 'sku', $sku);
    xmlwriter_write_element($w, 'qty', $qty);
    xmlwriter_end_element($w); // item
}
xmlwriter_end_element($w); // order
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order><item sku="A"><qty>2</qty></item><item sku="B"><qty>1</qty></item></order>

=> связывает ключ с количеством; foreach берёт следующую пару. Закрытие item внутри цикла делает товары соседями. Если закрыть его только после цикла, товары окажутся вложены друг в друга.

Соседние операции: XMLWriter::endElement(), XMLWriter::writeElement(), XMLWriter::startElementNs().

xmlwriter_start_elementОткрыть новый XML-элемент для текста, атрибутов и вложенных узлов.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_element(XMLWriter $writer, string $name): bool

Открыть новый XML-элемент для текста, атрибутов и вложенных узлов.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя элемента, например order. Оно является частью XML-схемы, а не произвольным текстом пользователя.

Возвращает bool. PHP 8 проверяет имя и при недопустимом имени выбрасывает ValueError. Метод оставляет элемент открытым. Атрибуты добавляют до текста/детей; затем закрывают endElement. Для полного простого текстового элемента короче writeElement.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт order
  2. startElement(item) делает item текущим
  3. endElement возвращает запись к order; следующий item будет соседом
Открыть элемент, записать текст и закрыть егоСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('title');
$w->text('Книга');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<title>Книга</title>

startElement начинает новый элемент, а не ищет существующий. endElement без имени завершает последний незакрытый элемент. Пока он открыт, text записывает его содержимое.

Строки заказа: каждый цикл закрывает свой itemСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
foreach (['A' => '2', 'B' => '1'] as $sku => $qty) {
    xmlwriter_start_element($w, 'item');
    xmlwriter_write_attribute($w, 'sku', $sku);
    xmlwriter_write_element($w, 'qty', $qty);
    xmlwriter_end_element($w); // item
}
xmlwriter_end_element($w); // order
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order><item sku="A"><qty>2</qty></item><item sku="B"><qty>1</qty></item></order>

=> связывает ключ с количеством; foreach берёт следующую пару. Закрытие item внутри цикла делает товары соседями. Если закрыть его только после цикла, товары окажутся вложены друг в друга.

Соседние операции: XMLWriter::endElement(), XMLWriter::writeElement(), XMLWriter::startElementNs().

XMLWriter::endElementЗакрыть последний открытый элемент и продолжить на уровне родителя.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endElement(): bool

Закрыть последний открытый элемент и продолжить на уровне родителя.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Имя элемента не передают: метод использует внутренний стек. Пустой элемент может стать <note/>. Для обязательного отдельного закрывающего тега применяется fullEndElement. Лишнее закрытие или неправильный контекст может вернуть false.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Текущий элемент item внутри order
  2. endElement закрывает item
  3. Новая запись пойдёт внутрь order, а не item
Пустой элемент допускает короткую формуСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('note');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<note/>

Когда текста и детей нет, endElement может записать самозакрывающийся тег. В XML <note/> и <note></note> означают пустой элемент.

Строки заказа: каждый цикл закрывает свой itemСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
foreach (['A' => '2', 'B' => '1'] as $sku => $qty) {
    xmlwriter_start_element($w, 'item');
    xmlwriter_write_attribute($w, 'sku', $sku);
    xmlwriter_write_element($w, 'qty', $qty);
    xmlwriter_end_element($w); // item
}
xmlwriter_end_element($w); // order
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order><item sku="A"><qty>2</qty></item><item sku="B"><qty>1</qty></item></order>

=> связывает ключ с количеством; foreach берёт следующую пару. Закрытие item внутри цикла делает товары соседями. Если закрыть его только после цикла, товары окажутся вложены друг в друга.

Соседние операции: XMLWriter::startElement(), XMLWriter::fullEndElement(), XMLWriter::endDocument().

xmlwriter_end_elementЗакрыть последний открытый элемент и продолжить на уровне родителя.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_element(XMLWriter $writer): bool

Закрыть последний открытый элемент и продолжить на уровне родителя.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Имя элемента не передают: метод использует внутренний стек. Пустой элемент может стать <note/>. Для обязательного отдельного закрывающего тега применяется fullEndElement. Лишнее закрытие или неправильный контекст может вернуть false.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Текущий элемент item внутри order
  2. endElement закрывает item
  3. Новая запись пойдёт внутрь order, а не item
Пустой элемент допускает короткую формуСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('note');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<note/>

Когда текста и детей нет, endElement может записать самозакрывающийся тег. В XML <note/> и <note></note> означают пустой элемент.

Строки заказа: каждый цикл закрывает свой itemСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
foreach (['A' => '2', 'B' => '1'] as $sku => $qty) {
    xmlwriter_start_element($w, 'item');
    xmlwriter_write_attribute($w, 'sku', $sku);
    xmlwriter_write_element($w, 'qty', $qty);
    xmlwriter_end_element($w); // item
}
xmlwriter_end_element($w); // order
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order><item sku="A"><qty>2</qty></item><item sku="B"><qty>1</qty></item></order>

=> связывает ключ с количеством; foreach берёт следующую пару. Закрытие item внутри цикла делает товары соседями. Если закрыть его только после цикла, товары окажутся вложены друг в друга.

Соседние операции: XMLWriter::startElement(), XMLWriter::fullEndElement(), XMLWriter::endDocument().

XMLWriter::fullEndElementЗакрыть элемент отдельным завершающим тегом, даже если он пуст.

PHP 5.2.0; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::fullEndElement(): bool

Закрыть элемент отдельным завершающим тегом, даже если он пуст.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Работает с текущим открытым элементом и не принимает его имя. XML-смысл пустого элемента сохраняется; меняется только представление. Доступен с PHP 5.2.0.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_full_end_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт note без содержимого
  2. fullEndElement пишет отдельный закрывающий тег
  3. Результат <note></note> вместо короткой формы
Пустое поле для системы, требующей отдельный закрывающий тегСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('note');
$w->fullEndElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<note></note>

Метод меняет форму записи пустого элемента; содержимое не появляется. Это нужно для ограничений конкретного получателя, а не потому, что короткая форма неправильная.

Единая форма пустого и заполненного поляСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'contacts');
foreach (['', 'desk@example.test'] as $email) {
    xmlwriter_start_element($w, 'email');
    if ($email !== '') {
        xmlwriter_text($w, $email);
    }
    xmlwriter_full_end_element($w);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<contacts><email></email><email>desk@example.test</email></contacts>

Условие !== сравнивает строго. Даже когда текст не записывался, fullEndElement формирует пару тегов. Это не превращает пустое поле в null по бизнес-правилам.

Соседние операции: XMLWriter::endElement(), XMLWriter::writeElement().

xmlwriter_full_end_elementЗакрыть элемент отдельным завершающим тегом, даже если он пуст.

PHP 5.2.0; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_full_end_element(XMLWriter $writer): bool

Закрыть элемент отдельным завершающим тегом, даже если он пуст.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Работает с текущим открытым элементом и не принимает его имя. XML-смысл пустого элемента сохраняется; меняется только представление. Доступен с PHP 5.2.0.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::fullEndElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт note без содержимого
  2. fullEndElement пишет отдельный закрывающий тег
  3. Результат <note></note> вместо короткой формы
Пустое поле для системы, требующей отдельный закрывающий тегСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('note');
$w->fullEndElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<note></note>

Метод меняет форму записи пустого элемента; содержимое не появляется. Это нужно для ограничений конкретного получателя, а не потому, что короткая форма неправильная.

Единая форма пустого и заполненного поляСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'contacts');
foreach (['', 'desk@example.test'] as $email) {
    xmlwriter_start_element($w, 'email');
    if ($email !== '') {
        xmlwriter_text($w, $email);
    }
    xmlwriter_full_end_element($w);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<contacts><email></email><email>desk@example.test</email></contacts>

Условие !== сравнивает строго. Даже когда текст не записывался, fullEndElement формирует пару тегов. Это не превращает пустое поле в null по бизнес-правилам.

Соседние операции: XMLWriter::endElement(), XMLWriter::writeElement().

XMLWriter::writeElementЗаписать и сразу закрыть элемент с обычным текстом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeElement(string $name, ?string $content = null): bool

Записать и сразу закрыть элемент с обычным текстом.

ПараметрЧто передать
$nameИмя создаваемого элемента.
$contentНеэкранированный текст; null/пропуск — пустой элемент без текстового содержимого.

Возвращает bool. Не создаёт вложенные узлы из строки <b>...: строка будет текстом. Недопустимое имя вызывает ValueError в PHP 8. Для узла с атрибутами/детьми используйте startElement и отдельные операции.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Исходное название Paper & pen
  2. writeElement пишет title с экранированным текстом
  3. Результат <title>Paper &amp; pen</title>
Одна операция для имени и обычного текстаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('title', 'Paper & pen');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<title>Paper &amp; pen</title>

Передайте исходную строку с &, а не заранее подготовленное &amp;. Экранирование выполняет writer; двойное экранирование испортит смысл текста.

Отсутствующее содержимое и пустая строкаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'fields');
xmlwriter_write_element($w, 'omitted');
xmlwriter_write_element($w, 'nullValue', null);
xmlwriter_write_element($w, 'emptyText', '');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<fields><omitted/><nullValue/><emptyText></emptyText></fields>

null/пропущенный аргумент дают короткую форму; пустая строка — текстовый вызов с пустым содержимым. Для XML это пустые элементы; отсутствие поля нужно выражать отсутствием самого элемента, если так договорились стороны.

Соседние операции: XMLWriter::startElement(), XMLWriter::text(), XMLWriter::writeRaw().

xmlwriter_write_elementЗаписать и сразу закрыть элемент с обычным текстом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_element(XMLWriter $writer, string $name, ?string $content = null): bool

Записать и сразу закрыть элемент с обычным текстом.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя создаваемого элемента.
$contentНеэкранированный текст; null/пропуск — пустой элемент без текстового содержимого.

Возвращает bool. Не создаёт вложенные узлы из строки <b>...: строка будет текстом. Недопустимое имя вызывает ValueError в PHP 8. Для узла с атрибутами/детьми используйте startElement и отдельные операции.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Исходное название Paper & pen
  2. writeElement пишет title с экранированным текстом
  3. Результат <title>Paper &amp; pen</title>
Одна операция для имени и обычного текстаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeElement('title', 'Paper & pen');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<title>Paper &amp; pen</title>

Передайте исходную строку с &, а не заранее подготовленное &amp;. Экранирование выполняет writer; двойное экранирование испортит смысл текста.

Отсутствующее содержимое и пустая строкаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'fields');
xmlwriter_write_element($w, 'omitted');
xmlwriter_write_element($w, 'nullValue', null);
xmlwriter_write_element($w, 'emptyText', '');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<fields><omitted/><nullValue/><emptyText></emptyText></fields>

null/пропущенный аргумент дают короткую форму; пустая строка — текстовый вызов с пустым содержимым. Для XML это пустые элементы; отсутствие поля нужно выражать отсутствием самого элемента, если так договорились стороны.

Соседние операции: XMLWriter::startElement(), XMLWriter::text(), XMLWriter::writeRaw().

XMLWriter::startAttributeНачать атрибут, значение которого удобнее записать несколькими частями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startAttribute(string $name): bool

Начать атрибут, значение которого удобнее записать несколькими частями.

ПараметрЧто передать
$nameИмя атрибута текущего открытого элемента.

Возвращает bool. Вызов допустим в начале элемента до его текста/детей. Неверное имя — ValueError в PHP 8. Не начинайте второй атрибут до завершения первого. Готовое значение проще передать writeAttribute.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_attribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт тег item
  2. startAttribute(label) переводит text внутрь значения атрибута
  3. endAttribute возвращает writer к открытому тегу item
Собрать значение атрибута из частейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttribute('label');
$w->text('A');
$w->text(' & B');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="A &amp; B"/>

startAttribute открывает значение; text пишет внутрь кавычек; endAttribute завершает именно атрибут. Экранирование зависит от состояния writer.

Сначала составной идентификатор, затем текст элементаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_start_attribute($w, 'id');
xmlwriter_text($w, 'SHOP-');
xmlwriter_text($w, '42');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'ready');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order id="SHOP-42">ready</order>

После endAttribute текст ready становится содержимым order, а не продолжением его идентификатора. Это практическая граница состояния, которую удобно видеть прямо в результате.

Соседние операции: XMLWriter::endAttribute(), XMLWriter::writeAttribute(), XMLWriter::startAttributeNs().

xmlwriter_start_attributeНачать атрибут, значение которого удобнее записать несколькими частями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_attribute(XMLWriter $writer, string $name): bool

Начать атрибут, значение которого удобнее записать несколькими частями.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя атрибута текущего открытого элемента.

Возвращает bool. Вызов допустим в начале элемента до его текста/детей. Неверное имя — ValueError в PHP 8. Не начинайте второй атрибут до завершения первого. Готовое значение проще передать writeAttribute.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startAttribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт тег item
  2. startAttribute(label) переводит text внутрь значения атрибута
  3. endAttribute возвращает writer к открытому тегу item
Собрать значение атрибута из частейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttribute('label');
$w->text('A');
$w->text(' & B');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="A &amp; B"/>

startAttribute открывает значение; text пишет внутрь кавычек; endAttribute завершает именно атрибут. Экранирование зависит от состояния writer.

Сначала составной идентификатор, затем текст элементаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_start_attribute($w, 'id');
xmlwriter_text($w, 'SHOP-');
xmlwriter_text($w, '42');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'ready');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order id="SHOP-42">ready</order>

После endAttribute текст ready становится содержимым order, а не продолжением его идентификатора. Это практическая граница состояния, которую удобно видеть прямо в результате.

Соседние операции: XMLWriter::endAttribute(), XMLWriter::writeAttribute(), XMLWriter::startAttributeNs().

XMLWriter::endAttributeЗакончить текущее значение атрибута перед следующим атрибутом или текстом элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endAttribute(): bool

Закончить текущее значение атрибута перед следующим атрибутом или текстом элемента.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Не закрывает элемент. Если атрибут не открыт, операция может вернуть false. Не нужно вручную вставлять завершающую кавычку: её сформирует writer.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_attribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В order открыт атрибут id со значением SHOP-42
  2. endAttribute завершает значение атрибута
  3. Следующий text записывает ready уже внутрь order
Собрать значение атрибута из частейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttribute('label');
$w->text('A');
$w->text(' & B');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="A &amp; B"/>

startAttribute открывает значение; text пишет внутрь кавычек; endAttribute завершает именно атрибут. Экранирование зависит от состояния writer.

Сначала составной идентификатор, затем текст элементаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_start_attribute($w, 'id');
xmlwriter_text($w, 'SHOP-');
xmlwriter_text($w, '42');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'ready');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order id="SHOP-42">ready</order>

После endAttribute текст ready становится содержимым order, а не продолжением его идентификатора. Это практическая граница состояния, которую удобно видеть прямо в результате.

Соседние операции: XMLWriter::startAttribute(), XMLWriter::startAttributeNs(), XMLWriter::writeAttribute().

xmlwriter_end_attributeЗакончить текущее значение атрибута перед следующим атрибутом или текстом элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_attribute(XMLWriter $writer): bool

Закончить текущее значение атрибута перед следующим атрибутом или текстом элемента.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Не закрывает элемент. Если атрибут не открыт, операция может вернуть false. Не нужно вручную вставлять завершающую кавычку: её сформирует writer.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endAttribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В order открыт атрибут id со значением SHOP-42
  2. endAttribute завершает значение атрибута
  3. Следующий text записывает ready уже внутрь order
Собрать значение атрибута из частейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttribute('label');
$w->text('A');
$w->text(' & B');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="A &amp; B"/>

startAttribute открывает значение; text пишет внутрь кавычек; endAttribute завершает именно атрибут. Экранирование зависит от состояния writer.

Сначала составной идентификатор, затем текст элементаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_start_attribute($w, 'id');
xmlwriter_text($w, 'SHOP-');
xmlwriter_text($w, '42');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'ready');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<order id="SHOP-42">ready</order>

После endAttribute текст ready становится содержимым order, а не продолжением его идентификатора. Это практическая граница состояния, которую удобно видеть прямо в результате.

Соседние операции: XMLWriter::startAttribute(), XMLWriter::startAttributeNs(), XMLWriter::writeAttribute().

XMLWriter::writeAttributeЗаписать готовый атрибут внутри ещё открытого начального тега.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeAttribute(string $name, string $value): bool

Записать готовый атрибут внутри ещё открытого начального тега.

ПараметрЧто передать
$nameИмя атрибута.
$valueИсходная строка значения; кавычки/& не нужно заранее экранировать.

Возвращает bool. После текста или первого дочернего элемента возвращает false. Имя проверяется и в PHP 8 может вызвать ValueError. Повторяющиеся одноимённые атрибуты недопустимы в XML: не используйте writer как хранилище с перезаписью ключа.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_attribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт начальный тег item
  2. writeAttribute добавляет label с кавычками и &
  3. Writer экранирует значение до перехода к содержимому
Сохранить кавычки и амперсанд в названииСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->writeAttribute('label', 'Set "A" & pen');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="Set &quot;A&quot; &amp; pen"/>

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

Атрибут после дочернего элемента уже опоздалСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'total', '499');
var_dump(xmlwriter_write_attribute($w, 'id', '42'));
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
bool(false)
<order><total>499</total></order>

Нельзя вернуться назад и дополнить уже начатую часть вывода. Исправление — вычислить атрибуты до записи текста/детей; если нужна произвольная правка готового дерева, подходит DOM.

Соседние операции: XMLWriter::startAttribute(), XMLWriter::writeAttributeNs(), XMLWriter::startElement().

xmlwriter_write_attributeЗаписать готовый атрибут внутри ещё открытого начального тега.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_attribute(XMLWriter $writer, string $name, string $value): bool

Записать готовый атрибут внутри ещё открытого начального тега.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя атрибута.
$valueИсходная строка значения; кавычки/& не нужно заранее экранировать.

Возвращает bool. После текста или первого дочернего элемента возвращает false. Имя проверяется и в PHP 8 может вызвать ValueError. Повторяющиеся одноимённые атрибуты недопустимы в XML: не используйте writer как хранилище с перезаписью ключа.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeAttribute(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт начальный тег item
  2. writeAttribute добавляет label с кавычками и &
  3. Writer экранирует значение до перехода к содержимому
Сохранить кавычки и амперсанд в названииСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->writeAttribute('label', 'Set "A" & pen');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item label="Set &quot;A&quot; &amp; pen"/>

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

Атрибут после дочернего элемента уже опоздалСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'total', '499');
var_dump(xmlwriter_write_attribute($w, 'id', '42'));
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
bool(false)
<order><total>499</total></order>

Нельзя вернуться назад и дополнить уже начатую часть вывода. Исправление — вычислить атрибуты до записи текста/детей; если нужна произвольная правка готового дерева, подходит DOM.

Соседние операции: XMLWriter::startAttribute(), XMLWriter::writeAttributeNs(), XMLWriter::startElement().

XMLWriter::startElementNsНачать элемент, связанный с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startElementNs(?string $prefix, string $name, ?string $namespace): bool

Начать элемент, связанный с XML-пространством имён.

ПараметрЧто передать
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.

Возвращает bool; неправильное имя — ValueError в PHP 8. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_element_ns(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Связь s → urn:shop:shipping объявляется у order
  2. Имя s:id использует тот же URI без повторного xmlns
  3. Получатель различает элементы по URI и локальному имени, а не по букве s
Заказ в пространстве службы доставкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs('s', 'order', 'urn:shop:shipping');
$w->writeElementNs('s', 'id', null, '42');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<s:order xmlns:s="urn:shop:shipping"><s:id>42</s:id></s:order>

Корень объявляет префикс s. Дочерний элемент передаёт null вместо URI, потому что использует уже объявленную связь. null не означает удалить namespace из имени с префиксом.

Пространство по умолчанию без префиксаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element_ns($w, null, 'catalog', 'urn:shop:catalog');
xmlwriter_write_element_ns($w, null, 'sku', null, 'A');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<catalog xmlns="urn:shop:catalog"><sku>A</sku></catalog>

Дочерний непрефиксный элемент наследует default namespace. Выключение пространства требует явного xmlns=""; простое null не отменяет наследование XML.

Соседние операции: XMLWriter::writeElementNs(), XMLWriter::endElement(), XMLWriter::writeAttributeNs().

xmlwriter_start_element_nsНачать элемент, связанный с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_element_ns(XMLWriter $writer, ?string $prefix, string $name, ?string $namespace): bool

Начать элемент, связанный с XML-пространством имён.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.

Возвращает bool; неправильное имя — ValueError в PHP 8. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startElementNs(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Связь s → urn:shop:shipping объявляется у order
  2. Имя s:id использует тот же URI без повторного xmlns
  3. Получатель различает элементы по URI и локальному имени, а не по букве s
Заказ в пространстве службы доставкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs('s', 'order', 'urn:shop:shipping');
$w->writeElementNs('s', 'id', null, '42');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<s:order xmlns:s="urn:shop:shipping"><s:id>42</s:id></s:order>

Корень объявляет префикс s. Дочерний элемент передаёт null вместо URI, потому что использует уже объявленную связь. null не означает удалить namespace из имени с префиксом.

Пространство по умолчанию без префиксаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element_ns($w, null, 'catalog', 'urn:shop:catalog');
xmlwriter_write_element_ns($w, null, 'sku', null, 'A');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<catalog xmlns="urn:shop:catalog"><sku>A</sku></catalog>

Дочерний непрефиксный элемент наследует default namespace. Выключение пространства требует явного xmlns=""; простое null не отменяет наследование XML.

Соседние операции: XMLWriter::writeElementNs(), XMLWriter::endElement(), XMLWriter::writeAttributeNs().

XMLWriter::writeElementNsЗаписать полный текстовый элемент с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeElementNs(?string $prefix, string $name, ?string $namespace, ?string $content = null): bool

Записать полный текстовый элемент с XML-пространством имён.

ПараметрЧто передать
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.
$contentИсходный текст; null/пропуск даёт пустой элемент.

Возвращает bool. Текст экранируется, готовая вложенная разметка из него не создаётся. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_element_ns(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. У родителя объявлено s → urn:shop:shipping
  2. writeElementNs(s,id,null,42) использует эту связь
  3. Записывается s:id с текстом 42 без нового объявления
Заказ в пространстве службы доставкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs('s', 'order', 'urn:shop:shipping');
$w->writeElementNs('s', 'id', null, '42');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<s:order xmlns:s="urn:shop:shipping"><s:id>42</s:id></s:order>

Корень объявляет префикс s. Дочерний элемент передаёт null вместо URI, потому что использует уже объявленную связь. null не означает удалить namespace из имени с префиксом.

Пространство по умолчанию без префиксаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element_ns($w, null, 'catalog', 'urn:shop:catalog');
xmlwriter_write_element_ns($w, null, 'sku', null, 'A');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<catalog xmlns="urn:shop:catalog"><sku>A</sku></catalog>

Дочерний непрефиксный элемент наследует default namespace. Выключение пространства требует явного xmlns=""; простое null не отменяет наследование XML.

Соседние операции: XMLWriter::startElementNs(), XMLWriter::writeElement(), XMLWriter::writeAttributeNs().

xmlwriter_write_element_nsЗаписать полный текстовый элемент с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_element_ns(XMLWriter $writer, ?string $prefix, string $name, ?string $namespace, ?string $content = null): bool

Записать полный текстовый элемент с XML-пространством имён.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.
$contentИсходный текст; null/пропуск даёт пустой элемент.

Возвращает bool. Текст экранируется, готовая вложенная разметка из него не создаётся. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeElementNs(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. У родителя объявлено s → urn:shop:shipping
  2. writeElementNs(s,id,null,42) использует эту связь
  3. Записывается s:id с текстом 42 без нового объявления
Заказ в пространстве службы доставкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs('s', 'order', 'urn:shop:shipping');
$w->writeElementNs('s', 'id', null, '42');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<s:order xmlns:s="urn:shop:shipping"><s:id>42</s:id></s:order>

Корень объявляет префикс s. Дочерний элемент передаёт null вместо URI, потому что использует уже объявленную связь. null не означает удалить namespace из имени с префиксом.

Пространство по умолчанию без префиксаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element_ns($w, null, 'catalog', 'urn:shop:catalog');
xmlwriter_write_element_ns($w, null, 'sku', null, 'A');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<catalog xmlns="urn:shop:catalog"><sku>A</sku></catalog>

Дочерний непрефиксный элемент наследует default namespace. Выключение пространства требует явного xmlns=""; простое null не отменяет наследование XML.

Соседние операции: XMLWriter::startElementNs(), XMLWriter::writeElement(), XMLWriter::writeAttributeNs().

XMLWriter::startAttributeNsНачать значение атрибута с префиксом и namespace, чтобы дописать его частями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startAttributeNs(?string $prefix, string $name, ?string $namespace): bool

Начать значение атрибута с префиксом и namespace, чтобы дописать его частями.

ПараметрЧто передать
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.

Возвращает bool. Только до содержимого элемента; заканчивается endAttribute. prefix допускает null с PHP 8.0; это не способ включить атрибут в default namespace. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_attribute_ns(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт тег item
  2. startAttributeNs связывает s:code с urn:shop:ids
  3. text добавляет A-12; endAttribute завершает значение
Составной атрибут с пространством имёнСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttributeNs('s', 'code', 'urn:shop:ids');
$w->text('A-');
$w->text('12');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item s:code="A-12" xmlns:s="urn:shop:ids"/>

Префикс относится к имени атрибута, значение остаётся обычным текстом. Объявление xmlns:s может выводиться после обычных атрибутов; их порядок не меняет XML-смысл.

Языковая метка в зарезервированном пространстве xmlСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'title');
xmlwriter_start_attribute_ns($w, 'xml', 'lang', null);
xmlwriter_text($w, 'ru');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'Книга');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<title xml:lang="ru">Книга</title>

Префикс xml уже определён стандартом XML namespaces. Не переносите это исключение на произвольный префикс s: его придётся объявить.

Соседние операции: XMLWriter::endAttribute(), XMLWriter::writeAttributeNs(), XMLWriter::startAttribute().

xmlwriter_start_attribute_nsНачать значение атрибута с префиксом и namespace, чтобы дописать его частями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_attribute_ns(XMLWriter $writer, ?string $prefix, string $name, ?string $namespace): bool

Начать значение атрибута с префиксом и namespace, чтобы дописать его частями.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.

Возвращает bool. Только до содержимого элемента; заканчивается endAttribute. prefix допускает null с PHP 8.0; это не способ включить атрибут в default namespace. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startAttributeNs(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт тег item
  2. startAttributeNs связывает s:code с urn:shop:ids
  3. text добавляет A-12; endAttribute завершает значение
Составной атрибут с пространством имёнСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('item');
$w->startAttributeNs('s', 'code', 'urn:shop:ids');
$w->text('A-');
$w->text('12');
$w->endAttribute();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item s:code="A-12" xmlns:s="urn:shop:ids"/>

Префикс относится к имени атрибута, значение остаётся обычным текстом. Объявление xmlns:s может выводиться после обычных атрибутов; их порядок не меняет XML-смысл.

Языковая метка в зарезервированном пространстве xmlСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'title');
xmlwriter_start_attribute_ns($w, 'xml', 'lang', null);
xmlwriter_text($w, 'ru');
xmlwriter_end_attribute($w);
xmlwriter_text($w, 'Книга');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<title xml:lang="ru">Книга</title>

Префикс xml уже определён стандартом XML namespaces. Не переносите это исключение на произвольный префикс s: его придётся объявить.

Соседние операции: XMLWriter::endAttribute(), XMLWriter::writeAttributeNs(), XMLWriter::startAttribute().

XMLWriter::writeAttributeNsЗаписать готовый атрибут с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeAttributeNs(?string $prefix, string $name, ?string $namespace, string $value): bool

Записать готовый атрибут с XML-пространством имён.

ПараметрЧто передать
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.
$valueИсходная строка значения атрибута; она экранируется.

Возвращает bool. Только до текста/детей, иначе отказ. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_attribute_ns(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. item имеет обычный id магазина
  2. writeAttributeNs добавляет crm:id и URI CRM
  3. Оба id существуют как разные XML-имена
Обычный id и id другого пространства — разные атрибутыСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs(null, 'item', 'urn:shop:catalog');
$w->writeAttribute('id', '7');
$w->writeAttributeNs('crm', 'id', 'urn:shop:crm', '90');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item id="7" crm:id="90" xmlns:crm="urn:shop:crm" xmlns="urn:shop:catalog"/>

Обычный id не принадлежит default namespace, crm:id принадлежит URI CRM. Службы могут иметь свои идентификаторы без конфликта локального имени id.

Пометить сохранение пробелов в текстовом полеСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'label');
xmlwriter_write_attribute_ns($w, 'xml', 'space', null, 'preserve');
xmlwriter_text($w, '  A  ');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<label xml:space="preserve">  A  </label>

xml:space сообщает получателю намерение сохранить пробелы; XMLWriter и без него не выполняет trim входной строки.

Соседние операции: XMLWriter::startAttributeNs(), XMLWriter::writeAttribute(), XMLWriter::startElementNs().

xmlwriter_write_attribute_nsЗаписать готовый атрибут с XML-пространством имён.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_attribute_ns(XMLWriter $writer, ?string $prefix, string $name, ?string $namespace, string $value): bool

Записать готовый атрибут с XML-пространством имён.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$prefixКороткий префикс, например s; null — без префикса в имени.
$nameЛокальное имя без префикса, например item.
$namespaceURI пространства имён; null не пишет объявление xmlns. Тогда префикс должен быть уже объявлен в области видимости.
$valueИсходная строка значения атрибута; она экранируется.

Возвращает bool. Только до текста/детей, иначе отказ. URI пространства имён служит идентификатором и сам по себе не скачивается. null для prefix убирает префикс, но при заданном URI элемент может получить default namespace через xmlns. Непрефиксные атрибуты не наследуют default namespace. Для принадлежности атрибута пространству задавайте явный префикс. XMLWriter не ведёт за вас полную проверку области видимости всех префиксов.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeAttributeNs(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. item имеет обычный id магазина
  2. writeAttributeNs добавляет crm:id и URI CRM
  3. Оба id существуют как разные XML-имена
Обычный id и id другого пространства — разные атрибутыСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElementNs(null, 'item', 'urn:shop:catalog');
$w->writeAttribute('id', '7');
$w->writeAttributeNs('crm', 'id', 'urn:shop:crm', '90');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<item id="7" crm:id="90" xmlns:crm="urn:shop:crm" xmlns="urn:shop:catalog"/>

Обычный id не принадлежит default namespace, crm:id принадлежит URI CRM. Службы могут иметь свои идентификаторы без конфликта локального имени id.

Пометить сохранение пробелов в текстовом полеСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'label');
xmlwriter_write_attribute_ns($w, 'xml', 'space', null, 'preserve');
xmlwriter_text($w, '  A  ');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<label xml:space="preserve">  A  </label>

xml:space сообщает получателю намерение сохранить пробелы; XMLWriter и без него не выполняет trim входной строки.

Соседние операции: XMLWriter::startAttributeNs(), XMLWriter::writeAttribute(), XMLWriter::startElementNs().

XMLWriter::textДополнить текущее текстовое содержимое или открытое значение атрибута.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::text(string $content): bool

Дополнить текущее текстовое содержимое или открытое значение атрибута.

ПараметрЧто передать
$contentИсходная UTF-8 строка без предварительного XML-экранирования.

Возвращает bool. В обычном тексте/атрибуте экранирует специальные XML-символы; точная запись кавычек зависит от контекста libxml. В открытых CDATA/комментарии/PI действует контекст такой конструкции: text не превращает запрещённые последовательности в безопасный комментарий или CDATA. Управляющие символы, недопустимые в XML 1.0, и неверную кодировку нужно отклонить/преобразовать согласно договору приложения.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_text(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт description
  2. text получает A < B & C > D как обычную строку
  3. В XML появляются сущности, а получатель восстановит исходные символы
Исходный текст превращается в безопасное XML-содержимоеСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->text('A < B & C > D');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description>A &lt; B &amp; C &gt; D</description>

Сущности — способ записи исходных символов. Не заменяйте их обратно в XML-файле: при разборе получатель сам восстановит текст.

URL с параметрами остаётся одним текстовым значениемСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'url');
xmlwriter_text($w, 'https://shop.example.test/?sku=A&qty=2');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<url>https://shop.example.test/?sku=A&amp;qty=2</url>

Здесь ничего не запрашивается по сети: URL является строкой. &amp; в документе нужен, чтобы получатель увидел обычный & в значении URL.

Соседние операции: XMLWriter::writeElement(), XMLWriter::writeRaw(), XMLWriter::writeCdata().

xmlwriter_textДополнить текущее текстовое содержимое или открытое значение атрибута.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_text(XMLWriter $writer, string $content): bool

Дополнить текущее текстовое содержимое или открытое значение атрибута.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$contentИсходная UTF-8 строка без предварительного XML-экранирования.

Возвращает bool. В обычном тексте/атрибуте экранирует специальные XML-символы; точная запись кавычек зависит от контекста libxml. В открытых CDATA/комментарии/PI действует контекст такой конструкции: text не превращает запрещённые последовательности в безопасный комментарий или CDATA. Управляющие символы, недопустимые в XML 1.0, и неверную кодировку нужно отклонить/преобразовать согласно договору приложения.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::text(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт description
  2. text получает A < B & C > D как обычную строку
  3. В XML появляются сущности, а получатель восстановит исходные символы
Исходный текст превращается в безопасное XML-содержимоеСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->text('A < B & C > D');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description>A &lt; B &amp; C &gt; D</description>

Сущности — способ записи исходных символов. Не заменяйте их обратно в XML-файле: при разборе получатель сам восстановит текст.

URL с параметрами остаётся одним текстовым значениемСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'url');
xmlwriter_text($w, 'https://shop.example.test/?sku=A&qty=2');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<url>https://shop.example.test/?sku=A&amp;qty=2</url>

Здесь ничего не запрашивается по сети: URL является строкой. &amp; в документе нужен, чтобы получатель увидел обычный & в значении URL.

Соседние операции: XMLWriter::writeElement(), XMLWriter::writeRaw(), XMLWriter::writeCdata().

XMLWriter::writeRawВставить уже подготовленную XML-разметку без экранирования.

PHP 5.2.0; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeRaw(string $content): bool

Вставить уже подготовленную XML-разметку без экранирования.

ПараметрЧто передать
$contentДоверенная корректная XML-строка; специальные символы остаются как переданы.

Возвращает bool, но true не означает well-formed результат: writer не проверяет баланс/пространства фрагмента. Значения из формы/БД передавайте text или writeElement. Raw-фрагмент не меняет внутренний стек start/end как последовательность вызовов. Доступен с PHP 5.2.0.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_raw(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Доверенный фрагмент <b>New</b> уже подготовлен
  2. writeRaw вставляет его без экранирования
  3. Внешний description содержит XML-узел b; за корректность отвечает автор фрагмента
Вставить фиксированный доверенный фрагментСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->writeRaw('<b>New</b>');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><b>New</b></description>

Это уже XML-разметка, написанная разработчиком. Writer не экранирует и не разбирает её как дерево; за корректность, namespace и баланс тегов отвечает автор фрагмента.

Повторно использовать XML, созданный своим writerСамостоятельный пример
<?php
$fragment = xmlwriter_open_memory();
$w = xmlwriter_open_memory();
if ($fragment === false || $w === false) {
    throw new RuntimeException('Нет буфера');
}
xmlwriter_write_element($fragment, 'title', 'A & B');
$trustedXml = xmlwriter_output_memory($fragment);
xmlwriter_start_element($w, 'item');
xmlwriter_write_raw($w, $trustedXml);
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<item><title>A &amp; B</title></item>

Вставляем результат контролируемой генерации без XML-декларации, а не произвольный ответ API. text($trustedXml) превратил бы теги в буквальный текст — это другое требование.

Соседние операции: XMLWriter::text(), XMLWriter::writeElement(), XMLWriter::writeCdata().

xmlwriter_write_rawВставить уже подготовленную XML-разметку без экранирования.

PHP 5.2.0; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_raw(XMLWriter $writer, string $content): bool

Вставить уже подготовленную XML-разметку без экранирования.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$contentДоверенная корректная XML-строка; специальные символы остаются как переданы.

Возвращает bool, но true не означает well-formed результат: writer не проверяет баланс/пространства фрагмента. Значения из формы/БД передавайте text или writeElement. Raw-фрагмент не меняет внутренний стек start/end как последовательность вызовов. Доступен с PHP 5.2.0.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeRaw(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Доверенный фрагмент <b>New</b> уже подготовлен
  2. writeRaw вставляет его без экранирования
  3. Внешний description содержит XML-узел b; за корректность отвечает автор фрагмента
Вставить фиксированный доверенный фрагментСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->writeRaw('<b>New</b>');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><b>New</b></description>

Это уже XML-разметка, написанная разработчиком. Writer не экранирует и не разбирает её как дерево; за корректность, namespace и баланс тегов отвечает автор фрагмента.

Повторно использовать XML, созданный своим writerСамостоятельный пример
<?php
$fragment = xmlwriter_open_memory();
$w = xmlwriter_open_memory();
if ($fragment === false || $w === false) {
    throw new RuntimeException('Нет буфера');
}
xmlwriter_write_element($fragment, 'title', 'A & B');
$trustedXml = xmlwriter_output_memory($fragment);
xmlwriter_start_element($w, 'item');
xmlwriter_write_raw($w, $trustedXml);
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<item><title>A &amp; B</title></item>

Вставляем результат контролируемой генерации без XML-декларации, а не произвольный ответ API. text($trustedXml) превратил бы теги в буквальный текст — это другое требование.

Соседние операции: XMLWriter::text(), XMLWriter::writeElement(), XMLWriter::writeCdata().

XMLWriter::startCdataНачать CDATA-секцию, чтобы записать текст без XML-экранирования по частям.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startCdata(): bool

Начать CDATA-секцию, чтобы записать текст без XML-экранирования по частям.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет. До этого откройте элемент; startCdata не принимает имя элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_cdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт description
  2. startCdata переключает запись на буквальный текст <b>New</b>
  3. endCdata закрывает секцию; это по-прежнему текст, не дочерний b
Записать буквальную HTML-строку частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->startCdata();
$w->text('<b>New</b>');
$w->text(' & useful');
$w->endCdata();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<b>New</b> & useful]]></description>

CDATA — участок текста XML, где < и & не открывают разметку. Он не создаёт дочерний b и не обезвреживает HTML для браузера: дальнейшее использование этой строки — отдельная задача.

Закончить CDATA и продолжить обычным текстомСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'description');
xmlwriter_start_cdata($w);
xmlwriter_text($w, '<b>New</b>');
xmlwriter_end_cdata($w);
xmlwriter_text($w, ' & useful');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description><![CDATA[<b>New</b>]]> &amp; useful</description>

endCdata меняет текущий режим: следующий & снова экранируется как обычный XML-текст. В результате оба участка являются текстовым содержимым одного элемента.

Соседние операции: XMLWriter::endCdata(), XMLWriter::writeCdata(), XMLWriter::text().

xmlwriter_start_cdataНачать CDATA-секцию, чтобы записать текст без XML-экранирования по частям.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_cdata(XMLWriter $writer): bool

Начать CDATA-секцию, чтобы записать текст без XML-экранирования по частям.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет. До этого откройте элемент; startCdata не принимает имя элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startCdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Открыт description
  2. startCdata переключает запись на буквальный текст <b>New</b>
  3. endCdata закрывает секцию; это по-прежнему текст, не дочерний b
Записать буквальную HTML-строку частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->startCdata();
$w->text('<b>New</b>');
$w->text(' & useful');
$w->endCdata();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<b>New</b> & useful]]></description>

CDATA — участок текста XML, где < и & не открывают разметку. Он не создаёт дочерний b и не обезвреживает HTML для браузера: дальнейшее использование этой строки — отдельная задача.

Закончить CDATA и продолжить обычным текстомСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'description');
xmlwriter_start_cdata($w);
xmlwriter_text($w, '<b>New</b>');
xmlwriter_end_cdata($w);
xmlwriter_text($w, ' & useful');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description><![CDATA[<b>New</b>]]> &amp; useful</description>

endCdata меняет текущий режим: следующий & снова экранируется как обычный XML-текст. В результате оба участка являются текстовым содержимым одного элемента.

Соседние операции: XMLWriter::endCdata(), XMLWriter::writeCdata(), XMLWriter::text().

XMLWriter::endCdataЗакончить текущую CDATA-секцию и вернуться к записи содержимого элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endCdata(): bool

Закончить текущую CDATA-секцию и вернуться к записи содержимого элемента.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет. Без открытой секции возможен false; endCdata не заменяет endElement.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_cdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В description открыта CDATA с <b>New</b>
  2. endCdata записывает завершающую границу секции
  3. Следующий text(" & useful") снова экранирует &
Записать буквальную HTML-строку частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->startCdata();
$w->text('<b>New</b>');
$w->text(' & useful');
$w->endCdata();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<b>New</b> & useful]]></description>

CDATA — участок текста XML, где < и & не открывают разметку. Он не создаёт дочерний b и не обезвреживает HTML для браузера: дальнейшее использование этой строки — отдельная задача.

Закончить CDATA и продолжить обычным текстомСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'description');
xmlwriter_start_cdata($w);
xmlwriter_text($w, '<b>New</b>');
xmlwriter_end_cdata($w);
xmlwriter_text($w, ' & useful');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description><![CDATA[<b>New</b>]]> &amp; useful</description>

endCdata меняет текущий режим: следующий & снова экранируется как обычный XML-текст. В результате оба участка являются текстовым содержимым одного элемента.

Соседние операции: XMLWriter::startCdata(), XMLWriter::writeCdata(), XMLWriter::endElement().

xmlwriter_end_cdataЗакончить текущую CDATA-секцию и вернуться к записи содержимого элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_cdata(XMLWriter $writer): bool

Закончить текущую CDATA-секцию и вернуться к записи содержимого элемента.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет. Без открытой секции возможен false; endCdata не заменяет endElement.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endCdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В description открыта CDATA с <b>New</b>
  2. endCdata записывает завершающую границу секции
  3. Следующий text(" & useful") снова экранирует &
Записать буквальную HTML-строку частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->startCdata();
$w->text('<b>New</b>');
$w->text(' & useful');
$w->endCdata();
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<b>New</b> & useful]]></description>

CDATA — участок текста XML, где < и & не открывают разметку. Он не создаёт дочерний b и не обезвреживает HTML для браузера: дальнейшее использование этой строки — отдельная задача.

Закончить CDATA и продолжить обычным текстомСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'description');
xmlwriter_start_cdata($w);
xmlwriter_text($w, '<b>New</b>');
xmlwriter_end_cdata($w);
xmlwriter_text($w, ' & useful');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description><![CDATA[<b>New</b>]]> &amp; useful</description>

endCdata меняет текущий режим: следующий & снова экранируется как обычный XML-текст. В результате оба участка являются текстовым содержимым одного элемента.

Соседние операции: XMLWriter::startCdata(), XMLWriter::writeCdata(), XMLWriter::endElement().

XMLWriter::writeCdataЗаписать полный CDATA-блок внутри элемента за один вызов.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeCdata(string $content): bool

Записать полный CDATA-блок внутри элемента за один вызов.

ПараметрЧто передать
$contentUTF-8 текст для CDATA без последовательности ]]>; сами границы <![CDATA[ и ]]> не передают.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_cdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Данные: <p>A & B</p>
  2. writeCdata окружает их границами CDATA
  3. Получатель читает буквальную строку, а не XML-элемент p
Готовое описание в одной CDATAСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->writeCdata('<p>A & B</p>');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<p>A & B</p>]]></description>

writeCdata сам пишет границы CDATA, но не создаёт элемент description. Этот формат может быть требованием старого каталога/ленты; обычно text проще и имеет тот же текстовый смысл.

Произвольный текст: выбрать CDATA или обычное экранированиеСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$description = 'The marker ]]> is part of the manual';
xmlwriter_start_element($w, 'description');
if (str_contains($description, ']]>')) {
    xmlwriter_text($w, $description);
} else {
    xmlwriter_write_cdata($w, $description);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description>The marker ]]&gt; is part of the manual</description>

str_contains проверяет наличие запрещённой для CDATA границы. Обычный текст сохранит значение без ручной сборки сложных границ. Если получатель требует именно CDATA, нужно согласованное разбиение на несколько секций, а не удаление данных.

Соседние операции: XMLWriter::startCdata(), XMLWriter::endCdata(), XMLWriter::text().

xmlwriter_write_cdataЗаписать полный CDATA-блок внутри элемента за один вызов.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_cdata(XMLWriter $writer, string $content): bool

Записать полный CDATA-блок внутри элемента за один вызов.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$contentUTF-8 текст для CDATA без последовательности ]]>; сами границы <![CDATA[ и ]]> не передают.

Возвращает bool. Последовательность ]]> не может находиться внутри одной CDATA-секции. Не полагайтесь на автоматическое разбиение libxml: для произвольных данных проще обычный text. Неверный UTF-8 и недопустимые XML-символы CDATA не исправляет.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeCdata(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Данные: <p>A & B</p>
  2. writeCdata окружает их границами CDATA
  3. Получатель читает буквальную строку, а не XML-элемент p
Готовое описание в одной CDATAСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startElement('description');
$w->writeCdata('<p>A & B</p>');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<description><![CDATA[<p>A & B</p>]]></description>

writeCdata сам пишет границы CDATA, но не создаёт элемент description. Этот формат может быть требованием старого каталога/ленты; обычно text проще и имеет тот же текстовый смысл.

Произвольный текст: выбрать CDATA или обычное экранированиеСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$description = 'The marker ]]> is part of the manual';
xmlwriter_start_element($w, 'description');
if (str_contains($description, ']]>')) {
    xmlwriter_text($w, $description);
} else {
    xmlwriter_write_cdata($w, $description);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<description>The marker ]]&gt; is part of the manual</description>

str_contains проверяет наличие запрещённой для CDATA границы. Обычный текст сохранит значение без ручной сборки сложных границ. Если получатель требует именно CDATA, нужно согласованное разбиение на несколько секций, а не удаление данных.

Соседние операции: XMLWriter::startCdata(), XMLWriter::endCdata(), XMLWriter::text().

XMLWriter::startCommentНачать служебный XML-комментарий, который формируется несколькими записями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startComment(): bool

Начать служебный XML-комментарий, который формируется несколькими записями.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. XML-комментарий не допускает -- внутри и дефис непосредственно перед завершающей границей. text в этом режиме не делает произвольную строку безопасным комментарием. Значение следует ограничить или проверить до записи.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_comment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Метка Batch и номер 42 подготовлены
  2. startComment переводит writer в комментарий
  3. endComment завершает его; stock записывается отдельным элементом
Собрать служебный комментарий частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startComment();
$w->text('Batch ');
$w->text('42');
$w->endComment();
$w->writeElement('stock', '7');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Batch 42--><stock>7</stock>

Комментарий может стоять перед корнем. Он виден в исходном XML и не предназначен для секретов. Сборка частями полезна, когда метка складывается из известного префикса и номера.

Комментарий относится к следующему узлу, но не становится его даннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'stock');
xmlwriter_start_comment($w);
xmlwriter_text($w, 'Quantity after reservation');
xmlwriter_end_comment($w);
xmlwriter_write_element($w, 'qty', '7');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<stock><!--Quantity after reservation--><qty>7</qty></stock>

После endComment writer продолжает содержимое stock. Если получатель должен использовать метку как бизнес-данные, оформите отдельный элемент/атрибут, а не комментарий.

Соседние операции: XMLWriter::endComment(), XMLWriter::writeComment(), XMLWriter::text().

xmlwriter_start_commentНачать служебный XML-комментарий, который формируется несколькими записями.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_comment(XMLWriter $writer): bool

Начать служебный XML-комментарий, который формируется несколькими записями.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. XML-комментарий не допускает -- внутри и дефис непосредственно перед завершающей границей. text в этом режиме не делает произвольную строку безопасным комментарием. Значение следует ограничить или проверить до записи.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startComment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Метка Batch и номер 42 подготовлены
  2. startComment переводит writer в комментарий
  3. endComment завершает его; stock записывается отдельным элементом
Собрать служебный комментарий частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startComment();
$w->text('Batch ');
$w->text('42');
$w->endComment();
$w->writeElement('stock', '7');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Batch 42--><stock>7</stock>

Комментарий может стоять перед корнем. Он виден в исходном XML и не предназначен для секретов. Сборка частями полезна, когда метка складывается из известного префикса и номера.

Комментарий относится к следующему узлу, но не становится его даннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'stock');
xmlwriter_start_comment($w);
xmlwriter_text($w, 'Quantity after reservation');
xmlwriter_end_comment($w);
xmlwriter_write_element($w, 'qty', '7');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<stock><!--Quantity after reservation--><qty>7</qty></stock>

После endComment writer продолжает содержимое stock. Если получатель должен использовать метку как бизнес-данные, оформите отдельный элемент/атрибут, а не комментарий.

Соседние операции: XMLWriter::endComment(), XMLWriter::writeComment(), XMLWriter::text().

XMLWriter::endCommentЗакончить текущий комментарий перед дальнейшей XML-разметкой.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endComment(): bool

Закончить текущий комментарий перед дальнейшей XML-разметкой.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

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

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_comment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Внутри комментария записана метка партии
  2. endComment закрывает именно комментарий
  3. Следующая writeElement создаёт узел документа
Собрать служебный комментарий частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startComment();
$w->text('Batch ');
$w->text('42');
$w->endComment();
$w->writeElement('stock', '7');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Batch 42--><stock>7</stock>

Комментарий может стоять перед корнем. Он виден в исходном XML и не предназначен для секретов. Сборка частями полезна, когда метка складывается из известного префикса и номера.

Комментарий относится к следующему узлу, но не становится его даннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'stock');
xmlwriter_start_comment($w);
xmlwriter_text($w, 'Quantity after reservation');
xmlwriter_end_comment($w);
xmlwriter_write_element($w, 'qty', '7');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<stock><!--Quantity after reservation--><qty>7</qty></stock>

После endComment writer продолжает содержимое stock. Если получатель должен использовать метку как бизнес-данные, оформите отдельный элемент/атрибут, а не комментарий.

Соседние операции: XMLWriter::startComment(), XMLWriter::writeComment().

xmlwriter_end_commentЗакончить текущий комментарий перед дальнейшей XML-разметкой.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_comment(XMLWriter $writer): bool

Закончить текущий комментарий перед дальнейшей XML-разметкой.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

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

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endComment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Внутри комментария записана метка партии
  2. endComment закрывает именно комментарий
  3. Следующая writeElement создаёт узел документа
Собрать служебный комментарий частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startComment();
$w->text('Batch ');
$w->text('42');
$w->endComment();
$w->writeElement('stock', '7');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Batch 42--><stock>7</stock>

Комментарий может стоять перед корнем. Он виден в исходном XML и не предназначен для секретов. Сборка частями полезна, когда метка складывается из известного префикса и номера.

Комментарий относится к следующему узлу, но не становится его даннымиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_element($w, 'stock');
xmlwriter_start_comment($w);
xmlwriter_text($w, 'Quantity after reservation');
xmlwriter_end_comment($w);
xmlwriter_write_element($w, 'qty', '7');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<stock><!--Quantity after reservation--><qty>7</qty></stock>

После endComment writer продолжает содержимое stock. Если получатель должен использовать метку как бизнес-данные, оформите отдельный элемент/атрибут, а не комментарий.

Соседние операции: XMLWriter::startComment(), XMLWriter::writeComment().

XMLWriter::writeCommentЗаписать полный XML-комментарий одной операцией.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeComment(string $content): bool

Записать полный XML-комментарий одной операцией.

ПараметрЧто передать
$contentТекст комментария без -- и завершающего дефиса; не включает <!-- и -->.

Возвращает bool. XML-комментарий не допускает -- внутри и дефис непосредственно перед завершающей границей. text в этом режиме не делает произвольную строку безопасным комментарием. Значение следует ограничить или проверить до записи.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_comment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Метка Export schema v2
  2. writeComment оформляет XML-комментарий
  3. order остаётся отдельным корневым элементом
Готовая метка версии выгрузкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeComment('Export schema v2');
$w->writeElement('order', '42');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Export schema v2--><order>42</order>

Комментарий помогает человеку читать файл. Он не задаёт XML Schema и не гарантирует, что получатель примет структуру.

Не допустить запрещённую последовательность в комментарииСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$label = 'Batch -- 42';
if (str_contains($label, '--') || str_ends_with($label, '-')) {
    echo "Метка не подходит для XML-комментария
";
} else {
    xmlwriter_write_comment($w, $label);
}
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
Метка не подходит для XML-комментария
<order>42</order>

Здесь метка необязательна: пропускаем её при неподходящем содержимом. Для обязательных данных нужно вернуть ошибку валидации, а не незаметно потерять значение.

Соседние операции: XMLWriter::startComment(), XMLWriter::endComment(), XMLWriter::text().

xmlwriter_write_commentЗаписать полный XML-комментарий одной операцией.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_comment(XMLWriter $writer, string $content): bool

Записать полный XML-комментарий одной операцией.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$contentТекст комментария без -- и завершающего дефиса; не включает <!-- и -->.

Возвращает bool. XML-комментарий не допускает -- внутри и дефис непосредственно перед завершающей границей. text в этом режиме не делает произвольную строку безопасным комментарием. Значение следует ограничить или проверить до записи.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeComment(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Метка Export schema v2
  2. writeComment оформляет XML-комментарий
  3. order остаётся отдельным корневым элементом
Готовая метка версии выгрузкиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeComment('Export schema v2');
$w->writeElement('order', '42');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!--Export schema v2--><order>42</order>

Комментарий помогает человеку читать файл. Он не задаёт XML Schema и не гарантирует, что получатель примет структуру.

Не допустить запрещённую последовательность в комментарииСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$label = 'Batch -- 42';
if (str_contains($label, '--') || str_ends_with($label, '-')) {
    echo "Метка не подходит для XML-комментария
";
} else {
    xmlwriter_write_comment($w, $label);
}
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
Метка не подходит для XML-комментария
<order>42</order>

Здесь метка необязательна: пропускаем её при неподходящем содержимом. Для обязательных данных нужно вернуть ошибку валидации, а не незаметно потерять значение.

Соседние операции: XMLWriter::startComment(), XMLWriter::endComment(), XMLWriter::text().

XMLWriter::startPiНачать инструкцию обработки для получателя XML.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startPi(string $target): bool

Начать инструкцию обработки для получателя XML.

ПараметрЧто передать
$targetИмя получателя/типа инструкции, например xml-stylesheet; это не URL.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_pi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Назначение xml-stylesheet
  2. startPi открывает инструкцию, text добавляет type/href
  3. endPi завершает её; сам PHP таблицу стилей не запускает
Указать локальную таблицу стилей для XMLСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startPi('xml-stylesheet');
$w->text('type="text/xsl" ');
$w->text('href="catalog.xsl"');
$w->endPi();
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

PI (processing instruction) — инструкция получателю документа. XMLWriter только записывает её: он не открывает catalog.xsl, не выполняет XSLT и не отправляет HTTP-запрос.

Служебная инструкция для собственного обработчикаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_pi($w, 'shop-export');
xmlwriter_text($w, 'version="2"');
xmlwriter_end_pi($w);
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export version="2"?><order>42</order>

Смысл shop-export определяет ваша договорённость с получателем. Эти строки не становятся PHP-кодом даже при похожих угловых скобках.

Соседние операции: XMLWriter::endPi(), XMLWriter::writePi(), XMLWriter::startDocument().

xmlwriter_start_piНачать инструкцию обработки для получателя XML.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_pi(XMLWriter $writer, string $target): bool

Начать инструкцию обработки для получателя XML.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$targetИмя получателя/типа инструкции, например xml-stylesheet; это не URL.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startPi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Назначение xml-stylesheet
  2. startPi открывает инструкцию, text добавляет type/href
  3. endPi завершает её; сам PHP таблицу стилей не запускает
Указать локальную таблицу стилей для XMLСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startPi('xml-stylesheet');
$w->text('type="text/xsl" ');
$w->text('href="catalog.xsl"');
$w->endPi();
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

PI (processing instruction) — инструкция получателю документа. XMLWriter только записывает её: он не открывает catalog.xsl, не выполняет XSLT и не отправляет HTTP-запрос.

Служебная инструкция для собственного обработчикаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_pi($w, 'shop-export');
xmlwriter_text($w, 'version="2"');
xmlwriter_end_pi($w);
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export version="2"?><order>42</order>

Смысл shop-export определяет ваша договорённость с получателем. Эти строки не становятся PHP-кодом даже при похожих угловых скобках.

Соседние операции: XMLWriter::endPi(), XMLWriter::writePi(), XMLWriter::startDocument().

XMLWriter::endPiЗакончить текущую инструкцию обработки.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endPi(): bool

Закончить текущую инструкцию обработки.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные. Метод не закрывает элемент и не запускает обработчик.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_pi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В PI уже записано version="2"
  2. endPi завершает инструкцию
  3. Следующая запись создаёт обычный order
Указать локальную таблицу стилей для XMLСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startPi('xml-stylesheet');
$w->text('type="text/xsl" ');
$w->text('href="catalog.xsl"');
$w->endPi();
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

PI (processing instruction) — инструкция получателю документа. XMLWriter только записывает её: он не открывает catalog.xsl, не выполняет XSLT и не отправляет HTTP-запрос.

Служебная инструкция для собственного обработчикаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_pi($w, 'shop-export');
xmlwriter_text($w, 'version="2"');
xmlwriter_end_pi($w);
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export version="2"?><order>42</order>

Смысл shop-export определяет ваша договорённость с получателем. Эти строки не становятся PHP-кодом даже при похожих угловых скобках.

Соседние операции: XMLWriter::startPi(), XMLWriter::writePi().

xmlwriter_end_piЗакончить текущую инструкцию обработки.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_pi(XMLWriter $writer): bool

Закончить текущую инструкцию обработки.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные. Метод не закрывает элемент и не запускает обработчик.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endPi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В PI уже записано version="2"
  2. endPi завершает инструкцию
  3. Следующая запись создаёт обычный order
Указать локальную таблицу стилей для XMLСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startPi('xml-stylesheet');
$w->text('type="text/xsl" ');
$w->text('href="catalog.xsl"');
$w->endPi();
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

PI (processing instruction) — инструкция получателю документа. XMLWriter только записывает её: он не открывает catalog.xsl, не выполняет XSLT и не отправляет HTTP-запрос.

Служебная инструкция для собственного обработчикаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_pi($w, 'shop-export');
xmlwriter_text($w, 'version="2"');
xmlwriter_end_pi($w);
xmlwriter_write_element($w, 'order', '42');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export version="2"?><order>42</order>

Смысл shop-export определяет ваша договорённость с получателем. Эти строки не становятся PHP-кодом даже при похожих угловых скобках.

Соседние операции: XMLWriter::startPi(), XMLWriter::writePi().

XMLWriter::writePiЗаписать полную инструкцию обработки одной операцией.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writePi(string $target, string $content): bool

Записать полную инструкцию обработки одной операцией.

ПараметрЧто передать
$targetДопустимое имя инструкции; xml зарезервировано.
$contentСтрока содержимого без ?>; не включает границы <? и ?>.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_pi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Доверенные target=shop-export и format="compact"
  2. writePi создаёт инструкцию
  3. Получатель сам решает, понимает ли он shop-export
Одна готовая инструкция таблицы стилейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writePi('xml-stylesheet', 'type="text/xsl" href="catalog.xsl"');
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

Используйте startPi/text/endPi, если значение действительно формируется по частям; для готовой строки writePi заметнее и короче.

Проверить содержимое служебной инструкции заранееСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$instruction = 'format="compact"';
if (str_contains($instruction, '?>')) {
    throw new InvalidArgumentException('Граница PI внутри данных');
}
xmlwriter_write_pi($w, 'shop-export', $instruction);
xmlwriter_write_element($w, 'stock', '7');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export format="compact"?><stock>7</stock>

Проверка запрещённой границы полезна даже при формировании служебной строки. Политику допустимых имён и параметров инструкции задаёт приложение.

Соседние операции: XMLWriter::startPi(), XMLWriter::endPi(), XMLWriter::startDocument().

xmlwriter_write_piЗаписать полную инструкцию обработки одной операцией.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_pi(XMLWriter $writer, string $target, string $content): bool

Записать полную инструкцию обработки одной операцией.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$targetДопустимое имя инструкции; xml зарезервировано.
$contentСтрока содержимого без ?>; не включает границы <? и ?>.

Возвращает bool. target должен быть допустимым XML-именем; xml в любом регистре зарезервировано для декларации. В содержимом PI запрещена последовательность ?>. Кавычки/псевдоатрибуты в content — ваша строка, а не набор атрибутов XMLWriter. Не передавайте сюда неподготовленные внешние данные.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writePi(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Доверенные target=shop-export и format="compact"
  2. writePi создаёт инструкцию
  3. Получатель сам решает, понимает ли он shop-export
Одна готовая инструкция таблицы стилейСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writePi('xml-stylesheet', 'type="text/xsl" href="catalog.xsl"');
$w->writeElement('catalog', 'ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?><catalog>ready</catalog>

Используйте startPi/text/endPi, если значение действительно формируется по частям; для готовой строки writePi заметнее и короче.

Проверить содержимое служебной инструкции заранееСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$instruction = 'format="compact"';
if (str_contains($instruction, '?>')) {
    throw new InvalidArgumentException('Граница PI внутри данных');
}
xmlwriter_write_pi($w, 'shop-export', $instruction);
xmlwriter_write_element($w, 'stock', '7');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<?shop-export format="compact"?><stock>7</stock>

Проверка запрещённой границы полезна даже при формировании служебной строки. Политику допустимых имён и параметров инструкции задаёт приложение.

Соседние операции: XMLWriter::startPi(), XMLWriter::endPi(), XMLWriter::startDocument().

XMLWriter::startDtdНачать объявление типа документа и затем дописать внутренние объявления.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startDtd(string $qualifiedName, ?string $publicId = null, ?string $systemId = null): bool

Начать объявление типа документа и затем дописать внутренние объявления.

ПараметрЧто передать
$qualifiedNameПолное имя типа документа; обычно совпадает с именем корня.
$publicIdПубличный идентификатор внешнего набора объявлений либо null.
$systemIdСистемный идентификатор (URI) внешней DTD либо null. Для PUBLIC обычно нужен также SYSTEM URI.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. null исключает необязательный идентификатор; имена и идентификаторы являются контролируемой частью формата, не пользовательскими строками.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_dtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Формат требует корень message с текстом
  2. startDtd(message) открывает DOCTYPE
  3. writeDtdElement объявляет правило; endDtd завершает DOCTYPE перед данными
Объявить один текстовый элемент во внутренней DTDСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

message после DOCTYPE — имя корня. (#PCDATA) разрешает разобранный текст внутри message. Квадратные скобки ограничивают внутренние объявления; writer расставляет границы сам.

Объявить последовательность полей заказаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'order');
xmlwriter_write_dtd_element($w, 'order', '(id,total)');
xmlwriter_write_dtd_element($w, 'id', '(#PCDATA)');
xmlwriter_write_dtd_element($w, 'total', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'id', '42');
xmlwriter_write_element($w, 'total', '499');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

Запятая в DTD требует порядок id, затем total. Это синтаксис DTD внутри PHP-строки, а не оператор PHP. Сама запись числа как текста не вводит денежную валидацию.

Соседние операции: XMLWriter::endDtd(), XMLWriter::writeDtd(), XMLWriter::writeDtdElement().

xmlwriter_start_dtdНачать объявление типа документа и затем дописать внутренние объявления.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_dtd(XMLWriter $writer, string $qualifiedName, ?string $publicId = null, ?string $systemId = null): bool

Начать объявление типа документа и затем дописать внутренние объявления.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$qualifiedNameПолное имя типа документа; обычно совпадает с именем корня.
$publicIdПубличный идентификатор внешнего набора объявлений либо null.
$systemIdСистемный идентификатор (URI) внешней DTD либо null. Для PUBLIC обычно нужен также SYSTEM URI.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. null исключает необязательный идентификатор; имена и идентификаторы являются контролируемой частью формата, не пользовательскими строками.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startDtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Формат требует корень message с текстом
  2. startDtd(message) открывает DOCTYPE
  3. writeDtdElement объявляет правило; endDtd завершает DOCTYPE перед данными
Объявить один текстовый элемент во внутренней DTDСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

message после DOCTYPE — имя корня. (#PCDATA) разрешает разобранный текст внутри message. Квадратные скобки ограничивают внутренние объявления; writer расставляет границы сам.

Объявить последовательность полей заказаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'order');
xmlwriter_write_dtd_element($w, 'order', '(id,total)');
xmlwriter_write_dtd_element($w, 'id', '(#PCDATA)');
xmlwriter_write_dtd_element($w, 'total', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'id', '42');
xmlwriter_write_element($w, 'total', '499');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

Запятая в DTD требует порядок id, затем total. Это синтаксис DTD внутри PHP-строки, а не оператор PHP. Сама запись числа как текста не вводит денежную валидацию.

Соседние операции: XMLWriter::endDtd(), XMLWriter::writeDtd(), XMLWriter::writeDtdElement().

XMLWriter::endDtdЗакончить объявление типа документа перед его корневым элементом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endDtd(): bool

Закончить объявление типа документа перед его корневым элементом.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. Закрывает DTD, а не документ или элемент; без соответствующего startDtd возможен отказ.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_dtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Правила order/id/total записаны внутри DOCTYPE
  2. endDtd завершает набор объявлений
  3. Теперь startElement(order) пишет сами данные
Объявить один текстовый элемент во внутренней DTDСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

message после DOCTYPE — имя корня. (#PCDATA) разрешает разобранный текст внутри message. Квадратные скобки ограничивают внутренние объявления; writer расставляет границы сам.

Объявить последовательность полей заказаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'order');
xmlwriter_write_dtd_element($w, 'order', '(id,total)');
xmlwriter_write_dtd_element($w, 'id', '(#PCDATA)');
xmlwriter_write_dtd_element($w, 'total', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'id', '42');
xmlwriter_write_element($w, 'total', '499');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

Запятая в DTD требует порядок id, затем total. Это синтаксис DTD внутри PHP-строки, а не оператор PHP. Сама запись числа как текста не вводит денежную валидацию.

Соседние операции: XMLWriter::startDtd(), XMLWriter::writeDtd().

xmlwriter_end_dtdЗакончить объявление типа документа перед его корневым элементом.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_dtd(XMLWriter $writer): bool

Закончить объявление типа документа перед его корневым элементом.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. Закрывает DTD, а не документ или элемент; без соответствующего startDtd возможен отказ.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endDtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Правила order/id/total записаны внутри DOCTYPE
  2. endDtd завершает набор объявлений
  3. Теперь startElement(order) пишет сами данные
Объявить один текстовый элемент во внутренней DTDСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

message после DOCTYPE — имя корня. (#PCDATA) разрешает разобранный текст внутри message. Квадратные скобки ограничивают внутренние объявления; writer расставляет границы сам.

Объявить последовательность полей заказаСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'order');
xmlwriter_write_dtd_element($w, 'order', '(id,total)');
xmlwriter_write_dtd_element($w, 'id', '(#PCDATA)');
xmlwriter_write_dtd_element($w, 'total', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'order');
xmlwriter_write_element($w, 'id', '42');
xmlwriter_write_element($w, 'total', '499');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

Запятая в DTD требует порядок id, затем total. Это синтаксис DTD внутри PHP-строки, а не оператор PHP. Сама запись числа как текста не вводит денежную валидацию.

Соседние операции: XMLWriter::startDtd(), XMLWriter::writeDtd().

XMLWriter::writeDtdЗаписать полный DOCTYPE с внешними идентификаторами и/или внутренним набором объявлений.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeDtd(string $name, ?string $publicId = null, ?string $systemId = null, ?string $content = null): bool

Записать полный DOCTYPE с внешними идентификаторами и/или внутренним набором объявлений.

ПараметрЧто передать
$nameИмя типа документа/корневого элемента.
$publicIdПубличный идентификатор внешней DTD либо null.
$systemIdURI внешней DTD либо null; writer его не загружает.
$contentДоверенные внутренние объявления DTD без окружающих квадратных скобок; null — без них.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. Готовый content не проверяется как вся DTD, поэтому сложные правила удобнее собирать отдельными DTD-операциями.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_dtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Имя catalog и согласованные PUBLIC/SYSTEM идентификаторы
  2. writeDtd записывает ссылку в DOCTYPE
  3. Выгрузка содержит декларацию, но writer не скачивает catalog.dtd
Готовый небольшой внутренний набор правилСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeDtd('message', null, null, '<!ELEMENT message (#PCDATA)>');
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

content содержит доверенный синтаксис объявлений, а не текст элемента. Сами DOCTYPE и внешние квадратные скобки передавать не нужно.

Сослаться на согласованную внешнюю DTD без её загрузкиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_write_dtd($w, 'catalog', '-//Example Shop//DTD Catalog 1.0//EN', 'catalog.dtd');
xmlwriter_write_element($w, 'catalog');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog PUBLIC "-//Example Shop//DTD Catalog 1.0//EN" "catalog.dtd"><catalog/>

Это только запись ссылки: catalog.dtd здесь не читается. Получатель может иначе обрабатывать внешние ресурсы, поэтому разрешённые URI и параметры его XML-парсера обсуждают отдельно.

Соседние операции: XMLWriter::startDtd(), XMLWriter::writeDtdElement(), XMLWriter::writeDtdAttlist().

xmlwriter_write_dtdЗаписать полный DOCTYPE с внешними идентификаторами и/или внутренним набором объявлений.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_dtd(XMLWriter $writer, string $name, ?string $publicId = null, ?string $systemId = null, ?string $content = null): bool

Записать полный DOCTYPE с внешними идентификаторами и/или внутренним набором объявлений.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя типа документа/корневого элемента.
$publicIdПубличный идентификатор внешней DTD либо null.
$systemIdURI внешней DTD либо null; writer его не загружает.
$contentДоверенные внутренние объявления DTD без окружающих квадратных скобок; null — без них.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Возвращает bool. Готовый content не проверяется как вся DTD, поэтому сложные правила удобнее собирать отдельными DTD-операциями.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeDtd(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Имя catalog и согласованные PUBLIC/SYSTEM идентификаторы
  2. writeDtd записывает ссылку в DOCTYPE
  3. Выгрузка содержит декларацию, но writer не скачивает catalog.dtd
Готовый небольшой внутренний набор правилСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->writeDtd('message', null, null, '<!ELEMENT message (#PCDATA)>');
$w->writeElement('message', 'Ready');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Ready</message>

content содержит доверенный синтаксис объявлений, а не текст элемента. Сами DOCTYPE и внешние квадратные скобки передавать не нужно.

Сослаться на согласованную внешнюю DTD без её загрузкиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_write_dtd($w, 'catalog', '-//Example Shop//DTD Catalog 1.0//EN', 'catalog.dtd');
xmlwriter_write_element($w, 'catalog');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog PUBLIC "-//Example Shop//DTD Catalog 1.0//EN" "catalog.dtd"><catalog/>

Это только запись ссылки: catalog.dtd здесь не читается. Получатель может иначе обрабатывать внешние ресурсы, поэтому разрешённые URI и параметры его XML-парсера обсуждают отдельно.

Соседние операции: XMLWriter::startDtd(), XMLWriter::writeDtdElement(), XMLWriter::writeDtdAttlist().

XMLWriter::startDtdElementНачать объявление допустимого содержимого конкретного элемента в DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startDtdElement(string $qualifiedName): bool

Начать объявление допустимого содержимого конкретного элемента в DTD.

ПараметрЧто передать
$qualifiedNameИмя элемента, для которого задают правило, например order.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_dtd_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. DTD открыта для order
  2. startDtdElement(order) начинает правило, text задаёт (id,total)
  3. endDtdElement завершает правило; данные order будут записаны позже
Составить модель содержимого элемента частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('order');
$w->startDtdElement('order');
$w->text('(id,');
$w->text('total)');
$w->endDtdElement();
$w->writeDtdElement('id', '(#PCDATA)');
$w->writeDtdElement('total', '(#PCDATA)');
$w->endDtd();
$w->startElement('order');
$w->writeElement('id', '42');
$w->writeElement('total', '499');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

startDtdElement начинает правило для order, а не экземпляр order. endDtdElement завершает объявление. Для готовой модели (id,total) проще writeDtdElement.

Объявить элемент, у которого допустимы только атрибутыСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'ping');
xmlwriter_start_dtd_element($w, 'ping');
xmlwriter_text($w, 'EMPTY');
xmlwriter_end_dtd_element($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'ping');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE ping [<!ELEMENT ping EMPTY>]><ping/>

EMPTY — ключевое слово DTD: у элемента нет текстового содержимого и дочерних элементов. Атрибуты при необходимости объявляют через ATTLIST.

Соседние операции: XMLWriter::endDtdElement(), XMLWriter::writeDtdElement(), XMLWriter::startElement().

xmlwriter_start_dtd_elementНачать объявление допустимого содержимого конкретного элемента в DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_dtd_element(XMLWriter $writer, string $qualifiedName): bool

Начать объявление допустимого содержимого конкретного элемента в DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$qualifiedNameИмя элемента, для которого задают правило, например order.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startDtdElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. DTD открыта для order
  2. startDtdElement(order) начинает правило, text задаёт (id,total)
  3. endDtdElement завершает правило; данные order будут записаны позже
Составить модель содержимого элемента частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('order');
$w->startDtdElement('order');
$w->text('(id,');
$w->text('total)');
$w->endDtdElement();
$w->writeDtdElement('id', '(#PCDATA)');
$w->writeDtdElement('total', '(#PCDATA)');
$w->endDtd();
$w->startElement('order');
$w->writeElement('id', '42');
$w->writeElement('total', '499');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

startDtdElement начинает правило для order, а не экземпляр order. endDtdElement завершает объявление. Для готовой модели (id,total) проще writeDtdElement.

Объявить элемент, у которого допустимы только атрибутыСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'ping');
xmlwriter_start_dtd_element($w, 'ping');
xmlwriter_text($w, 'EMPTY');
xmlwriter_end_dtd_element($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'ping');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE ping [<!ELEMENT ping EMPTY>]><ping/>

EMPTY — ключевое слово DTD: у элемента нет текстового содержимого и дочерних элементов. Атрибуты при необходимости объявляют через ATTLIST.

Соседние операции: XMLWriter::endDtdElement(), XMLWriter::writeDtdElement(), XMLWriter::startElement().

XMLWriter::endDtdElementЗавершить открытое объявление ELEMENT в DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endDtdElement(): bool

Завершить открытое объявление ELEMENT в DTD.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool. Не заменяет endElement: тот закрывает узел с данными, а эта операция — правило его структуры.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_dtd_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Правило ping уже содержит EMPTY
  2. endDtdElement завершает объявление ELEMENT
  3. endDtd заканчивает правила; writeElement(ping) пишет данные
Составить модель содержимого элемента частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('order');
$w->startDtdElement('order');
$w->text('(id,');
$w->text('total)');
$w->endDtdElement();
$w->writeDtdElement('id', '(#PCDATA)');
$w->writeDtdElement('total', '(#PCDATA)');
$w->endDtd();
$w->startElement('order');
$w->writeElement('id', '42');
$w->writeElement('total', '499');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

startDtdElement начинает правило для order, а не экземпляр order. endDtdElement завершает объявление. Для готовой модели (id,total) проще writeDtdElement.

Объявить элемент, у которого допустимы только атрибутыСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'ping');
xmlwriter_start_dtd_element($w, 'ping');
xmlwriter_text($w, 'EMPTY');
xmlwriter_end_dtd_element($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'ping');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE ping [<!ELEMENT ping EMPTY>]><ping/>

EMPTY — ключевое слово DTD: у элемента нет текстового содержимого и дочерних элементов. Атрибуты при необходимости объявляют через ATTLIST.

Соседние операции: XMLWriter::startDtdElement(), XMLWriter::writeDtdElement(), XMLWriter::endElement().

xmlwriter_end_dtd_elementЗавершить открытое объявление ELEMENT в DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_dtd_element(XMLWriter $writer): bool

Завершить открытое объявление ELEMENT в DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool. Не заменяет endElement: тот закрывает узел с данными, а эта операция — правило его структуры.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endDtdElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Правило ping уже содержит EMPTY
  2. endDtdElement завершает объявление ELEMENT
  3. endDtd заканчивает правила; writeElement(ping) пишет данные
Составить модель содержимого элемента частямиСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('order');
$w->startDtdElement('order');
$w->text('(id,');
$w->text('total)');
$w->endDtdElement();
$w->writeDtdElement('id', '(#PCDATA)');
$w->writeDtdElement('total', '(#PCDATA)');
$w->endDtd();
$w->startElement('order');
$w->writeElement('id', '42');
$w->writeElement('total', '499');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE order [<!ELEMENT order (id,total)><!ELEMENT id (#PCDATA)><!ELEMENT total (#PCDATA)>]><order><id>42</id><total>499</total></order>

startDtdElement начинает правило для order, а не экземпляр order. endDtdElement завершает объявление. Для готовой модели (id,total) проще writeDtdElement.

Объявить элемент, у которого допустимы только атрибутыСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'ping');
xmlwriter_start_dtd_element($w, 'ping');
xmlwriter_text($w, 'EMPTY');
xmlwriter_end_dtd_element($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'ping');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE ping [<!ELEMENT ping EMPTY>]><ping/>

EMPTY — ключевое слово DTD: у элемента нет текстового содержимого и дочерних элементов. Атрибуты при необходимости объявляют через ATTLIST.

Соседние операции: XMLWriter::startDtdElement(), XMLWriter::writeDtdElement(), XMLWriter::endElement().

XMLWriter::writeDtdElementЗаписать полное объявление ELEMENT с готовой моделью содержимого.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeDtdElement(string $name, string $content): bool

Записать полное объявление ELEMENT с готовой моделью содержимого.

ПараметрЧто передать
$nameИмя описываемого элемента.
$contentСинтаксис модели DTD, например (#PCDATA), EMPTY или (item*); не текст будущего элемента.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_dtd_element(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. catalog должен содержать повторяющиеся item
  2. writeDtdElement записывает правило (item*)
  3. Далее обычный foreach пишет реальные товары
Объявить текстовое сообщениеСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Sent');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Sent</message>

Имя и модель раздельны. Здесь разрешён текст, но не вложенные элементы.

Каталог с нулём или несколькими товарамиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'catalog');
xmlwriter_write_dtd_element($w, 'catalog', '(item*)');
xmlwriter_write_dtd_element($w, 'item', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'catalog');
foreach (['A', 'B'] as $sku) {
    xmlwriter_write_element($w, 'item', $sku);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog [<!ELEMENT catalog (item*)><!ELEMENT item (#PCDATA)>]><catalog><item>A</item><item>B</item></catalog>

Звёздочка означает 0 или больше item. Для 1 или больше используют +. Writer не проверит нарушение этого правила; отдельный валидирующий парсер нужен на границе проверки.

Соседние операции: XMLWriter::startDtdElement(), XMLWriter::writeDtdAttlist(), XMLWriter::writeElement().

xmlwriter_write_dtd_elementЗаписать полное объявление ELEMENT с готовой моделью содержимого.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_dtd_element(XMLWriter $writer, string $name, string $content): bool

Записать полное объявление ELEMENT с готовой моделью содержимого.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя описываемого элемента.
$contentСинтаксис модели DTD, например (#PCDATA), EMPTY или (item*); не текст будущего элемента.

DTD — объявления допустимой структуры документа, его атрибутов и сущностей. Их пишут перед корневым элементом. XMLWriter лишь формирует текст DTD: не валидирует последующий документ и не загружает указанную внешнюю DTD. В новой интеграции DTD нужна только по договору получателя; это не обязательная часть любого XML. Для модели содержимого применяют EMPTY, ANY, (#PCDATA), последовательность (id,total), альтернативу (a|b), суффиксы ?/*/+ для необязательности и повторения. Эти символы находятся внутри строки и принадлежат языку DTD. Возвращает bool.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeDtdElement(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. catalog должен содержать повторяющиеся item
  2. writeDtdElement записывает правило (item*)
  3. Далее обычный foreach пишет реальные товары
Объявить текстовое сообщениеСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('message');
$w->writeDtdElement('message', '(#PCDATA)');
$w->endDtd();
$w->writeElement('message', 'Sent');
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE message [<!ELEMENT message (#PCDATA)>]><message>Sent</message>

Имя и модель раздельны. Здесь разрешён текст, но не вложенные элементы.

Каталог с нулём или несколькими товарамиСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'catalog');
xmlwriter_write_dtd_element($w, 'catalog', '(item*)');
xmlwriter_write_dtd_element($w, 'item', '(#PCDATA)');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'catalog');
foreach (['A', 'B'] as $sku) {
    xmlwriter_write_element($w, 'item', $sku);
}
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog [<!ELEMENT catalog (item*)><!ELEMENT item (#PCDATA)>]><catalog><item>A</item><item>B</item></catalog>

Звёздочка означает 0 или больше item. Для 1 или больше используют +. Writer не проверит нарушение этого правила; отдельный валидирующий парсер нужен на границе проверки.

Соседние операции: XMLWriter::startDtdElement(), XMLWriter::writeDtdAttlist(), XMLWriter::writeElement().

XMLWriter::startDtdAttlistНачать объявление ATTLIST, чтобы описать атрибуты элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startDtdAttlist(string $name): bool

Начать объявление ATTLIST, чтобы описать атрибуты элемента.

ПараметрЧто передать
$nameИмя элемента, чьи атрибуты описываются; не имя одного атрибута.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_dtd_attlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Для item нужен обязательный sku
  2. startDtdAttlist(item) открывает список правил
  3. text пишет sku CDATA #REQUIRED; endDtdAttlist завершает правило
Обязательный артикул товараСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->startDtdAttlist('item');
$w->text('sku CDATA ');
$w->text('#REQUIRED');
$w->endDtdAttlist();
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

Первое item — элемент, чьи атрибуты описываются; sku — имя атрибута. CDATA здесь тип атрибута в DTD, а не секция <![CDATA[...]]>. #REQUIRED требует присутствия атрибута.

Значение валюты по умолчанию в договоре DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'price');
xmlwriter_write_dtd_element($w, 'price', '(#PCDATA)');
xmlwriter_start_dtd_attlist($w, 'price');
xmlwriter_text($w, 'currency (RUB|EUR) "RUB"');
xmlwriter_end_dtd_attlist($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'price', '499');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE price [<!ELEMENT price (#PCDATA)><!ATTLIST price currency (RUB|EUR) "RUB">]><price>499</price>

Значение по умолчанию описано в DTD, но XMLWriter не дописывает currency в price. Его применение зависит от обработки DTD получателем. Для самостоятельного обмена часто понятнее явно записать атрибут.

Соседние операции: XMLWriter::endDtdAttlist(), XMLWriter::writeDtdAttlist(), XMLWriter::writeAttribute().

xmlwriter_start_dtd_attlistНачать объявление ATTLIST, чтобы описать атрибуты элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_dtd_attlist(XMLWriter $writer, string $name): bool

Начать объявление ATTLIST, чтобы описать атрибуты элемента.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя элемента, чьи атрибуты описываются; не имя одного атрибута.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startDtdAttlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Для item нужен обязательный sku
  2. startDtdAttlist(item) открывает список правил
  3. text пишет sku CDATA #REQUIRED; endDtdAttlist завершает правило
Обязательный артикул товараСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->startDtdAttlist('item');
$w->text('sku CDATA ');
$w->text('#REQUIRED');
$w->endDtdAttlist();
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

Первое item — элемент, чьи атрибуты описываются; sku — имя атрибута. CDATA здесь тип атрибута в DTD, а не секция <![CDATA[...]]>. #REQUIRED требует присутствия атрибута.

Значение валюты по умолчанию в договоре DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'price');
xmlwriter_write_dtd_element($w, 'price', '(#PCDATA)');
xmlwriter_start_dtd_attlist($w, 'price');
xmlwriter_text($w, 'currency (RUB|EUR) "RUB"');
xmlwriter_end_dtd_attlist($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'price', '499');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE price [<!ELEMENT price (#PCDATA)><!ATTLIST price currency (RUB|EUR) "RUB">]><price>499</price>

Значение по умолчанию описано в DTD, но XMLWriter не дописывает currency в price. Его применение зависит от обработки DTD получателем. Для самостоятельного обмена часто понятнее явно записать атрибут.

Соседние операции: XMLWriter::endDtdAttlist(), XMLWriter::writeDtdAttlist(), XMLWriter::writeAttribute().

XMLWriter::endDtdAttlistЗавершить открытый список объявлений атрибутов DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endDtdAttlist(): bool

Завершить открытый список объявлений атрибутов DTD.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента. Параметров нет. Для окончания обычного атрибута используется endAttribute, а не этот метод.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_dtd_attlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В ATTLIST записано правило currency
  2. endDtdAttlist завершает объявление
  3. Данные price записываются отдельно, default writer не подставляет
Обязательный артикул товараСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->startDtdAttlist('item');
$w->text('sku CDATA ');
$w->text('#REQUIRED');
$w->endDtdAttlist();
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

Первое item — элемент, чьи атрибуты описываются; sku — имя атрибута. CDATA здесь тип атрибута в DTD, а не секция <![CDATA[...]]>. #REQUIRED требует присутствия атрибута.

Значение валюты по умолчанию в договоре DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'price');
xmlwriter_write_dtd_element($w, 'price', '(#PCDATA)');
xmlwriter_start_dtd_attlist($w, 'price');
xmlwriter_text($w, 'currency (RUB|EUR) "RUB"');
xmlwriter_end_dtd_attlist($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'price', '499');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE price [<!ELEMENT price (#PCDATA)><!ATTLIST price currency (RUB|EUR) "RUB">]><price>499</price>

Значение по умолчанию описано в DTD, но XMLWriter не дописывает currency в price. Его применение зависит от обработки DTD получателем. Для самостоятельного обмена часто понятнее явно записать атрибут.

Соседние операции: XMLWriter::startDtdAttlist(), XMLWriter::writeDtdAttlist(), XMLWriter::endAttribute().

xmlwriter_end_dtd_attlistЗавершить открытый список объявлений атрибутов DTD.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_dtd_attlist(XMLWriter $writer): bool

Завершить открытый список объявлений атрибутов DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента. Параметров нет. Для окончания обычного атрибута используется endAttribute, а не этот метод.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endDtdAttlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. В ATTLIST записано правило currency
  2. endDtdAttlist завершает объявление
  3. Данные price записываются отдельно, default writer не подставляет
Обязательный артикул товараСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->startDtdAttlist('item');
$w->text('sku CDATA ');
$w->text('#REQUIRED');
$w->endDtdAttlist();
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

Первое item — элемент, чьи атрибуты описываются; sku — имя атрибута. CDATA здесь тип атрибута в DTD, а не секция <![CDATA[...]]>. #REQUIRED требует присутствия атрибута.

Значение валюты по умолчанию в договоре DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'price');
xmlwriter_write_dtd_element($w, 'price', '(#PCDATA)');
xmlwriter_start_dtd_attlist($w, 'price');
xmlwriter_text($w, 'currency (RUB|EUR) "RUB"');
xmlwriter_end_dtd_attlist($w);
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'price', '499');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE price [<!ELEMENT price (#PCDATA)><!ATTLIST price currency (RUB|EUR) "RUB">]><price>499</price>

Значение по умолчанию описано в DTD, но XMLWriter не дописывает currency в price. Его применение зависит от обработки DTD получателем. Для самостоятельного обмена часто понятнее явно записать атрибут.

Соседние операции: XMLWriter::startDtdAttlist(), XMLWriter::writeDtdAttlist(), XMLWriter::endAttribute().

XMLWriter::writeDtdAttlistЗаписать готовый список правил атрибутов одного элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::writeDtdAttlist(string $name, string $content): bool

Записать готовый список правил атрибутов одного элемента.

ПараметрЧто передать
$nameИмя элемента, к которому относятся правила.
$contentОдно или несколько объявлений атрибутов без внешнего <!ATTLIST ...>.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_dtd_attlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. item требует sku, note необязателен
  2. writeDtdAttlist записывает оба правила
  3. writeAttribute позже формирует реальный sku="B"
Готовое правило обязательного skuСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->writeDtdAttlist('item', 'sku CDATA #REQUIRED');
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

writeDtdAttlist не делает атрибут обязательным на уровне PHP: валидация выгрузки остаётся отдельным шагом.

Несколько правил атрибутов в одном объявленииСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_write_dtd_element($w, 'item', 'EMPTY');
xmlwriter_write_dtd_attlist($w, 'item', 'sku CDATA #REQUIRED note CDATA #IMPLIED');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'item');
xmlwriter_write_attribute($w, 'sku', 'B');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED note CDATA #IMPLIED>]><item sku="B"/>

Обязательный sku записан, необязательный note отсутствует. Каждое правило — тройка имя/тип/default-договор внутри строки DTD.

Соседние операции: XMLWriter::startDtdAttlist(), XMLWriter::writeDtdElement(), XMLWriter::writeAttribute().

xmlwriter_write_dtd_attlistЗаписать готовый список правил атрибутов одного элемента.

PHP 5.1.2; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_write_dtd_attlist(XMLWriter $writer, string $name, string $content): bool

Записать готовый список правил атрибутов одного элемента.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя элемента, к которому относятся правила.
$contentОдно или несколько объявлений атрибутов без внешнего <!ATTLIST ...>.

Внутри открытой DTD описывает атрибуты указанного элемента. Формат: имя атрибута, тип, правило значения. #REQUIRED — обязателен; #IMPLIED — необязателен без default; строка в кавычках — default; #FIXED со строкой — фиксированное значение. Возвращает bool. Это описание правил, не запись атрибута в экземпляр элемента.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeDtdAttlist(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. item требует sku, note необязателен
  2. writeDtdAttlist записывает оба правила
  3. writeAttribute позже формирует реальный sku="B"
Готовое правило обязательного skuСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('item');
$w->writeDtdElement('item', 'EMPTY');
$w->writeDtdAttlist('item', 'sku CDATA #REQUIRED');
$w->endDtd();
$w->startElement('item');
$w->writeAttribute('sku', 'A');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED>]><item sku="A"/>

writeDtdAttlist не делает атрибут обязательным на уровне PHP: валидация выгрузки остаётся отдельным шагом.

Несколько правил атрибутов в одном объявленииСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_write_dtd_element($w, 'item', 'EMPTY');
xmlwriter_write_dtd_attlist($w, 'item', 'sku CDATA #REQUIRED note CDATA #IMPLIED');
xmlwriter_end_dtd($w);
xmlwriter_start_element($w, 'item');
xmlwriter_write_attribute($w, 'sku', 'B');
xmlwriter_end_element($w);
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ELEMENT item EMPTY><!ATTLIST item sku CDATA #REQUIRED note CDATA #IMPLIED>]><item sku="B"/>

Обязательный sku записан, необязательный note отсутствует. Каждое правило — тройка имя/тип/default-договор внутри строки DTD.

Соседние операции: XMLWriter::startDtdAttlist(), XMLWriter::writeDtdElement(), XMLWriter::writeAttribute().

XMLWriter::startDtdEntityНачать объявление сущности DTD: обычной строки либо параметрической части DTD.

PHP 5.2.1; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::startDtdEntity(string $name, bool $isParam): bool

Начать объявление сущности DTD: обычной строки либо параметрической части DTD.

ПараметрЧто передать
$nameИмя сущности без &/% и завершающей точки с запятой.
$isParamfalse — обычная сущность; true — параметрическая, предназначенная для DTD. Аргумент обязателен у startDtdEntity.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_start_dtd_entity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Имя shop и текст Example Shop
  2. startDtdEntity(shop,false) открывает объявление обычной сущности
  3. endDtdEntity завершает его; ссылка &shop; будет записана позже
Объявить повторяемую строку брендаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->startDtdEntity('shop', false);
$w->text('Example Shop');
$w->endDtdEntity();
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

false создаёт обычную сущность. &shop; — ссылка на неё; writer записывает ссылку, а не разворачивает её. writeRaw допустим здесь только для фиксированного имени, объявленного нами же.

Параметрическая сущность используется внутри DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_start_dtd_entity($w, 'itemModel', true);
xmlwriter_text($w, '<!ELEMENT item EMPTY>');
xmlwriter_end_dtd_entity($w);
xmlwriter_write_raw($w, '%itemModel;');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'item');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ENTITY % itemModel "<!ELEMENT item EMPTY>">%itemModel;]><item/>

true создаёт параметрическую сущность, на которую ссылаются как %itemModel; в DTD. Она не предназначена для &itemModel; в содержимом item. Это специальный инструмент авторов DTD, а не замена PHP-переменной.

Соседние операции: XMLWriter::endDtdEntity(), XMLWriter::writeDtdEntity(), XMLWriter::writeRaw().

xmlwriter_start_dtd_entityНачать объявление сущности DTD: обычной строки либо параметрической части DTD.

PHP 5.2.1; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_start_dtd_entity(XMLWriter $writer, string $name, bool $isParam): bool

Начать объявление сущности DTD: обычной строки либо параметрической части DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя сущности без &/% и завершающей точки с запятой.
$isParamfalse — обычная сущность; true — параметрическая, предназначенная для DTD. Аргумент обязателен у startDtdEntity.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::startDtdEntity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Имя shop и текст Example Shop
  2. startDtdEntity(shop,false) открывает объявление обычной сущности
  3. endDtdEntity завершает его; ссылка &shop; будет записана позже
Объявить повторяемую строку брендаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->startDtdEntity('shop', false);
$w->text('Example Shop');
$w->endDtdEntity();
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

false создаёт обычную сущность. &shop; — ссылка на неё; writer записывает ссылку, а не разворачивает её. writeRaw допустим здесь только для фиксированного имени, объявленного нами же.

Параметрическая сущность используется внутри DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_start_dtd_entity($w, 'itemModel', true);
xmlwriter_text($w, '<!ELEMENT item EMPTY>');
xmlwriter_end_dtd_entity($w);
xmlwriter_write_raw($w, '%itemModel;');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'item');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ENTITY % itemModel "<!ELEMENT item EMPTY>">%itemModel;]><item/>

true создаёт параметрическую сущность, на которую ссылаются как %itemModel; в DTD. Она не предназначена для &itemModel; в содержимом item. Это специальный инструмент авторов DTD, а не замена PHP-переменной.

Соседние операции: XMLWriter::endDtdEntity(), XMLWriter::writeDtdEntity(), XMLWriter::writeRaw().

XMLWriter::endDtdEntityЗакончить текущее объявление сущности DTD.

PHP 5.2.1; примеры PHP 8.2+ · xmlwriter / libxml

XMLWriter::endDtdEntity(): bool

Закончить текущее объявление сущности DTD.

ПараметрЧто передать
Нет аргументовСостояние берётся из объекта, к которому обращаемся.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку. Метод не принимает имя и не завершает всю DTD.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_end_dtd_entity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Текст Example Shop уже записан в объявление shop
  2. endDtdEntity завершает его
  3. endDtd отделяет правила от данных brand
Объявить повторяемую строку брендаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->startDtdEntity('shop', false);
$w->text('Example Shop');
$w->endDtdEntity();
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

false создаёт обычную сущность. &shop; — ссылка на неё; writer записывает ссылку, а не разворачивает её. writeRaw допустим здесь только для фиксированного имени, объявленного нами же.

Параметрическая сущность используется внутри DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_start_dtd_entity($w, 'itemModel', true);
xmlwriter_text($w, '<!ELEMENT item EMPTY>');
xmlwriter_end_dtd_entity($w);
xmlwriter_write_raw($w, '%itemModel;');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'item');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ENTITY % itemModel "<!ELEMENT item EMPTY>">%itemModel;]><item/>

true создаёт параметрическую сущность, на которую ссылаются как %itemModel; в DTD. Она не предназначена для &itemModel; в содержимом item. Это специальный инструмент авторов DTD, а не замена PHP-переменной.

Соседние операции: XMLWriter::startDtdEntity(), XMLWriter::writeDtdEntity(), XMLWriter::endDtd().

xmlwriter_end_dtd_entityЗакончить текущее объявление сущности DTD.

PHP 5.2.1; примеры PHP 8.2+ · xmlwriter / libxml

xmlwriter_end_dtd_entity(XMLWriter $writer): bool

Закончить текущее объявление сущности DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку. Метод не принимает имя и не завершает всю DTD.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::endDtdEntity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Текст Example Shop уже записан в объявление shop
  2. endDtdEntity завершает его
  3. endDtd отделяет правила от данных brand
Объявить повторяемую строку брендаСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->startDtdEntity('shop', false);
$w->text('Example Shop');
$w->endDtdEntity();
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

false создаёт обычную сущность. &shop; — ссылка на неё; writer записывает ссылку, а не разворачивает её. writeRaw допустим здесь только для фиксированного имени, объявленного нами же.

Параметрическая сущность используется внутри DTDСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'item');
xmlwriter_start_dtd_entity($w, 'itemModel', true);
xmlwriter_text($w, '<!ELEMENT item EMPTY>');
xmlwriter_end_dtd_entity($w);
xmlwriter_write_raw($w, '%itemModel;');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'item');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE item [<!ENTITY % itemModel "<!ELEMENT item EMPTY>">%itemModel;]><item/>

true создаёт параметрическую сущность, на которую ссылаются как %itemModel; в DTD. Она не предназначена для &itemModel; в содержимом item. Это специальный инструмент авторов DTD, а не замена PHP-переменной.

Соседние операции: XMLWriter::startDtdEntity(), XMLWriter::writeDtdEntity(), XMLWriter::endDtd().

XMLWriter::writeDtdEntityЗаписать полное объявление внутренней или внешней сущности DTD.

PHP 5.2.1; nullable identifiers PHP 8.0+ · xmlwriter / libxml

XMLWriter::writeDtdEntity(string $name, string $content, bool $isParam = false, ?string $publicId = null, ?string $systemId = null, ?string $notationData = null): bool

Записать полное объявление внутренней или внешней сущности DTD.

ПараметрЧто передать
$nameИмя сущности без синтаксиса ссылки.
$contentЗначение внутренней сущности. При внешних идентификаторах задают внешнюю декларацию; это не HTTP-тело и не команда прочитать URI.
$isParamfalse — общая сущность, true — параметрическая.
$publicIdПубличный идентификатор внешней сущности либо null; для PUBLIC нужен systemId.
$systemIdСистемный идентификатор/URI внешней сущности либо null.
$notationDataИмя ранее объявленной NOTATION для неразбираемой внешней общей сущности (NDATA), либо null. Не применяется к параметрической сущности.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку. publicId/systemId/notationData официально nullable с PHP 8.0. В XMLWriter нет отдельного метода объявления NOTATION: если формат требует NDATA, её доверенное объявление включают в DTD отдельно; это продвинутый контракт, не произвольная строка в параметре.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: xmlwriter_write_dtd_entity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Для внутренней shop задан текст; для внешней legal задан SYSTEM URI
  2. writeDtdEntity формирует выбранную декларацию
  3. Загрузку/разворачивание при чтении определяет будущий парсер, не writer
Готовая внутренняя сущностьСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->writeDtdEntity('shop', 'Example Shop');
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

isParam по умолчанию false именно у writeDtdEntity. При отсутствии внешних идентификаторов content становится внутренним значением сущности.

Описать внешний ресурс как сущность, не читая егоСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'catalog');
xmlwriter_write_dtd_element($w, 'catalog', 'EMPTY');
xmlwriter_write_dtd_entity($w, 'legal', '', false, null, 'legal.txt');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'catalog');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog [<!ELEMENT catalog EMPTY><!ENTITY legal SYSTEM "legal.txt">]><catalog/>

SYSTEM выбирает внешнюю сущность; content в таком варианте не является загружаемым содержимым. legal.txt в примере не существует и не читается: создаётся только декларация.

Соседние операции: XMLWriter::startDtdEntity(), XMLWriter::writeDtd(), XMLWriter::writeRaw().

xmlwriter_write_dtd_entityЗаписать полное объявление внутренней или внешней сущности DTD.

PHP 5.2.1; nullable identifiers PHP 8.0+ · xmlwriter / libxml

xmlwriter_write_dtd_entity(XMLWriter $writer, string $name, string $content, bool $isParam = false, ?string $publicId = null, ?string $systemId = null, ?string $notationData = null): bool

Записать полное объявление внутренней или внешней сущности DTD.

ПараметрЧто передать
$writerВ процедурном вызове: подготовленный XMLWriter; это объект, начиная с PHP 8.0, а не старый ресурс.
$nameИмя сущности без синтаксиса ссылки.
$contentЗначение внутренней сущности. При внешних идентификаторах задают внешнюю декларацию; это не HTTP-тело и не команда прочитать URI.
$isParamfalse — общая сущность, true — параметрическая.
$publicIdПубличный идентификатор внешней сущности либо null; для PUBLIC нужен systemId.
$systemIdСистемный идентификатор/URI внешней сущности либо null.
$notationDataИмя ранее объявленной NOTATION для неразбираемой внешней общей сущности (NDATA), либо null. Не применяется к параметрической сущности.

Возвращает bool. Обычная сущность используется через &имя; в документе; параметрическая — через %имя; внутри DTD. Нельзя передавать внешним данным управление декларациями/URI: это отдельная граница доверия для будущего XML-парсера. XMLWriter не разворачивает сущности и не выполняет их загрузку. publicId/systemId/notationData официально nullable с PHP 8.0. В XMLWriter нет отдельного метода объявления NOTATION: если формат требует NDATA, её доверенное объявление включают в DTD отдельно; это продвинутый контракт, не произвольная строка в параметре.

Обычные операции записи возвращают true при успехе и false при отказе, например если атрибут пытаются добавить после текста. Неподготовленный объект вызывает Error; неверный тип аргумента — TypeError, некорректное имя в проверяемых операциях PHP 8 — ValueError. Успех записи не означает проверку всего документа по XML Schema/DTD. Небольшие примеры показывают порядок вызовов с известными корректными данными; в разделе надёжная выгрузка проверяется результат каждого шага.

Другая форма вызова с тем же смыслом: XMLWriter::writeDtdEntity(). В примерах ниже показаны обе формы; открытие буфера — исключение: метод возвращает bool, процедурная функция возвращает объект или false.

Что произойдёт в этом состоянии писателя
  1. Для внутренней shop задан текст; для внешней legal задан SYSTEM URI
  2. writeDtdEntity формирует выбранную декларацию
  3. Загрузку/разворачивание при чтении определяет будущий парсер, не writer
Готовая внутренняя сущностьСамостоятельный пример
<?php
$w = new XMLWriter();
if (!$w->openMemory()) {
    throw new RuntimeException('Не удалось открыть буфер');
}
$w->startDtd('brand');
$w->writeDtdElement('brand', '(#PCDATA)');
$w->writeDtdEntity('shop', 'Example Shop');
$w->endDtd();
$w->startElement('brand');
$w->writeRaw('&shop;');
$w->endElement();
echo $w->outputMemory(), "\n";
Ожидаемый результат
<!DOCTYPE brand [<!ELEMENT brand (#PCDATA)><!ENTITY shop "Example Shop">]><brand>&shop;</brand>

isParam по умолчанию false именно у writeDtdEntity. При отсутствии внешних идентификаторов content становится внутренним значением сущности.

Описать внешний ресурс как сущность, не читая егоСамостоятельный пример
<?php
$w = xmlwriter_open_memory();
if ($w === false) {
    throw new RuntimeException('Не удалось открыть буфер');
}
xmlwriter_start_dtd($w, 'catalog');
xmlwriter_write_dtd_element($w, 'catalog', 'EMPTY');
xmlwriter_write_dtd_entity($w, 'legal', '', false, null, 'legal.txt');
xmlwriter_end_dtd($w);
xmlwriter_write_element($w, 'catalog');
echo xmlwriter_output_memory($w), "
";
Ожидаемый результат
<!DOCTYPE catalog [<!ELEMENT catalog EMPTY><!ENTITY legal SYSTEM "legal.txt">]><catalog/>

SYSTEM выбирает внешнюю сущность; content в таком варианте не является загружаемым содержимым. legal.txt в примере не существует и не читается: создаётся только декларация.

Соседние операции: XMLWriter::startDtdEntity(), XMLWriter::writeDtd(), XMLWriter::writeRaw().

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.