Pull to refresh

Comments 12

Спасибо. В 2015ом не смог найти этот пакет (плохо искал значит), если честно, хоть и первый коммит у него от 17 марта 2015 года. Я свой первый коммит сделал 19 июля 2015 года.

По-моему гораздо удобней было бы это делать через классы


Что-то типа этого
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/class.simplexmlelement.php
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();


Чукча не читатель, чукча писатель.

Точно, давно им пользовался, подзабыл ) Сейчас же в основном апи на JSON'ах делают.

но это лучше, чем код в начале
Заголовок спойлера
$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 выгрузок в интернет магазинах. Постоянно невалидные данные приходилось исправлять.
Sign up to leave a comment.

Articles