Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/02/2009, 09:46
vicent34
 
Fecha de Ingreso: febrero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta Problema con saltos de linea de XML en PHP

Saludos, esta es mi primera intervención en este foro, aunque llevo ya tiempo acudiendo a él, y siempre me ha resultado de gran ayuda .

Llevo mucho tiempo buscando una solución para este problema y no la he podido encontrar.

Intento sacar el contenido de un archivo XML para mostrarlo en un web. En concreto, quiero obtener letras de canciones a través de la API de lyricwiki.org.

Llevo poco tiempo programando en PHP, por eso busqué algun código ya realizado para obtener los datos de XML, y lo adapté a mis necesidades:

Código PHP:
<?php
$myFile
="h t t p : / / lyricwiki . o r g /api.php?artist=$artista&song=$nom&fmt=xml";
$theData file_get_contents($myFile);
$xml=( xml2array($theData));

print 
'<p>';
print(
"\n".$xml['LyricsResult']['lyrics']['value']);
print 
'</p>';
$xml ereg_replace("<br>","\r",$acti);

function 
xml2array($contents$get_attributes=1) {
    if(!
$contents) return array();
    if(!
function_exists('xml_parser_create')) {
        
//print "'xml_parser_create()' function not found!";
        
return array();
    }
    
//Get the XML parser of PHP - PHP must have this module for the parser to work
    
$parser xml_parser_create();
    
xml_parser_set_option$parserXML_OPTION_CASE_FOLDING);
    
xml_parser_set_option$parserXML_OPTION_SKIP_WHITE);
    
xml_parse_into_struct$parser$contents$xml_values );
    
xml_parser_free$parser );
    if(!
$xml_values) return;//Hmm...
    //Initializations
    
$xml_array = array();
    
$parents = array();
    
$opened_tags = array();
    
$arr = array();
    
$current = &$xml_array;
    
//Go through the tags.
    
foreach($xml_values as $data) {
        unset(
$attributes,$value);//Remove existing values, or there will be trouble
        
extract($data);//We could use the array by itself, but this cooler.
        
$result '';
        if(
$get_attributes) {//The second argument of the function decides this.
            
$result = array();
            if(isset(
$value)) $result['value'] = $value;

            
//Set the attributes too.
            
if(isset($attributes)) {
                foreach(
$attributes as $attr => $val) {
                    if(
$get_attributes == 1$result['attr'][$attr] = $val//Set all the attributes in a array called 'attr'
                    /**  :TODO: should we change the key name to '_attr'? Someone may use the tagname 'attr'. Same goes for 'value' too */
                
}
            }
        } elseif(isset(
$value)) {
            
$result $value;
        }

        
//See tag status and do the needed.
        
if($type == "open") {//The starting of the tag '<tag>'
            
$parent[$level-1] = &$current;

            if(!
is_array($current) or (!in_array($tagarray_keys($current)))) { //Insert New tag
                
$current[$tag] = $result;
                
$current = &$current[$tag];

            } else { 
//There was another element with the same tag name
                
if(isset($current[$tag][0])) {
                    
array_push($current[$tag], $result);
                } else {
                    
$current[$tag] = array($current[$tag],$result);
                }
                
$last count($current[$tag]) - 1;
                
$current = &$current[$tag][$last];
            }

        } elseif(
$type == "complete") { //Tags that ends in 1 line '<tag />'
            //See if the key is already taken.
            
if(!isset($current[$tag])) { //New Key
                
$current[$tag] = $result;

            } else { 
//If taken, put all things inside a list(array)
                
if((is_array($current[$tag]) and $get_attributes == 0)//If it is already an array...
                        
or (isset($current[$tag][0]) and is_array($current[$tag][0]) and $get_attributes == 1)) {
                    
array_push($current[$tag],$result); // ...push the new element into that array.
                
} else { //If it is not an array...
                    
$current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
                
}
            }

        } elseif(
$type == 'close') { //End of tag '</tag>'
            
$current = &$parent[$level-1];
        }
    }

    return(
$xml_array);
}
El XML de donde obtiene los datos, es
Código PHP:
 h t t p : / / lyricwiki o r g /api.php?artist=$artista&song=$nom&fmt=xml 
Dentro de la dirección estan las variables $artista y $nom, que se declaran desde la URL (Por ejemplo "mipagina.php?artista=Coldplay&nom=Clocks", lo carga como:

h t t p : / / lyricwiki . o r g /api.php?artist=Coldplay&song=Clocks&fmt=xml

Hasta aquí, todo va bien. El problema es que el código XML tiene saltos de línea, y al cargar los datos por php se pierden.

¿Alguien conoce alguna solución?

NOTA: He espaciado las direcciones porque el filtro anti-spam no me deja incluirlas.

Última edición por vicent34; 07/02/2009 a las 12:54