Actualización de la función XML, lectura de archivos, importación desde string y exportación XML
Una de las funciones que mas juego me ha dado últimamente para interactuar con los diferentes servicios de las webs 2.0 ha sido la función xml() y por eso le ha tocado otra actualización. Esta ultima actualización a la version 2.5 añade un nuevo tipo de limpiado del array resultante. Si el condigo XML que intentamos obtener solo utiliza valores y no atributos en los tag es innecesario utilizar dichos datos, al igual que si solo utiliza atributos en vez de valores. A fin de reducir el array resultante algo mas he añadido un nuevo sistema de limpiado que junto con "light" hace del resultado algo mas liviano para el lector. Se trata del modificador "slim". un ejemplo:
-
$datos = xml($archivo, "slim");
Ademas se le ha añadido otra nueva mejora. Antes el primer valor, solo podía ser un array, en el caso de que se quisiera pasar ese array a XML o una dirección de un archivo que contenía el XML. En la actual revisión ademas también detecta cuando se le da un texto en XML directamente como string y lo trata como si el contenido de un archivo se tratase.
Funcion xml() version 2.5
-
function xml($datos, $mode = ""){
-
if($mode == "REESCRITuRA"){
-
$valor = $datos;
-
if($valor == ""){
-
$dato = " ";
-
} else {
-
$dato = $valor;//lo deja
-
}
-
} else { //si es un objeto
-
foreach($valor as $key => $valor1){ //lo conteo
-
$dato[] = xml($valor1, $mode); //
-
} else {
-
$dato[$key] = xml($valor1, $mode); //
-
}
-
}
-
}
-
} else { //compresion del array
-
$valor = $datos;
-
if($valor == ""){
-
$dato = "";
-
} else {
-
$dato = $valor;//lo deja
-
}
-
} else { //si es un objeto o un array
-
foreach($valor as $key => $valor1){ //lo conteo
-
if($valor1["value"] != ""){
-
if($valor1["attributes"] == "" || $valor1["attributes"] == " "){
-
if($valor1["value"] == " "){
-
$dato[$key] = "";//le cambio x el value
-
} else {
-
$dato[$key] = $valor1["value"];//le cambio x el value
-
}
-
} else {
-
$dato[$key] = xml($valor1, $mode);//le dejo como esta
-
}
-
} else {
-
if($valor1["attributes"] != ""){
-
if($valor1["attributes"] == " "){
-
$dato[$key] = "";//le cambio x el attributes
-
} else {
-
$dato[$key] = $valor1["value"];//le cambio x el value
-
}
-
} else {
-
$dato[$key] = xml($valor1, $mode);//le dejo como esta
-
}
-
}
-
}
-
}
-
}
-
return $dato;
-
} else {#parseador de array
-
} else {
-
$simple = $datos;
-
}
-
$simple = str_replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?><data>", $simple);
-
$simple .= "</data>";
-
//ordenado de las variables
-
#cambio las key originales por su posicion en linea
-
foreach($index as $key => $valor){ //leo las key de los padres de linea
-
foreach($index[$key] as $key_1 => $valor_1){ //leo los numeros de linea
-
$out[$valor_1] = $vals[$valor_1]; //creo un array con los numeros de linea como keys para el ordenado
-
}
-
}
-
#ordeno el array segun salio del arhcivo fuente XML
-
#declaro las variables contenedoras de la salida
-
$num = 0;
-
#leo el array del fuente
-
foreach($out as $key => $valor){
-
#por cada open agrego un registro tag a local
-
if($valor["type"] == "open"){
-
$local[] = "[".$valor["tag"]."]"."[".$num."]";
-
}
-
#por cada close busco la ultima aparicion del tag q se cierra y lo elimino
-
if($valor["type"] == "close"){
-
}
-
#si no se abre ni se cierra, recorro el array con los local y lo imprimo en forma de ruta/array
-
if($valor["type"] == "complete"){
-
$_datos = "$"."_out";
-
$__datos = "$"."__out";//
-
foreach($local as $ruta){
-
$_datos .= $ruta;
-
$__datos .= $ruta;//
-
}
-
#al terminar el conteo del local construyo el cargador de la ruta del array de salida y lo ejecuto.
-
$_datos .= "[".$valor["tag"]."] = array(\"value\" => $"."valor[\"value\"], \"attributes\" => $"."valor[\"attributes\"]);";
-
$__datos .= "[".$valor["tag"]."] = $"."valor;";//
-
} else {
-
if($valor["type"] == "close"){
-
$num++;
-
}
-
}
-
}
-
//fin ordenado de las variables
-
if($mode == "slim"){//limpio de arrays multiples
-
return xml(xml($_out["DATA"][0], "REESCRITuRA"), "REESCRITuRA-clean");
-
}
-
if($mode == "light" || $mode == ""){//limpio de arrays multiples
-
return xml($_out["DATA"][0], "REESCRITuRA");
-
}
-
if($mode == "full"){//todos los array generados
-
return array("full" => xml($__out["DATA"][0], "REESCRITuRA"), "clean" => xml($_out["DATA"][0], "REESCRITuRA"), "values" => $vals, "lines" => $index, "original" => $simple);
-
}
-
if($mode == "clean"){//pasado por el sistema de ordenado de archivos
-
return xml($__out["DATA"][0], "REESCRITuRA");
-
}
-
} else {#array2xml
-
$array = $datos;
-
$f = $mode;
-
#declaro el encabezado de declaraci?n del XML
-
if($f != "INITIaTE"){
-
$out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-
}
-
#recorro el array actual obteniendo todos los tag si contiene mas arrays
-
foreach($array as $key => $value){ //recorro los tags repetidos
-
$out_atrib = "";
-
foreach($value["attributes"] as $atrib_name => $atrib){
-
$out_atrib .= " ".$atrib_name."=\"".$atrib."\"";
-
}
-
}
-
$out .= "<".$key.$out_atrib.">".$value["value"]."</".$key.">\n";
-
} else {
-
foreach($value as $_key => $id){ //recorro los contenidos de cada uno de los tag
-
$out .= "<".$key.">\n";
-
$out .= xml($id, "INITIaTE");
-
$out .= "</".$key.">\n";
-
}
-
}
-
}
-
return $out;
-
}
-
}
-
}
Actualización: Nueva version de esta Función. Version de XML() 3.0
[...] Actualización: Nueva version de esta Función. Version de XML() 2.5 [...]
[...] Actualización: Nueva version de esta Función. Version de XML() 2.5 [...]
Hola:
Habría un ejemplo por ahí como podría usar el arreglo resultante e insertarlo en un BD.
Gracias Javier
Una sugerencia también si podrías poner un link para bajar el script o quitar las líneas para evitar salgan cuando se copia el script.
Gracias,
Javier
Hola Javier, sobre el ejemplo, la verdad es que no, no tengo ningún ejemplo terminado para conectarlo con una DB, de todas formas ni se a que tipo de DB quieres conectarlo… si como supongo quieres pasar directamente los datos del XML seria pasar datos de array a MySQL y para eso seguramente hay alguna función en algún sitio.
Sobre la sugerencia del código, en cada bloque de código hay un link que pone PLAIN TEXT sobre cada uno que hace que se ponga en texto plano mejorando la posibilidad para copiar las funciones.. Lo de poner en los link para bajar los archivos es algo que ya pensé pero no he realizado por falta de tiempo. Si quieres modificar el plugin de Wordpress que uso para el código y implemente esa función, el que uso es iG:Syntax Hiliter.
Un saludo!
[...] Hoy toca otra actualización de una función relativamente antigua. El XML es un lenguaje de almacenamiento de datos principalmente que hoy en día se usa para casi todo, desde las API online, RSS o los principales sistemas de comunicación entre empresas o gobiernos hasta las mas simples galerías de imágenes flash o conversaciones de MSN Messenger utilizan este sistema para encapsular los datos de manera fácil para las maquinas y los humanos. Por esto es un sistema que no podemos dejar de lado en nuestras aplicaciones. Por esto me dispongo a sacar la tercera versión de la función xml(). [...]