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>


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());

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


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


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


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.


-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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.