¿Cómo generar archivos XML dinámicamente usando PHP?

233

Tengo que generar un archivo xml dinámicamente en tiempo de ejecución. Por favor, ayúdame a generar el archivo XML a continuación dinámicamente 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
fuente
1
También recuerde, xml 1.0 no es compatible con todos los motores de búsqueda. ¡Te recomiendo xml 0.9 porque es la versión xml más conocida!
Domuta Marcel
Genere archivos XML usando PHP y MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@Kvvaradha que no es una buena solución
robertmain

Respuestas:

358

Yo usaría 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
fuente
12
¿Es posible especificar la codificación con SimpleXml? ¿Cómo se puede hacer?
Eineki el
1
Hola, probé tu ejemplo pero en la validación recibo 2 advertencias. ¿Cómo borrarlas? validator.w3.org/…
Satya
3
@Eineki solo agrega las <?xml version="1.0" encoding="WHATEVER_IT_IS"?>instrucciones de procesamiento. Creo que SimpleXMLElement hará lo correcto: convertir todos los valores de cadena consultados a su mb_internal_encoding.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang
Obtengo 'error en la línea 2 en la columna 6: declaración XML permitida solo al comienzo del documento'; el código agrega una línea vacía adicional al comienzo del xml que causa un error de análisis.
Elia Weiss
179

Para crear un documento XML en PHP, debe instanciar una clase DOMDocument, crear nodos secundarios y agregar estos nodos en la rama correcta del árbol de documentos.

Como referencia, puede leer http://it.php.net/manual/en/book.dom.php

Ahora haremos un recorrido rápido por el código a continuación.

  • en la línea 2 creamos un documento xml vacío (solo especifique la versión xml (1.0) y la codificación (utf8))
  • ahora necesitamos poblar el árbol xml:
    • Tenemos que crear un xmlnode (línea 5)
    • y tenemos que agregar esto en la posición correcta. Estamos creando la raíz, por lo que agregamos esto directamente al documento de dominio.
    • Tenga en cuenta que crear elemento agrega el elemento al nodo y devuelve el nodo insertado, guardamos esta referencia para agregar los nodos de seguimiento al nodo raíz (incidentalmente llamado xml).

Estos son los conceptos básicos, puede crear y agregar un nodo en solo una línea (13, por ejemplo), puede hacer muchas otras cosas con la api dom. Es tu decision.

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

Editar: solo una pista más: la principal ventaja de usar un documento xml (el documento dom o el simplexml) en lugar de imprimir el xml, es que el xmltree se puede buscar con la consulta xpath

Eineki
fuente
66
puedo usar de nuevo $domtree->save('mypath/xmlfile.xml');?
guitarlass
1
@guitarlass Tienes razón. save y saveXML son similares: el primero volca el xmltree en un archivo, el segundo en una cadena (y puede guardarlo en el siguiente paso con las directivas normales para guardar archivos).
Eineki
44
@jjonesdesign Tienes que trabajar duro para obtener el conocimiento necesario para ser flojo :)
Eineki
1
El ejemplo genera una línea larga en lugar de romper por elementos XML. Necesitas agregar $domtree->formatOutput = true;para que la salida sea bonita :)
JackTheKnife
1
@Drenyl agrega un encabezado de tipo de contenido apropiado y a Content-Disposition: attachmente imprime el resultado saveXml. También puede sugerir un nombre de archivo.
Eineki el
27

Una forma fácil de hacer esto es:

<?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>';

?>

guárdelo como .php

andyk
fuente
18
fácil, pero propenso a errores cuando se interpolan variables que tienen metacaracteres XML en ellas, como paréntesis angulares y signos de unión
Matthew Lock
15

Con FluidXML puede generar su XML muy fácilmente.

$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
fuente
2
FluidXML en la última versión es compatible con PHP 5 .
Daniele Orlando
44
Una biblioteca externa para hacer algo que se puede hacer fácilmente en PHP nativo con SimpleXML no es la solución.
robertmain
4

Eche un vistazo al sistema de plantillas Tiny But Strong . Generalmente se usa para crear plantillas HTML, pero hay una extensión que funciona con archivos XML. Lo uso ampliamente para crear informes donde puedo tener un archivo de código y dos archivos de plantilla, htm y xml, y el usuario puede elegir si desea enviar un informe a la pantalla o la hoja de cálculo.

Otra ventaja es que no tiene que codificar el xml desde cero, en algunos casos he querido exportar hojas de cálculo complejas muy grandes, y en lugar de tener que codificar toda la exportación, todo lo que se requiere es guardar una hoja de cálculo existente en xml y sustituto en etiquetas de código donde se requiere salida de datos. Es una forma rápida y muy eficiente de trabajar.

Cruachan
fuente
-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");

Es simple, simplemente conéctese con su base de datos, creará el archivo test.xml en la carpeta de su proyecto

pratik
fuente
26
Este es el tipo de código que nunca debería ver la producción. Dependiendo de los datos que envíe, puede crear XML no válido (es decir, no analizable). Es descuidado en el mejor de los casos, y aunque parezca fácil porque puede guardar algunas líneas de código, más tarde le costará más en términos de mantenimiento y depuración; sin mencionar al pobre tipo que algún día podría asumir la responsabilidad de tu trabajo.
Arne
3
-1 primero concanar una cadena con un poco de wanna-be-xml, luego empujar esa cadena a SimpleXML: esto parece simplemente invertido. En su lugar, primero inicialice el objeto de la biblioteca XML, luego úselo para construir el XML. Es más fácil, usa menos memoria, es menos propenso a errores y le permite transmitir el XML a un archivo o stdout.
Hakre
2
Tal vez sea hora de eliminar esta respuesta (¡y recuperarás tu reputación perdida!).
José Manuel Abarca Rodríguez
Creo que debería quedarse. Hice algo de código la primera vez que trabajé con XML y se parecía un poco a esto, por lo que fue muy útil ver qué NO hacer.
Peter Højlund Andersen