alexstar/xmlmaker

A flexible PHP class for dynamic XML generation with support for attributes, repeating elements (@items), and pretty-printed output.

Installs: 1

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/alexstar/xmlmaker

1.0.0 2025-09-26 13:12 UTC

This package is not auto-updated.

Last update: 2025-10-11 11:43:38 UTC


README

PHP License

A flexible PHP class for dynamic XML generation with support for attributes, repeating elements (@items), and pretty-printed output.

Author: Alexey Starikov alexsuperstar@mail.ru
Inspired by JsonMaker

🇷🇺 Документация на русском | 🇬🇧 English version

Русский

✨ Возможности

  • Создание XML через объектный ($xml->tag = 'value') или массивный ($xml['tag'] = 'value') синтаксис
  • Задание атрибутов через зарезервированный ключ @attributes
  • Генерация повторяющихся элементов:
    • Через parse() с @items
    • Через метод addItem()
  • Форматированный XML с отступами (toPrettyXml())
  • Полная поддержка UTF-8 (включая кириллицу)
  • Автоматическое экранирование текста
  • Без внешних зависимостей
  • Совместимость с PHP 7.4+

📦 Установка

Вариант 1: Прямое подключение

Скачайте XmlMaker.php и подключите:

require_once 'XmlMaker.php';

Вариант 2: Через Composer

composer require alexstar/xmlmaker

Затем в коде:

require 'vendor/autoload.php';
use alexstar\XmlMaker;

🚀 Примеры использования

1. Простой XML

$xml = new \alexstar\XmlMaker('config');
$xml->host = 'localhost';
$xml->port = 5432;

echo $xml->toPrettyXml();

Результат:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <host>localhost</host>
  <port>5432</port>
</config>

2. Атрибуты

$xml->item->{"@attributes"}["id"] = "101";
$xml->item->name = "Товар";

<item id="101"><name>Товар</name></item>

Или через parse():

$xml->parse([
    'item' => [
        '@attributes' => ['id' => '101'],
        'name' => 'Товар'
    ]
]);

3. Повторяющиеся элементы через @itemsparse())

$xml->parse([
    'ИнфПолФХЖ1' => [
        '@items' => [
            'ТекстИнф' => [
                ['@attributes' => ['Идентиф' => 'номер_акта',    'Значен' => 'ПРМ1123456-1']],
                ['@attributes' => ['Идентиф' => 'дата_акта',     'Значен' => '07.05.2025']],
                ['@attributes' => ['Идентиф' => 'номер_заказа',  'Значен' => 'ПРМЗАК-123']],
                ['@attributes' => ['Идентиф' => 'дата_заказа',   'Значен' => '03.05.2024']],
            ]
        ]
    ]
]);

Результат:

<ИнфПолФХЖ1>
  <ТекстИнф Идентиф="номер_акта" Значен="ПРМ1123456-1"/>
  <ТекстИнф Идентиф="дата_акта" Значен="07.05.2025"/>
  <ТекстИнф Идентиф="номер_заказа" Значен="ПРМЗАК-123"/>
  <ТекстИнф Идентиф="дата_заказа" Значен="03.05.2024"/>
</ИнфПолФХЖ1>

4. Повторяющиеся элементы через addItem()

$xml->ИнфПолФХЖ1
    ->addItem('ТекстИнф', ['@attributes' => ['Идентиф' => 'номер_акта', 'Значен' => 'ПРМ1123456-1']])
    ->addItem('ТекстИнф', ['@attributes' => ['Идентиф' => 'дата_акта',  'Значен' => '07.05.2025']]);

→ То же, что и выше. Метод поддерживает цепочку вызовов.

⚠️ Важно

  • Зарезервированные ключи: @attributes, @items
  • Все данные должны быть в кодировке UTF-8
  • Пустые элементы с атрибутами выводятся как самозакрывающиеся теги
  • Класс реализует ArrayAccess, Countable, IteratorAggregate

English

🇬🇧 English documentation | 🇷🇺 Версия на русском

✨ Features

  • Build XML using object ($xml->tag = 'value') or array ($xml['tag'] = 'value') syntax
  • Set XML attributes via reserved key @attributes
  • Generate repeating elements:
    • Via parse() with @items
    • Via addItem() method (chainable)
  • Pretty-printed XML output with indentation (toPrettyXml())
  • Full UTF-8 support (including Cyrillic)
  • Automatic text escaping
  • No external dependencies
  • PHP 7.4+ compatible

📦 Installation

Option 1: Direct include

Download XmlMaker.php and include:

require_once 'XmlMaker.php';

Option 2: Via Composer

composer require alexstar/xmlmaker

Then in your code:

require 'vendor/autoload.php';
use alexstar\XmlMaker;

🚀 Usage Examples

1. Basic XML

$xml = new \alexstar\XmlMaker('config');
$xml->host = 'localhost';
$xml->port = 5432;

echo $xml->toPrettyXml();

Output:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <host>localhost</host>
  <port>5432</port>
</config>

2. Attributes

$xml->item->{"@attributes"}["id"] = "101";
$xml->item->name = "Product";

<item id="101"><name>Product</name></item>

Or via parse():

$xml->parse([
    'item' => [
        '@attributes' => ['id' => '101'],
        'name' => 'Product'
    ]
]);

3. Repeating Elements with @items (in parse())

$xml->parse([
    'InfoBlock' => [
        '@items' => [
            'TextInfo' => [
                ['@attributes' => ['Ident' => 'doc_number', 'Value' => 'PRM1123456-1']],
                ['@attributes' => ['Ident' => 'doc_date',  'Value' => '07.05.2025']],
                ['@attributes' => ['Ident' => 'order_number', 'Value' => 'PRMZAK-123']],
                ['@attributes' => ['Ident' => 'order_date',  'Value' => '03.05.2024']],
            ]
        ]
    ]
]);

Result:

<InfoBlock>
  <TextInfo Ident="doc_number" Value="PRM1123456-1"/>
  <TextInfo Ident="doc_date" Value="07.05.2025"/>
  <TextInfo Ident="order_number" Value="PRMZAK-123"/>
  <TextInfo Ident="order_date" Value="03.05.2024"/>
</InfoBlock>

4. Repeating Elements with addItem()

$xml->InfoBlock
    ->addItem('TextInfo', ['@attributes' => ['Ident' => 'doc_number', 'Value' => 'PRM1123456-1']])
    ->addItem('TextInfo', ['@attributes' => ['Ident' => 'doc_date',  'Value' => '07.05.2025']]);

→ Same result. Chainable.

⚠️ Notes

  • Reserved keys: @attributes, @items
  • Input data must be in UTF-8
  • Empty elements with attributes are rendered as self-closing tags
  • Implements ArrayAccess, Countable, IteratorAggregate

📜 License

MIT License. See LICENSE for details.