Foros del Web » Programando para Internet » PHP »

Seleccionar datos xml

Estas en el tema de Seleccionar datos xml en el foro de PHP en Foros del Web. Hola, he programado este script que lee una base de datos en archivo xml, ademas los va numerando. El script me va perfecto pero tengo ...
  #1 (permalink)  
Antiguo 15/01/2008, 12:38
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 17 años, 10 meses
Puntos: 0
Seleccionar datos xml

Hola, he programado este script que lee una base de datos en archivo xml, ademas los va numerando. El script me va perfecto pero tengo un problemilla de principiante. Y es que no encuentro la manera de poder seleccionar según que datos del xml con foreach.

Por ejemplo, quiero seleccionar – que muestre en pantalla – los libros cuyo año de edicion sea 2003 o cuya lengua sea castellano.

<table border="1">
<?php
$x=1;
$xml = simplexml_load_file("archivo.xml");

foreach ($xml->libros as $libros) {
echo "<tr><td> " . $x++ ."</td>";
echo "<td> " . $libros->titulo ."</td>";
echo "<td> " . $libros->autor ."</td>";
echo "<td> " . $libros->editorial ."</td>";
echo "<td> " . $libros->paginas ."</td>";
echo "<td> " . $libros->lengua ."</td>";
echo "<td> " . $libros->anoedicion ."</td>";
echo "<td> " . $libros->precio ."</td>";
}
?>
</tr>
</table>


El archivo - reducido - xml es este.

<?xml version="1.0" encoding="iso-8859-1"?>
- <libros>
<titulo>CRIATURAS ABISMALES</titulo>
<autor>NOUVIAN , CLAIRE</autor>
<editorial>LA ESFERA DE LOS LIBROS, S.L.</editorial>
<paginas>952</paginas>
<lengua>castellano</lengua>
<anoedicion>2007</anoedicion>
<precio>39€</precio>
- </libros>
- <libros>
<titulo>PARAISO IMPERFECTO</titulo>
<autor>SKYE, CHRISTINA</autor>
<editorial>EDICIONES B, S.A.</editorial>
<paginas>368</paginas>
<lengua>ingles</lengua>
<anoedicion>2003</anoedicion>
<precio>16.5€</precio>
- </libros>


Haber si me podeis ayudar, a poder ser con foreach q no cambie mucho el codigo original. Gracias foreros, espero vuestras respuestas.
  #2 (permalink)  
Antiguo 16/01/2008, 05:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Seleccionar datos xml

Pues debería bastar esto...

Código PHP:
foreach ($xml->libros as $libros) {
    if ( (
$libros->anoedicion == 2003) || ($libros->lengua == "castellano") ) {
        echo 
"<tr><td> " $x++ ."</td>";
        echo 
"<td> " $libros->titulo ."</td>";
        echo 
"<td> " $libros->autor ."</td>";
        echo 
"<td> " $libros->editorial ."</td>";
        echo 
"<td> " $libros->paginas ."</td>";
        echo 
"<td> " $libros->lengua ."</td>";
        echo 
"<td> " $libros->anoedicion ."</td>";
        echo 
"<td> " $libros->precio ."</td>";
    }


Saludos.
  #3 (permalink)  
Antiguo 16/01/2008, 06:29
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: Seleccionar datos xml

Gracias Alvlin por la respuesta. Lo he probado pero la pagina se muestra en blanco. miro el codigo fuente html y solo sale esto
Código HTML:
<table border="1">
  </tr>
</table> 
por lo visto no selecciona nada. el codigo que he utilizado ha sido este
Código PHP:
foreach ($xml->libros as $libros) { 
    if ( (
$libros->anoedicion == 2003) ) { 
        echo 
"<tr><td> " $x++ ."</td>"
        echo 
"<td> " $libros->titulo ."</td>"
        echo 
"<td> " $libros->autor ."</td>"
        echo 
"<td> " $libros->editorial ."</td>"
        echo 
"<td> " $libros->paginas ."</td>"
        echo 
"<td> " $libros->lengua ."</td>"
        echo 
"<td> " $libros->anoedicion ."</td>"
        echo 
"<td> " $libros->precio ."</td>"
    } 

ya que por ahora solo busco seleccionar el año de edicion. Deberia mostrar el segundo libro del xml ya que el año de edicion es 2003. Que pasara para que ni siquiera muestre errores, solo la pagina en blanco.

Última edición por neck; 16/01/2008 a las 06:31 Razón: modificacion
  #4 (permalink)  
Antiguo 16/01/2008, 12:27
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Seleccionar datos xml

Es raro... lo que sucede en el primer caso es que no se cumple ninguna de las 2 condiciones, por eso nunca entra en el if.
No tiene mucho sentido considerando que la forma que usaste después es igual.

Por las dudas, agregá las líneas

error_reporting(E_ALL);
ini_set(display_errors, 1);

al principio del programa, y/o esto al principio del foreach:

echo $libros->anoedicion,"\n",$libros->lengua;

Hora de depurar

Saludos
  #5 (permalink)  
Antiguo 16/01/2008, 15:42
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: Seleccionar datos xml

Gracias de nuevo alvlin por estar ayudandome. Inserte el codigo y me muestra lo siguiente:

Código:
Notice: Use of undefined constant display_errors - assumed 'display_errors' in D:\Archivos de programa\AppServ\www\carlos\libros\index.php on line 4

Notice: Use of undefined constant 2003 - assumed '2003' in D:\Archivos de programa\AppServ\www\carlos\libros\index.php on line 9

Notice: Use of undefined constant 2003 - assumed '2003' in D:\Archivos de programa\AppServ\www\carlos\libros\index.php on line 9
La verda que este problema es algo que no comprendo por que el codigo que al principio me pasastes es totalmente logico y sin embargo no va.

Última edición por neck; 16/01/2008 a las 15:43 Razón: Insertsion de datos
  #6 (permalink)  
Antiguo 17/01/2008, 06:00
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Seleccionar datos xml

EL primer error es mío, en vez de ser
ini_set(display_errors, 1);

debe ser

ini_set("display_errors", 1);


¿Qué quedó exactamente en la línea 9? (copiá y pegá, por las dudas de que sea un error un tanto sutil)


Saludos.
  #7 (permalink)  
Antiguo 17/01/2008, 07:59
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: Seleccionar datos xml

Hola alvlin la verda que ahora me va perfecto, pero tengo un "pequeño" problema a la hora de querer seleccionar otro tipo de datos "caracteres" como titulo.

Te explico, este es el archivo que me va perfecto

Código PHP:
<table border="1">
<?php
error_reporting
(E_ALL);
ini_set('display_errors'1);
$x=1;
$xml simplexml_load_file("http://192.168.1.33/carlos/libros/archivo.xml");

foreach (
$xml->libros as $libros) {
    if ( (
$libros->anoedicion == 2003) ) {
        echo 
"<tr><td> " $x++ ."</td>";
        echo 
"<td> " $libros->titulo ."</td>";
        echo 
"<td> " $libros->autor ."</td>";
        echo 
"<td> " $libros->editorial ."</td>";
        echo 
"<td> " $libros->paginas ."</td>";
        echo 
"<td> " $libros->lengua ."</td>";
        echo 
"<td> " $libros->anoedicion ."</td>";
        echo 
"<td> " $libros->precio ."</td>";
    }
}
?>
  </tr>
</table>
Esto va perfecto, pero al querer seleccionar caracteres como ahora:


Código PHP:
<table border="1">
<?php
error_reporting
(E_ALL);
ini_set('display_errors'1);
$x=1;
$xml simplexml_load_file("http://192.168.1.33/carlos/libros/archivo.xml");

foreach (
$xml->libros as $libros) {
    if ( (
$libros->titulo == 'PARAISO IMPERFECTO') ) {
        echo 
"<tr><td> " $x++ ."</td>";
        echo 
"<td> " $libros->titulo ."</td>";
        echo 
"<td> " $libros->autor ."</td>";
        echo 
"<td> " $libros->editorial ."</td>";
        echo 
"<td> " $libros->paginas ."</td>";
        echo 
"<td> " $libros->lengua ."</td>";
        echo 
"<td> " $libros->anoedicion ."</td>";
        echo 
"<td> " $libros->precio ."</td>";
    }
}
?>
  </tr>
</table>
La pagina se muestra completamente en blanco y tampoco muestra error ninguno. simplemente es como si no existieran esos rgistros. he probado con comillas dobles, simples y sin comillas, y nada en blanco.

El Archivo xml es este:
Código PHP:
<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" ?> 
<raiz fecha_hora="17/01/2008 13:16" sistema="incitar"> 
<libros>
<titulo>CRIATURAS ABISMALES</titulo>
<autor>NOUVIAN , CLAIRE</autor>
<editorial>LA ESFERA DE LOS LIBROS, S.L.</editorial>
<paginas>952</paginas>
<lengua>castellano</lengua>
<anoedicion>2007</anoedicion>
<precio>39</precio>
</libros>
<libros>
<titulo>PARAISO IMPERFECTO</titulo>
<autor>SKYE, CHRISTINA</autor>
<editorial>EDICIONES B, S.A.</editorial>
<paginas>368</paginas>
<lengua>ingles</lengua>
<anoedicion>2003</anoedicion>
<precio>16.5</precio>
</libros>
</raiz>
Gracias alvlin me estas ayudando mucho.
  #8 (permalink)  
Antiguo 17/01/2008, 10:10
 
Fecha de Ingreso: octubre-2006
Mensajes: 173
Antigüedad: 17 años, 6 meses
Puntos: 3
Re: Seleccionar datos xml

Hola
de esta manera tu puedes extraer el contenido de un XML pero me imagino que tu
lo que quieres es extraer solo un bloque de un XML
un ejemplo
php código
Código PHP:
<table border="1">
<?php
$x
=1;
$xml simplexml_load_file("http://192.168.1.33/carlos/libros/archivo.xml");
foreach (
$xml as $libros) {
echo 
"<tr><td> " $x++ ."</td>";
echo 
"<td> " $libros ."</td>";
}
?>
  </tr>
</table>
codigo XML
Código HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<libros>
<titulo>CRIATURAS ABISMALES</titulo>
<autor>NOUVIAN , CLAIRE</autor>
<editorial>LA ESFERA DE LOS LIBROS, S.L.</editorial>
<paginas>952</paginas>
<lengua>castellano</lengua>
<anoedicion>2003</anoedicion>
<precio>39€</precio>
</libros> 
y el Resultado seria:
1 CRIATURAS ABISMALES
2 NOUVIAN , CLAIRE
3 LA ESFERA DE LOS LIBROS, S.L.
4 952
5 castellano
6 2003
7 39€
__________________
¨
  #9 (permalink)  
Antiguo 18/01/2008, 05:38
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Seleccionar datos xml

solo por si acaso, deberías hacer un var_dump de cada variable involucrada.
Así verás no solo el contenido, sino también el largo de la cadena, haciendo más fácil ver si hay alguna diferencia sutil.

En principio te sugiero poner un else dentro del foreach, para que si la comparación es falsa, te muestre algo:
Código PHP:
$tuvariable 'PARAISO IMPERFECTO';
if (
$libros->titulo == $tuvariable) {
}
else {
    
var_dump($tuvariable);
    
var_dump($libros->titulo);

Si ambos var_dump te devuelven la misma información, es un caso muy raro...
Otra prueba que podés hacer es usar strcmp para comparar las cadenas


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




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