Skip to content

DOM, Xml, HTML, Json e Arrays

Guilherme Nascimento edited this page Mar 5, 2018 · 4 revisions

Esta classe é Experimental

É possível converter xml para array ou json, basta adicionar Inphinit\Experimental\Dom\Document no seu script

Converter Xml para array:

Para converter para Array use o método Inphinit\Experimental\Dom\Document::toArray:

<?php
use Inphinit\Routing\Route;
use Inphinit\Experimental\Dom\Document;

Route::set('ANY', '/', function ()
{
    $doc = new Document;
    $doc->loadXML('<root><node>contents</node></root>');

    print_r($doc->toArray());
});

Retorna:

Array
(
    [root] => Array
        (
            [node] => contents
        )

)

Converter Xml para Json

Para converter para Json use o método Inphinit\Experimental\Dom\Document::toJson:

$doc = new Document;
$doc->loadXML('<root><node>contents</node></root>');

print_r($doc->toJson());

Constantes

As funções toArray e toJson possuem 3 constantes:

  • Document::SIMPLE, esta é padrão com a função toArray, ele adiciona tags normais e tags com namespace para o array ou json
  • Document::MINIMAL, esta é padrão com a função toJson, ele adiciona apenas tags normais o array ou json
  • Document::COMPLETE, esta constante adicionar tags normais, tags com namespace e atributos para o array ou json

Usando Document::SIMPLE:

$doc = new Document;
$doc->loadXML('<root xmlns:book="https://book.io"><node foo="bar" baz="foobar">contents</node><book:tag>baz</book:tag></root>');
print_r($doc->toArray(Document::SIMPLE)); // Document::SIMPLE é opcional

retorna:

Array
(
    [root] => Array
        (
            [node] => contents
            [book:tag] => baz
        )

)

Usando Document::MINIMAL:

$doc = new Document;
$doc->loadXML('<root xmlns:book="https://book.io"><node foo="bar" baz="foobar">contents</node><book:tag>baz</book:tag></root>');

print_r($doc->toArray(Document::MINIMAL));

retorna:

Array
(
    [root] => Array
        (
            [node] => contents
        )

)

Usando Document::COMPLETE:

$doc = new Document;
$doc->loadXML('<root xmlns:book="https://book.io"><node foo="bar" baz="foobar">contents</node><book:tag>baz</book:tag></root>');

print_r($doc->toArray(Document::COMPLETE));

retorna:

Array
(
    [root] => Array
        (
            [@attributes] => Array
                (
                    [xmlns:xml] => http://www.w3.org/XML/1998/namespace
                    [xmlns:book] => https://book.io
                )

            [@contents] => Array
                (
                    [node] => Array
                        (
                            [@attributes] => Array
                                (
                                    [foo] => bar
                                    [baz] => foobar
                                )

                            [@contents] => contents
                        )

                    [book:tag] => baz
                )

        )

)

Salvando o DOM para um documento

A função Inphinit\Experimental\Dom\Document::save possue 3 constantes:

  • Document::XML este é o valor padrão na função save, converte o objeto para XML e salva em um arquivo
  • Document::HTML converte o objeto para HTML e salva em um arquivo
  • Document::JSON converte o objeto para JSON e salva em um arquivo
$doc = new Document;
$doc->fromArray([
    'catalog' => [
        'book' => [
            [
                'author' => 'Stephen King',
                'title' => 'Under the Dome'
            ], [
                'author' => 'H. P. Lovecraft',
                'title' => 'The Call of Cthulhu'
            ]
        ]
    ]
]);

$doc->save('folder/foo.xml', Document::XML); //Salva para XML, o parâmetro Document::XML é opcional

Salvando para um documento Json:

$doc->save('folder/baz.json', Document::JSON);

Salvando para um documento HTML:

$doc = new Document;
$doc->fromArray([
    'html' => [
        'body' => [
            'p' => [
                'foo bar baz',
                'bar foo baz',
                'baz foo bar',
            ]
        ]
    ]
]);

$doc->save('doc.html', Document::HTML);

Array para DOM (XML ou HTML)

Criando um Xml

$xml->fromArray([
    'main' => [
        'header' => 'my header',
        'container' => [
            'section' => [
                'section 1',
                'section 2',
                'section 3'
            ]
        ],
        'footer' => 'my footer',
    ]
]);

Retorno:

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <header>my header</header>
    <container>
        <section>section 1</section>
        <section>section 2</section>
        <section>section 3</section>
    </container>
    <footer>my footer</footer>
</main>

Usando @contents

O @contents é opcional, fazer isto:

$xml->fromArray([
    'main' => 'foo bar baz'
]);

é equivalente a isto:

$xml->fromArray([
    'main' => [
        '@contents' => 'foo bar baz'
    ]
]);

O uso do @contentsse faz necessário quando precisar adicionar atributos com @attributes

Usando @attributes

A opção @attributes permite adicionar atributos para uma tag

$xml->fromArray([
    'main' => [
        'container' => [
            '@attributes' => [
                'myattr1' => 'value 1',
                'myattr2' => 'value 2'
            ],
            '@contents' => 'foo bar baz'
        ],
        'info' => 'foo bar baz info'
    ]
]);

Retorna:

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <container myattr1="value 1" myattr2="value 2">foo bar baz</container>
    <info>foo bar baz info</info>
</main>
Clone this wiki locally