Gerar XML com PHP e XMLWriter

Gerar XML com PHP e XMLWriter

Olá,
Mais um exemplo de como Gerar XML com PHP e XMLWriter usando PHP5,  neste caso iremos utilizar a Classe nativa do PHP5  o XMLWriter para gerar a saída XML formatada.

Este exemplo, sem dúvidas é bem mais simples que o anterior que utiliza o DOM ou SimpleXML.

Vejamos o código:

<?
# Instancia do objeto XMLWriter
$xml = new XMLWriter;

# Cria memoria para armazenar a saida
$xml->openMemory();

# Inicia o cabeçalho do documento XML
$xml->startDocument( '1.0' , 'iso-8859-1' );

# Adiciona/Inicia um Elemento / Nó Pai <item>
$xml->startElement("item");

#  Adiciona um Nó Filho <quantidade> e valor 8
$xml->writeElement("quantidade", 8);

#  Adiciona um Nó Filho <preco> e valor 110
$xml->writeElement("preco", 110);

#  Finaliza o Nó Pai / Elemento <Item>
$xml->endElement();

#  Configura a saida do conteúdo para o formato XML
header( 'Content-type: text/xml' );

# Imprime os dados armazenados
print $xml->outputMemory(true);

# Salvando o arquivo em disco
# retorna erro se o header foi definido
# retorna erro se outputMemory já foi chamado
$file = fopen('foo.xml','w+');
fwrite($file,$xml->outputMemory(true));
fclose($file);
?>

Obs: A chamada ao método $xml->outputMemory() descarrega os dados da memória então você só consegue chama-lo uma vez, logo, para salvar o arquivo você não pode ter chamado este método ainda.

Para salvar o arquivo corretamente você deve comentar as linhas abaixo:

# header( ‘Content-type: text/xml’ );
# print $xml->outputMemory(true);

Comente as linhas abaixo para apenas exibir o XML no browser:

# $file = fopen(‘foo.xml’,’w+’);
# fwrite($file,$xml->outputMemory(true));
# fclose($file);

Referência: http://br.php.net/manual/pt_BR/book.xmlwriter.php

Por enquanto é isso galera, bom divertimento e até mais.

Este post tem 61 comentários

  1. JULIOOXX

    Boa camarada!

  2. Thiago

    Ótimo exemplo. Claro e preciso!
    Parabéns!

  3. Mônica

    Prezado Rafael,

    Necessito de uma ajudinha urgente.

    Tenho um form em html com 4 campos que tem como action uma página em php que exibe os dados digitados na página html.
    Além de exibir os dados, necessito gerar um arquivo XML com os dados digitados no form.

    Agradeço desde já a ajuda.

    1. Rafael Clares

      Mônica você precisa apenas substituir os dados do xml proposto neste exemplo pelos dados do post, ex:
      Supondo que os campos do formulário sejam nome, email e fone,

      <?php
      extract($_POST);
      // aqui o inicio do xml como no exemplo
      .
      .
      // aqui os elementos com os valores dos campos
      $xml->writeElement("nome", "$nome");
      $xml->writeElement("email", "$email");
      $xml->writeElement("fone", "$fone");
      .
      .
      //restande do xml como no exemplo
      ?>

      Obs: o extract($_POST) cria automaticamente as var $nome, $email e $fone com os valores vindos do XML
      Espero ter ajudado, mesmo pq eu não encontrei um forma de simplificar o exemplo e a explicação.
      Boa sorte

      1. Mônica

        Rafael, desculpe incomodá-lo.
        A minha página de ação ficou assim:

        openMemory();

        # Inicia o cabeçalho do documento XML
        $xml->startDocument( ‘1.0’ , ‘iso-8859-1’ );

        # Adiciona/Inicia um Elemento / Nó Pai
        #$xml->startElement(“item”);
        $xml->startElement(“Automóvel”);

        $xml->writeElement(“modelo”, “$modelo”);
        $xml->writeElement(“cor”, “$cor”);
        $xml->writeElement(“fabricante”, “$fabricante”);
        $xml->writeElement(“ano”, “$ano”);

        # Finaliza o Nó Pai / Elemento
        $xml->endElement();

        # Configura a saida do conteúdo para o formato XML
        header( ‘Content-type: text/xml’ );

        # Imprime os dados armazenados
        print $xml->outputMemory(true);

        # Salvando o arquivo em disco
        # retorna erro se o header foi definido
        # retorna erro se outputMemory já foi chamado
        #$file = fopen(‘foo.xml’,’w+’);
        $file = fopen(‘auto.xml’,’w+’);
        fwrite($file,$xml->outputMemory(true));
        fclose($file);
        ?>

        E infelizmente não acontece nada.
        Mais uma vez muito obrigada.

        1. Rafael Clares

          Mônica, não faltou o extract($_POST) ?

          extract($_POST);
          openMemory();

          # Inicia o cabeçalho do documento XML
          $xml->startDocument( ’1.0′ , ‘iso-8859-1′ );

          # Adiciona/Inicia um Elemento / Nó Pai
          #$xml->startElement(“item”);
          $xml->startElement(“Automóvel”);

          $xml->writeElement(“modelo”, “$modelo”);
          $xml->writeElement(“cor”, “$cor”);
          $xml->writeElement(“fabricante”, “$fabricante”);
          $xml->writeElement(“ano”, “$ano”);

          # Finaliza o Nó Pai / Elemento
          $xml->endElement();

          # Configura a saida do conteúdo para o formato XML
          header( ‘Content-type: text/xml’ );

          # Imprime os dados armazenados
          print $xml->outputMemory(true);

          # Salvando o arquivo em disco
          # retorna erro se o header foi definido
          # retorna erro se outputMemory já foi chamado
          #$file = fopen(‘foo.xml’,’w+’);
          $file = fopen(‘auto.xml’,’w+’);
          fwrite($file,$xml->outputMemory(true));
          fclose($file);
          ?>

  4. Mônica

    Perdão, segue o código. Coloquei o extract($_POST) sim. Veja abaixo:

    openMemory();

    # Inicia o cabeçalho do documento XML
    $xml->startDocument( ‘1.0’ , ‘iso-8859-1’ );

    # Adiciona/Inicia um Elemento / Nó Pai
    #$xml->startElement(“item”);
    $xml->startElement(“Automóvel”);

    $xml->writeElement(“modelo”, “$modelo”);
    $xml->writeElement(“cor”, “$cor”);
    $xml->writeElement(“fabricante”, “$fabricante”);
    $xml->writeElement(“ano”, “$ano”);

    # Finaliza o Nó Pai / Elemento
    $xml->endElement();

    # Configura a saida do conteúdo para o formato XML
    header( ‘Content-type: text/xml’ );

    # Imprime os dados armazenados
    print $xml->outputMemory(true);

    # Salvando o arquivo em disco
    # retorna erro se o header foi definido
    # retorna erro se outputMemory já foi chamado
    #$file = fopen(‘foo.xml’,’w+’);
    $file = fopen(‘auto.xml’,’w+’);
    fwrite($file,$xml->outputMemory(true));
    fclose($file);
    ?>

    E nada acontece.
    Desculpe pelo incômodo. Sou nova em php.
    Obrigada.

  5. Mônica

    Apesar de não aparecer no código acima tem o extract($_POST) e a Instancia do objeto XMLWriter
    $xml = new XMLWriter;

    Obrigada.

    1. Rafael Clares

      Mônica, olha só ou você imprime na tela ou salva em disco, entendeu ? os 2 não vai rolar, ao menos não nessa ordem.
      Se você precisa salvar em disco, basta fazer:


      <?
      extract($_POST);
      $xml = new XMLWriter;
      $xml->openMemory();
      $xml->startDocument( '1.0' , 'iso-8859-1' );
      $xml->startElement("Automovel");
      $xml->writeElement("modelo", "$modelo");
      $xml->writeElement("cor", "$cor");
      $xml->writeElement("fabricante", "$fabricante");
      $xml->writeElement("ano", "$ano");
      $xml->endElement();
      //header( 'Content-type: text/xml' );
      //print $xml->outputMemory(true);
      $file = fopen('auto.xml','w+');
      fwrite($file, $xml->outputMemory(true));
      fclose($file);
      ?>

      Se quer exibir na tela:

      <?
      extract($_POST);
      $xml = new XMLWriter;
      $xml->openMemory();
      $xml->startDocument( '1.0' , 'iso-8859-1' );
      $xml->startElement("Automovel");
      $xml->writeElement("modelo", "$modelo");
      $xml->writeElement("cor", "$cor");
      $xml->writeElement("fabricante", "$fabricante");
      $xml->writeElement("ano", "$ano");
      $xml->endElement();
      header( 'Content-type: text/xml' );
      print $xml->outputMemory(true);
      ?>

      Testei os 2 com e funcionou corretamente, não se esqueça que para gravar no disco precisa da permissão de gravação no diretório.

      Te mandei meu exemplo por email, mas por favor não faça perguntas por email, assim talvez possamos ajudar outras pessoas.

      obs: os 2 não dá certo porque quando ocorre a primeira vez o $xml->outputMemory(true) ele libera da memória o conteúdo.
      abraços

  6. Mônica

    Funcionou certinho como vc falou.

    Muito obrigada.

  7. Mônica

    Rafael,

    Tenho a seguinte situação:

    Na página de ação (resultado.php) preciso exibir os dados digitados no form e depois gerar o xml com estes dados. Como não conheço muito PHP, pensei em fazer isso:
    Sei que ainda vou precisar muito da sua ajuda mas não vou desistir de forma alguma!

    Obrigada.

    1. Rafael Clares

      Mônica, o ideal é que o arquivo que gera o xml faça apenas isso, porque a saída dele é em XML e qualquer outra coisa irá atrapalhar a saída…
      Evite colocar aqui nos comentários as tags < e > porque além de não aparecer acaba bagunçando o resto, não entendi o problema ainda,
      vamos fazer assim, eu acredito que você esteja tentando de toda forma mas vamos abstrair algumas informações ok.

      Então, você tem um formulário e quer que seja exibido seu conteúdo (digitado pelo usuário) e em seguida seja gravado no XML, é isso ?
      O cara tem que confirmar após ser mostrado na tela ou ao mesmo tempo que mostra também grava o arquivo ?
      O que você está fazendo é gravar o arquivo ou exibir? Se for exibir, o conteúdo deve ser exclusivamente o XML, se colocar outra coisa junto invalidará o XML.

      1. Mônica

        Tenho um form (com um action=resultado.php) chamado cadastro.html com os campos: modelo, cor, fabricante e ano.
        Após o seu correto preenchimento e clicar no botão Enviar sou direcionada a página resultado.php onde tenho que fazer duas coisas:

        1) Exibir os dados digitados no form (cadastro.html);
        2) Gravar estes dados num arquivo xml qualquer.

        O usuário pode ou não confirmar a gravação, tanto faz. A ordem é o que interessa. Primeiro visualizo os dados e depois gravo no XML.

        A minha dúvida é: Como fazer essas duas coisas?

        Mais uma vez muito obrigada.

    2. Rafael Clares

      Vê se é isso que quer fazer:

      <?php

      extract($_POST);

      print "Modelo: $modelo <br />";
      print "Cor: $cor <br />";
      print "Ano: $ano <br />";
      print "Fabricante: $fabricante <br />";

      $xml = new XMLWriter;
      $xml->openMemory();
      $xml->startDocument( '1.0' , 'iso-8859-1' );
      $xml->startElement("Automovel");
      $xml->writeElement("modelo", "$modelo");
      $xml->writeElement("cor", "$cor");
      $xml->writeElement("fabricante", "$fabricante");
      $xml->writeElement("ano", "$ano");
      $xml->endElement();
      //header( 'Content-type: text/xml' );
      //print $xml->outputMemory(true);
      $file = fopen('auto.xml','w+');
      fwrite($file, $xml->outputMemory(true));
      fclose($file);
      ?>

  8. Mônica

    É exatamente isso!

    O meu erro foi ter colocado a exibição dos dados dentro de uma table.

    Espero que a minha dúvida possa ajudar outras pessoas.

    Mais uma vez muito obrigada.

  9. Monica

    Bom dia Rafael,

    Tenho mais uma dúvida a respeito do que trocamos idéia ontem.
    Meu XML tem que gerar a data em que o arquivo foi criado.

    ex.

    O que coloco em que posição no código????

    1. Rafael Clares

      Onde vai ter a data, no XML mesmo ou no nome do arquivo ? ex: auto_10_10_2010.xml
      Mesmo pq se 2 pessoas cadastrarem ao mesmo tempo vai dar erro por que cada um estará criando o mesmo arquivo,
      pense nisso, a data atual é:
      $data = date(‘d/m/Y’); // reproduz 13/10/2010
      $data = date(‘d-m-Y’); // reproduz 13-10-2010
      Bem, acho que entendeu, você pode utilizar qualquer caracter para separar os números ali em date.

  10. Monica

    Bom dia Rafael,

    A data tem que constar na página XML gerada pelo preenchimento do cadastro.
    Portanto se entendi tenho que inserir essa linha dentro do código da página resultado.php que vc passou acima.

    Vc poderia me dizer onde devo colocá-la? Já fiz alguns testes e deu erro.

    Desculpe ficar te alugando mais estou mais acostumada com ASP e estou tendo dificuldade para fazer esse código no PHP.

    Mais uma vez agradeço a força.

    [ ]’s

    1. Rafael Clares

      Mônica, sei que está sendo o mais direta possível mas confesso que ainda não sei onde você quer colocar esse valor, por isso fica difícil eu dizer onde deve colocar o código.
      Se a data vai no XML, logo, você precisa de mais um elemento no XML, assim como tem o fabricante, ano, modelo, teria o data também.
      Se a data não precisa ir no xml e você precisa saber quando o arquivo foi gerado, você pode colocar a data no nome do arquivo, assim irá armazenar os arquivos sem que sejam substituidos.
      ex: na linha que grava o xml:
      $file = fopen(‘auto.xml’,’w+’);

      você pode alterar o nome colocando a data:
      $nomeDoXML = date(‘dmY’).”.xml”;
      $file = fopen(“$nomeDoXML”,’w+’);

      assim, você terá os arquivos com nome dessa forma: 15102010.xml (15/10/2010);

      tchau

  11. Alysson

    Rafael, Boa tarde.
    Precisava de um código que permita editar um registro de um arquivo xml, eu seleciono o item e os valores ficariam disponíveis em um form para edição…
    Vc pode indicar alguma referência?
    Obrigado.

    1. Rafael Clares

      Alysson, me desulpe não poder ajuda-lo com este código mas confesso que há algum tempo já que venho ensaiando pra escrever esse código,. infelizmente estou sem tempo e talvez no começo do ano eu o faça.; abs

  12. Carlos Sá

    Bom dia, estou tendo dificuldade ao criar o xml pois apresenta um erro , na qual estou pesquisando e gosaria de uma ajuda de vocês.
    Segue abaixo o código com o erro.

    # Instancia do objeto XMLWriter
    $xml = new XMLWriter;
    # Cria memoria para armazenar a saida
    $xml->openMemory();
    # Inicia o cabeçalho do documento XML
    $xml->startDocument( ‘1.0’ ,’iso-8859-1′);
    $xml->setIndent(true);
    # Adiciona/Inicia um Elemento / Nó Pai
    $xml->startElement(“EMPRESA”);
    $xml->writeElement(“CODIGO_EMPRE”,’254′);
    $xml->writeElement(“CODIGO_AGENTE”,’356′);
    $xml->writeElement(“DATA_CADASTRO”,’04/2011′);
    $xml->writeElement(“OBSEMP”,’O processo de licenciamento ambiental das obras foi solicitado em 22/03/2010, sendo o termo não liberado’);
    $xml->endElement();
    $file = fopen(‘../Img/xml/teste1.xml’,’w+’);
    fwrite($file,$xml->outputMemory(true));
    fclose($file);

    Apos executar aparece este erro:
    Warning: XMLWriter::outputMemory() [xmlwriter.outputmemory]: output conversion failed due to conv error, bytes 0xE3 0x6F 0x20 0x6C
    Quando retirei a metade do campo OBSEMP ele rodou , ou seja eu acho que o problema seja no tamnanho da string do $xml , gostaria de uma ajuda de vocês para resolver este problema.

    1. Rafael Clares

      Faça um teste retirando palavras com acentos e me retorne para eu poder te ajudar.
      Abs

      1. Carlos Sá

        Obrigado pela ajuda, realmente era os acentos.
        Os detalhes fazem a diferença.

        1. Rafael Clares

          Carlos, mas você precisa do texto com acento, não é ?

          Altere a linha:
          $xml->startDocument( ’1.0′ ,’iso-8859-1′);

          Para:
          $xml->startDocument( ’1.0′ ,’utf-8′);

          E faça um teste para ver se irá gravar corretamente, o correto seria com iso-8859-1 mas não custa nada tentar!
          abs

  13. Bruno Melo

    Pessoal,

    estou com uma dificuldade, estou gerando o xml como vocês estavam falando acima, mais só que se eu acessar o sistema de outra maquina e tentar gerar o xml ele gera mais não me dar a opção de salvar no meu pc só salva no servidor e pronto. Como eu faço para poder salvar no servidor e fazer o download do xml de outro pc.

  14. Bruno Melo

    estou usando no final do arquivo o seguinte:

    header(‘Content-Description: File Transfer’);
    header(‘Content-Disposition: attachment; filename=”‘.$nome_xml.'”‘);
    header(‘Content-Type: application/octet-stream’);

    header(‘Content-Transfer-Encoding: binary’);
    header(‘Content-Length: ‘ . filesize($arquivoLocal));
    header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);
    header(‘Expires: 0’);

    // Envia o arquivo para o cliente
    readfile($arquivoLocal);

    na maquina que o sistema se encontra funciona mais acessando de outro maquina não funciona

    1. Rafael Clares

      Bruno faça o seguinte:

      $fileName = “foo.xml”;
      $handler = fopen(“$fileName”,”w+”);
      fwrite($handler,$xml->outputMemory(true));
      header(“Pragma: public”);
      header(“Expires: 0”);
      header(“Cache-Control: must-revalidate, post-check=0, pre-check=0”);
      header(“Cache-Control: private”,false);
      header(“Content-type: application/force-download”);
      header(“Content-Disposition: attachment; filename=”$fileName””);
      header(“Content-Transfer-Encoding: binary”);
      readfile(“$fileName”);

      Teste em:
      http://clareslab.com.br/learn/phptoxml/download.php

      Mandei o arquivo no seu email :
      Obs: não respondo dúvidas por email, na verdade, nem as leio.
      Abraços

  15. tchelosrpMarcelo

    Bom dia,

    Eu preciso armazenar uns dados de um form, está gravando certinho no xml, porem, cada vez que eu salvo um dado diferente, ele sobrescreve o antigo.

    Como eu faço pra ele ir armazenando em sequencia?

    Obrigado.

    1. Rafael Clares

      Marcelo, o ideal é usar o XML para armazenar o resultado de um consulta e poder utiliza-lo para transportar dados de uma aplicação para outra ou algo do tipo.;
      Utilizar o XML como banco de dados é possível e também complexo, não tenho como escrever a aplicação para você mas segue a dica:
      1 – você lê o XML atual
      2 – transforma os dados do XML em array (procure no google XML2Array)
      3 – adiciona a nova informação/registro no array
      4 – salva os dados do array no XML

      Seria básicamente isso!

  16. Carlos Sá

    Novamente venho pedir a ajuda, o problema relatado antes foi resolvido colocando o $xml->startDocument( ’1.0′ ,’utf-8′), mais preciso gerar em iso-8859-1, alguém sabe o porque não está gerando com acentos ???

    # Instancia do objeto XMLWriter
    $xml = new XMLWriter;
    # Cria memoria para armazenar a saida
    $xml->openMemory();
    # Inicia o cabeçalho do documento XML
    $xml->startDocument( ’1.0′ ,’iso-8859-1′);
    $xml->setIndent(true);
    # Adiciona/Inicia um Elemento / Nó Pai
    $xml->startElement(“EMPRESA”);
    $xml->writeElement(“CODIGO_EMPRE”,’254′);
    $xml->writeElement(“CODIGO_AGENTE”,’356′);
    $xml->writeElement(“DATA_CADASTRO”,’04/2011′);
    $xml->writeElement(“OBSEMP”,’O processo de licenciamento ambiental das obras foi solicitado em 22/03/2010, sendo o termo não liberado’);
    $xml->endElement();
    $file = fopen(‘../Img/xml/teste1.xml’,’w+’);
    fwrite($file,$xml->outputMemory(true));
    fclose($file);

    Apos executar aparece este erro:
    Warning: XMLWriter::outputMemory() [xmlwriter.outputmemory]: output conversion failed due to conv error, bytes 0xE3 0x6F 0×20 0x6C

    1. Rafael Clares

      Então, deixa com utf-8 e na primeira linha do arquivo que gera e também no que lê o XML coloque
      @header(‘Content-Type: text/html; charset=iso-8859-1’);

      1. Carlos Sá

        O problema que eu não tenho acesso onde lê o XML , só faço gerar e enviar.

        1. Rafael Clares

          É Carlos, daí fica um pouco ruim de te ajudar, infelizmente!

    2. Gabriel

      Bem,

      Ja tive problemas parecidos, não sei dizer se essa solução ajuda, mas segue um link :

      http://scriptbrasil.com.br/forum/index.php?showtopic=145992 ,

      Pelo que entendi, vc esta recebendo dados em formato UTF , mas precisa imprimi-los em ISO-8859-1 , então imaginei que se achasse uma solução para conversão de um formato para o outro, tu poderias trabalhar antes os dados e depois criar teu xml sem problema, a solução é o link acima.

  17. Mozart

    Excelente post! Ajudou muito, obrigadão!

  18. Jonatas

    Boa noite Rafael,
    Parabéns pelo post, me ajudou muito, mas ainda me resta uma dúvida.
    Como faço para editar este xml, incluir um novo nó ou remover?
    Abçs

    1. Rafael Clares

      Jonatas, esse é um outro assunto, realmente!
      Espero poder postar logo, enquanto isso leia os 2 novos posts sobre XML que eu criei!
      Abraços

  19. Mauricio Campos

    Boa noite, estou precisando de uma ajuda, preciso montar uma agenda de serviços no meu site onde eu tenho um calendário anual e gostaria que meus clientes ao clicar no dia desejado pudesse marcar o serviço com nome, telefone, dia ou semana, e o serviço (os) solicitados, e que caso queiram possam efetuar o pagamento do serviço (os) antecipadamente.
    Att Mauricio Campos

    1. Rafael Clares

      Mauricio, se procurar no google por “PHP calendar” verá que já existem diversas soluções prontas com a maioria das características que mencionou!
      Talvez você possa alterar/incluir mais recursos em uma delas. Fazer do zero talvez não seja a melhor opção no seu caso se você não quer ter gastos com o sistema!

  20. geovanek

    Muito excelente esse tópico…

    Só uma perguntinha, tem como eu colocar uma quebra de linha ou algo do tipo?
    No caso, estou criando esse nó.
    # –
    $xml->writeElement(“fonts”, ‘
    ‘);

    E o resultado dele fica assim:

    Mas eu gostaria de que ele ficasse assim:

    Tem como?

  21. Marco

    rafael, estou criando um app pra iPhone onde meu arquivo XML ira se atualizar uma vez por dia e servira como meu BD. Gostaria de saber se, quando gerado um novo arquivo XML, ele se escrevera em cima do outro arquivo gerado no dia anterior.

    1. Rafael Clares

      E ae, sobreviveu Marcão? rs rs
      O que você precisa nesse tipo de aplicação é o seguinte:

      – Ao invés de ter um arquivo XML gerado com dados do BD, o ideal é que você tenha um arquivo PHP que leia o BD e retorne um XML.
      Dessa forma você não precisa criar, atualizar ou apagar arquivos XML;
      Tenta postar o trecho do código que lê o banco para eu te dizer como deve ficar o arquivo final que sempre retornará um XML atualizado.
      Se preferir, coloque em um local que eu possa baixar, o XML atual que você tem e o arquivo PHP que lê o banco, ou até mesmo os nomes dos campos já ajuda, mas o ideal seria eu saber como deve ficar o XML final… daí a gente cria o PHP. Abs

  22. Marcus Vincius

    Boa noite rafael,

    Estou enfrantando dificuldades em usar o xml com um if q difere xml e json, ele da o seguinte erro “Extra content at the end of the document”, sozinho os dois codigos funciona perfeitamente!

    Seu post me ajudou muito e seu blog eh muito bem explicado e didatico, Obrigado!

    informacoes:
    link1 = http://localhost/Opcao1/gerador.php?nome=nome&sobrenome=sobrenome&telefone=telefone&email=e-mail&formato=json

    link2 = http://localhost/Opcao1/gerador.php?nome=nome&sobrenome=sobrenome&telefone=telefone&email=e-mail&formato=xml

    openMemory(); //cria memoria para saida
    $xml->startDocument( ‘1.0’ , ‘iso-8859-1’ );//inicia o cabecalho do xml
    $xml->startElement(“Cliente”); //inicia elemento “pai”
    $xml->writeElement(“NomeCompleto”, $nomeCompleto);//adiciona elemento “filho”
    $xml->writeElement(“Telefone”, $telefone);
    $xml->writeElement(“Email”, $email);
    $xml->endElement();//finaliza elemento “pai”

    header(‘Content-type: text/xml; charset=UTF-8’);
    echo $xml->outputMemory(true);//imprime conteudo xml
    echo “tesre”;
    }

    else if ($formato=”json”){ //if para json
    $cliente = array(‘Cliente’=>(array(
    ‘NomeCompleto’=>($_GET[“nome”]).($_GET[“sobrenome”]),
    ‘Telefone’=>($_GET[“telefone”]),
    ‘Email’=>($_GET[“email”]),
    )));

    $json = json_encode($cliente);
    echo $json;
    }
    ?>

    1. Rafael Clares

      Olá Marcus, cara se sozinho os 2 funcionam você pode fazer diferente, utilize a var formato para dar include em cada arquivo, ex:

      if ( isset ($_GET[‘formato’] ) )
      {
      if( $_GET[‘formato’] == ‘json’ )
      {
      include ‘gerador.json.php’;
      }
      elseif( $_GET[‘formato’] == ‘xml’ )
      {
      include ‘gerador.xml.php’;
      }
      }

      Daí você apenas separa os códigos em cada um dos arquivos.
      abs

      1. Marcus vinicius

        Muito obrigado pelo resposta, consegui fazer criando duas funcoes, uma para o json e outra pra o xml, e entao fazia a compraca com o formato e chamava a funcao, muito obrigado pelo retorno e ajuda!!

  23. Lucas

    meu caso é um pouco diferente, será que esse tipo de programação vai me ajudar ? por favor .
    Bom, vamos ao caso, eu tenho um XML já, e quero fazer um gerenciador via formulario php nele, para pessoas mais leigas não precisarem editar o arquivo xml.

    exemplo

    Azul

    Como padrão a cor é azul, quero fazer um formulario em php que eu possa mudar a cor sem ter que abrir o xml e depois salvar.

    será que consegui explicar ?

    obrigado

    1. Rafael Clares

      Lucas, alterar diretamente o XML não é muito recomendado.
      Se 2 pessoas por exemplo estiverem alterando o arquivo ao mesmo tempo é certo que ocorrerá algum erro ou divergência após o primeiro salvar o arquivo.
      No geral o XML pode ser usado como banco de dados mas é um assunto, para mim, não tão simples. O XML é comumente utilizado como “forma transporte dos dados”.
      Se você precisa de um XML o ideal é que o PHP gere um XML com base nas informações do BD, assim ao alterar o Banco o XML que será gerado estará atualizado;
      Você pode encontrar na internet alguma abordagem sobre usar o XML como banco de dados, mas para ser funcional não é tão simples.
      O maior problema está mesmo no acesso, que funcionaria assim:
      – user1 deseja alterar a cor e o sistema lê o XML e gera os dados no form, enquanto isso user2 deseja alterar outra informação, o sistema lê o XML (que ainda não foi alterado pelo user1), faz a alteração e quando o user1 salvar também sua alteração as informações do user2 serão perdidas. Isso ocorre porque para gerar um form com os dados o PHP precisa ler o XML e jogar as informações no form, no entanto,
      se outra pessoa estiver fazendo o mesmo irá prevalecer a última alteração feita.
      Para que funcione é preciso “travar o acesso do XML” de forma que só uma pessoa por vez possa abrir.
      Dê uma procurada no google “banco de dados com XML”

  24. Daniel

    Olá, Rafael Clares.
    Eu segui seu tutorial e consegui gerar o arquivo xml sem problemas. Contudo, o conteúdo do xml começa na segunda linha do arquivo, oq faz com que os navegadores não abram a visualização do arquivo. Aparece a seguinte mensagem: Erro no processamento de XML: declaração xml ou de texto fora do início da entidade

    Você passou por esse problema e/ou sabe como resolvê-lo? Desde já, obrigado

    1. Rafael Clares

      Daniel, tem algum caracter incorreto no conteúdo do arquivo.
      Abra o “visualizar código fonte” e veja se não tem nenhum caracter especial ou algo faltando;.

      1. Daniel

        Acredito que não seja o caso, pq se eu remover a linha em branco no início do arquivo xml que estou gerando, ele funciona normalmente.
        Em todo caso, vou dar uma olhada nisso e depois dou um retorno pro caso de alguém passar pelo mesmo problema 😉
        Abraço e obrigado.

        1. Rafael Clares

          Dani, então coloca lá no pastebin.com o código que gera o XML para eu ver, talvez seja o caso de remover a primeira linha em branco usando o PHP ;D

          1. Rafael Clares

            O exemplo está online? Se estiver me passa o link (não vou divulgar).
            Se não estiver, me envie o XML que é gerado no email ([email protected]).

            Abs

          2. Daniel

            Cara, muito obrigado, muito obrigado mesmo!

          3. Rafael Clares

            Bom, parece que funcionou, é isso?

          4. Daniel

            Olá, Rafael. Desculpe a demora em dar o retorno. Funcionou pra vc? Eu só consegui testar agora e o problema persiste… a função fulltrim retirou os espaços dentro do XML, até mesmo a identação do XML, mas a primeira linha em branco continua.
            Mas cara, muito obrigado pela atenção, vou ver se dou um jeito aqui.

  25. Igor Assis

    rafael boa noite.
    estou a muito tempo tentando ensinar meus funcionarios como comfigurar radios wireless e sem sucesso.
    entao estou tentando criar um fomulario onde eles iram enserir os dados como:ssid que o radio ira linkar criptografia, ip e etc onde quando eles terminarem de preencher o fomulario e salvarem, poderam importar estes dados para dentro do radio.

  26. Gericia

    Olá! Adorei o post! Estou precisando de uma ajuda!!
    Quero criar um arquivo PHP para escrever um XML.
    Mas para adicionar as informações de valores dos elementos, quero que ele pegue isso diretamente de outro XML.É possível fazer isso? como? Muito Obrigada!

Deixe um comentário