¿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>


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

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


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


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


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.


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.