Comments 12
пользуюсь давно таким https://github.com/spatie/array-to-xml
По-моему гораздо удобней было бы это делать через классы
class Tag
{
protected $tag;
protected $attributes;
protected $childTags = [];
public function __construct(string $tag, array $attributes = [])
{
$this->tag = $tag;
$this->attributes = $attributes;
}
public function addChildTag(Tag $tag)
{
$this->childTags[] = $tag;
}
public function addAttribute(string $title, $value = null)
{
$this->attributes[$title] = $value;
$this->childTags[] = $tag;
}
public function tagToXmlBlock()
{
$result = '<' . $this->tag . '%s>%s</' . $this->tag . '>';
$attributeString = '';
foreach ($this->attributes as $attribute => $value) {
$attributeString .= ' ' . $attribute . '="' . addslashes($value) . '"';
}
$innerTags = '';
foreach ($this->childTags as $tag) {
$innerTags .= $tag->tagToXmlBlock();
}
sprintf($result, $attributeStringm, $innerTags);
return $result;
}
public function getXmlDocument()
{
return '<?xml version="1.0" encoding="UTF-8"?>' . $this->tagToXmlBlock();
}
}
$root = new Tag('root');
$childTag = new Tag('child');
$root->addChildTag($childTag);
$root->addChildTag($childTag);
echo $root->getXmlDocument();
php.net/manual/en/simplexmlelement.addchild.php
$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');
$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');
$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');
echo $sxe->asXML();
Чукча не читатель, чукча писатель.
php.net/manual/ru/book.xmlwriter.php
php.net/manual/ru/example.xmlwriter-oop.php
В стандартной библиотеке все слишком избыточно. Ваша же 2-я ссылка с примером.
$request = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<OrdersPrint Date="{$date}" Account="{$account}" Secure="{$secure}" OrderCount="{$count}" CopyCount="{$copy}">
<Order DispathNumber="{$orderNumber}" Date="{$orderDate}"/>
</OrdersPrint>
XML;
По мне так оба варианта одной сложности, если известно, что исходные данные не будут содержать ломающих верстку символов.
Вот с SimpleXML, на который мне указали выше, все гораздо удобнее.
Конечно, XMLWriter, крут, но его, по-моему стоит использовать для чего-то большего, чем то, для чего указал автор поста:
Обычно потребность возникает при интеграции со сторонним сервисом, т.к. BetaPRO, OnTime или CDEK
смотрю народ на xmlwriter ссылается, но он не покрывает всех юзкейсов.
бывает, что уже есть массив (не важно откуда получен), и из него нужно сделать xml.
делаю так:
- из массива создается dom объект (dom объект структурно идентичен исходному массиву)
- dom объект передается в XSLTProcessor::transformToXML
- в xslt преобразовании уже создаем xml нужной структуры
на больших xml так удобнее
вот утилиты типа описанной в статье помогают закрыть 1 пункт
Нужно позаботиться о том, чтобы значения атрибутов и содержимое, заключенное в теги, не содержало спецсимволов, присущие XML
Очень хотелось донести эту информацию тем людям, которые реализовывали большинство YML выгрузок в интернет магазинах. Постоянно невалидные данные приходилось исправлять.
Конструктор XML-строки из PHP-массива