Foros del Web » Programando para Internet » PHP »

Importar XML con PHP

Estas en el tema de Importar XML con PHP en el foro de PHP en Foros del Web. Hola, buenas tardes. Como el titulo dice, estoy tratando de importar un archivo xml, obtenido de un sitio de podcast, para posteriormente utilizarlo en otro ...
  #1 (permalink)  
Antiguo 27/07/2020, 14:37
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 815
Antigüedad: 15 años, 3 meses
Puntos: 25
Importar XML con PHP

Hola, buenas tardes.

Como el titulo dice, estoy tratando de importar un archivo xml, obtenido de un sitio de podcast, para posteriormente utilizarlo en otro sitio de podcast. Para ello, estoy desarrollando un método de importación y carga.

He estado revisando varios tutoriales y guías y al parecer ya está funcionando bien, sin embargo hay un pequeño detalle...

Este es mi código hasta el momento:

Código PHP:
if(isset($_POST['upload-rss'])){
        
        
$xml trim(mysqli_real_escape_string($conn$_POST['url-rss']));        
        
$parse simplexml_load_file($xml); 
        
        
// Cabeceras del Show
        
foreach ($parse -> children() as $row) {
            
$title          $row -> title;
            
$description    $row -> description;            
            
            
$author         $row -> author;
            
$keywords       $row -> keywords;
            
$language       $row -> language;
            
$link           $row -> link;
            
$banner         $row -> image;
        }
        
        
// Obtener items de iTunes
        
$x simplexml_load_file($xml);
        
$path 'images/tmp/';

        foreach (
$x->channel->item as $item) { 
            
$otherNode $item->children('itunes'TRUE); 
            
$itunesTitle    $otherNode->title '<br>';
            
$itunesEpisode  $otherNode->episode '<br>';
            
$itunesAuthor   $otherNode->author '<br>'
            
$itunesSummary  $otherNode->summary '<br>';
            
$itunesKeywords $otherNode->keywords '<br>';
                    
            
            
$img $otherNode->image->attributes();
            
$ext substr($img, -33);
            
$permitted_chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            
$imgName 'img-' substr(str_shuffle($permitted_chars), 016) . '.' $ext;
              
            
file_put_contents($path $imgName$img);            
        }                       
    } 
Al final, cuando importo la imagen o caratula que esta usando cada item, le cambio el nombre por uno aleatorio y las descargo en una carpeta temporal. Sin embargo, cuando bajo las imágenes, estas bajan de tamaño de 1kb y cuando intento verlas, me muestra:

Cita:
"Parece que el formato de este archivo no es compatible".
¿Saben en dónde me pueda estar equivocando? De antemano, gracias por sus comentarios.

Saludos!
  #2 (permalink)  
Antiguo 27/07/2020, 22:23
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.082
Antigüedad: 12 años
Puntos: 2224
Respuesta: Importar XML con PHP

Código PHP:
Ver original
  1. $img = $otherNode->image->attributes();
  2. var_dump($img);

Supongo que con ese var_dump() solo vas a obtener atributos de la imagen, pero no la imagen misma. Tienes que obtener la URL y descargala con cURL o file_get_contents().
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 28/07/2020, 15:48
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 815
Antigüedad: 15 años, 3 meses
Puntos: 25
Respuesta: Importar XML con PHP

Hola Triby, gracias por responder!

Efectivamente, me faltaba agregar file_get_contents y con eso funcionó bien:

Código PHP:
$url $otherNode->image->attributes();
$img file_get_contents($url);
$ext substr($url, -33);
$permitted_chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$imgName 'img-' substr(str_shuffle($permitted_chars), 016) . '.' $ext;
$pathName $path $imgName;

file_put_contents($pathName$img); 
ahora, por el mismo medio descargue los archivos de audio, quedando el código de la siguiente forma:

Código PHP:
if(isset($_POST['upload-rss'])){
        
        
$xml trim(mysqli_real_escape_string($conn$_POST['url-rss']));        
        
$parse simplexml_load_file($xml); 
        
        
// Cabeceras del Show
        
foreach ($parse -> children() as $row) {
            
$title          $row -> title;
            
$description    $row -> description;            
            
            
$author         $row -> author;
            
$keywords       $row -> keywords;
            
$language       $row -> language;
            
$link           $row -> link;
            
$banner         $row -> image;           
            
        }
        
        
// Obtener items de iTunes
        
$x simplexml_load_file($xml);
        
$path 'images/tmp/';
        
$nodes 0;

        foreach (
$x->channel->item as $item) { 
            
            if(
$nodes <= 10){
            
                
$otherNode $item->children('itunes'TRUE); 
                
$itunesTitle    $otherNode->title;
                
$itunesEpisode  $otherNode->episode;
                
$itunesAuthor   $otherNode->author
                
$itunesSummary  $otherNode->summary;
                
$itunesKeywords $otherNode->keywords;


                
$url $otherNode->image->attributes();
                
$img file_get_contents($url);
                
$ext substr($url, -33);
                
$permitted_chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                
$imgName 'img-' substr(str_shuffle($permitted_chars), 016) . '.' $ext;
                
$pathName $path $imgName;

                
file_put_contents($pathName$img);              
               
            }
            
            
$nodes ++;
        }          
        
        
$xmlDoc = new DOMDocument();
        
$xmlDoc->load$xml );
        
$nodesv 0;

        
$searchNode $xmlDoc->getElementsByTagName"item" );

        foreach( 
$searchNode as $searchNode ){
            
            if(
$nodesv <= 10){
            
            
$xmlDate $searchNode->getElementsByTagName"enclosure" )->item(0)->getAttribute('url');     
            
$vid file_get_contents($xmlDate);
            
$ext substr($xmlDate, -33);
            
$permitted_chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            
$vidName 'vid-' substr(str_shuffle($permitted_chars), 016) . '.' $ext;
            
$pathName $path $vidName;
                
            
file_put_contents($pathName$vid);          
                
            }            
            
$nodesv ++;
            
        }
    } 
Ahora, de cierta forma con esto ya conseguí el objetivo al que quería llegar, obtener la información de una url, de podcasts, para poder usar la información y cargarlo en un servicio de podcast propio. Es decir, si un usuario quiere migrar su podcast de un servicio a otro ya podría hacerlo. Sin embargo, pasa lo siguiente:

1. No sé si esta es la forma correcta de hacerlo, si te das cuenta lo hago en tres fases, primero traigo los datos del programa (Cabeceras), luego traigo los items (todos los episodios que hay hasta el momento) y al final los audios (por error les puse $vid, eso luego lo cambio...)
2. No pude traer en una sola consulta, los elementos del item (iTunes) con el audio, ya que las etiquetas eran diferentes y tenía que traerlo por separado.
3. Si te das cuenta, puse una variable temporal llamada $nodes y $nodesv para solo traer 10 elementos, esto debido a que si es una url con muchos items (tengo uno de prueba de alrededor de 80), tarda mucho tiempo en descargar las imágenes y, por ende, los audios.
4. Con relación al punto 3, ¿Cómo le hago para que el usuario haga la importación y no tenga que esperar horas mientras estos se importan? ¿Debería hacerlo en algún proceso interno del servidor para evitar esto? ¿Es decir hacerlo con una tarea programada o algo así?

Es la primera vez que trabajo con esto, así que tengo aún algunas dudas de su correcta implementación.

De antemano, agradezco por sus comentarios! Saludos!
  #4 (permalink)  
Antiguo 29/07/2020, 09:34
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.082
Antigüedad: 12 años
Puntos: 2224
Respuesta: Importar XML con PHP

Podrías crear una tabla en la base de datos donde almacenes los elementos que se tienen que descargar y ejecutar una tarea programada para realizar las descargas y eliminar los registros de elementos que ya se descargaron.
__________________
- León, Guanajuato
- GV-Foto



La zona horaria es GMT -6. Ahora son las 19:28.