Como gerar arquivo XML dinamicamente usando PHP?

233

Eu tenho que gerar um arquivo xml dinamicamente em tempo de execução. Por favor me ajude a gerar o arquivo XML abaixo dinamicamente usando PHP.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>

musicking123
fonte
1
Além disso, o xml 1.0 não é suportado por todos os mecanismos de pesquisa. Eu recomendo o xml 0.9 porque é a versão xml mais conhecida!
Domuta Marcel 28/08
Gerar arquivo XML usando PHP e MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@Kvvaradha que não é uma boa solução
robertmain

Respostas:

358

Eu usaria SimpleXMLElement .

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());
Ivan Krechetov
fonte
12
É possível especificar a codificação com SimpleXml? Como pode ser feito?
Eineki
1
Oi, eu tentei ur exemplo, mas na validação estou recebendo 2 warnings.how para limpá-los? validator.w3.org/…
Satya
3
@Eineki basta adicionar a <?xml version="1.0" encoding="WHATEVER_IT_IS"?>instrução de processamento. Acredito que o SimpleXMLElement fará a coisa certa: converter todos os valores de string consultados em seu mb_internal_encoding.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang
Recebo 'erro na linha 2 na coluna 6: declaração XML permitida apenas no início do documento'; o código adiciona uma linha vazia extra no início do xml, o que causa um erro de análise.
Elia Weiss
179

Para criar um XMLdocument no PHP, instale uma classe DOMDocument, crie nós filhos e acrescente esses nós na ramificação correta da árvore de documentos.

Para referência, você pode ler http://it.php.net/manual/en/book.dom.php

Agora faremos um rápido tour pelo código abaixo.

  • na linha 2, criamos um documento xml vazio (basta especificar a versão xml (1.0) e a codificação (utf8))
  • agora precisamos preencher a árvore xml:
    • Temos que criar um xmlnode (linha 5)
    • e temos que anexar isso na posição correta. Como estamos criando a raiz, anexamos isso diretamente ao documento do dom.
    • Observe que o elemento create anexa o elemento ao nó e retorna o nó inserido; nós salvamos esta referência para anexar os nós da trilha ao nó raiz (aliás chamado xml).

Estes são os princípios básicos: você pode criar e anexar um nó em apenas uma linha (13ª, por exemplo); você pode fazer muitas outras coisas com a dom api. É com você.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

Edit: Apenas mais uma dica: A principal vantagem de usar um xmldocument (o documento dom ou o simplexml) em vez de imprimir o xml é que o xmltree é pesquisável com a consulta xpath

Eineki
fonte
6
posso usar de novo $domtree->save('mypath/xmlfile.xml');?
Guitarlass
1
@guitarlass Você está certo. save e saveXML são semelhantes: o primeiro despeja o xmltree em um arquivo, o segundo em uma string (e você pode salvá-lo na etapa seguinte com as diretivas normais de salvamento de arquivos).
Eineki
4
@jjonesdesign Você tem que trabalhar duro para obter o conhecimento necessário para ser preguiçoso :)
Eineki
1
O exemplo gera uma linha longa ao invés de quebrar por elementos XML. Você precisa adicionar $domtree->formatOutput = true;para fazer a saída pretty :)
JackTheKnife
1
@Drenyl adicione um cabeçalho de tipo de conteúdo apropriado Content-Disposition: attachmente ae imprima o resultado saveXml. Você também pode sugerir um nome de arquivo.
Eineki
27

Uma maneira fácil de quebrar isso é:

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

salve-o como .php

andyk
fonte
18
fácil, mas propenso a erros quando as variáveis são interpolados que têm metacharacters XML neles tais como suportes e ampersands ângulo
Matthew Bloqueio
15

Com o FluidXML, você pode gerar seu XML com muita facilidade.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml

Daniele Orlando
fonte
2
O FluidXML na última versão suporta o PHP 5 .
Daniele Orlando
4
Uma biblioteca externa para fazer algo que pode ser feito facilmente no PHP nativo com o SimpleXML não é a solução.
Robertmain
4

Dê uma olhada no sistema de modelagem Tiny But Strong . Geralmente é usado para modelar HTML, mas há uma extensão que funciona com arquivos XML. Eu uso isso extensivamente para criar relatórios nos quais posso ter um arquivo de código e dois arquivos de modelo - htm e xml - e o usuário pode optar por enviar um relatório para a tela ou planilha.

Outra vantagem é que você não precisa codificar o xml do zero; em alguns casos, eu queria exportar planilhas complexas muito grandes e, em vez de precisar codificar toda a exportação, tudo o que é necessário é salvar uma planilha existente no xml e substitua nas tags de código em que a saída de dados é necessária. É uma maneira rápida e muito eficiente de trabalhar.

Cruachan
fonte
-14
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

É simples, basta conectar-se ao seu banco de dados, ele criará o arquivo test.xml na pasta do seu projeto

pratik
fonte
26
Esse é o tipo de código que nunca deve ver produção. Dependendo dos dados que você enviar, você poderá criar XML inválido (ou seja, não analisável). É desleixado, na melhor das hipóteses, e mesmo que pareça fácil porque você pode salvar algumas linhas de código, isso custará mais posteriormente em termos de manutenção e depuração; para não mencionar o pobre rapaz que um dia pode assumir a responsabilidade do seu trabalho.
Arne
3
-1 primeiro concanando uma string com algum wanna-be-xml e depois inserindo a string no SimpleXML - isso parece invertido. Em vez disso, primeiro inicialize o objeto da biblioteca XML e, em seguida , use-o para criar o XML. É mais fácil, usa menos memória, é menos suscetível a erros e permite transmitir o XML para arquivo ou stdout.
hakre
2
Talvez seja hora de excluir esta resposta (e você recuperará sua reputação perdida!).
Jose Manuel Abarca Rodríguez
Eu acho que deveria ficar. Eu mesmo criei um código ao trabalhar com XML e ele parecia um pouco com isso, por isso foi muito útil ver o que NÃO fazer.
Peter Højlund Andersen