Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/09/2007, 14:46
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 19 años
Puntos: 2
Re: Leer xml con xpath

Si tienes algún ejemplo de código que estés usando, nos ayudaría si lo publicaras, aun cuando no funcione del todo bien, para poder construir en base a esa guía.

También sería importante saber qué versión de PHP tienes y qué extensiones XML tiene habilitadas tu instalación de PHP ya que hay más de una extensión en PHP para el uso de XPath. Principalmente en PHP4 está DomXml, y en PHP5 Dom, que son parecidas, pero incompatibles.

Mientras tanto, aquí tienes un ejemplo de cómo extraer datos desde el XML que has publicado, usando la extensión Dom de PHP5:

Código PHP:
<?php

$doc 
= new DOMDocument;

$doc->Load ('coordenadas.xml');

$xpath = new DOMXpath ($doc);


/*
 * Alternativa 1
 * -------------
 * Obtener una lista de elementos con una expresión xpath, y luego obtener
 * información asociada (en este caso los atributos 'x' y 'y' del padre)
 * usando expresiones xpath relativas
 */

// Expresión xpath para obtener todas las ciudades, en español
$consulta_ciudades = 'ciudad/es_ES';

// Expresiones xpath para obtener las coordenadas de una ciudad
// (relativas al nodo de una ciudad)
$consulta_x = '../@x';
$consulta_y = '../@y';


$ciudades = $xpath->query ($consulta_ciudades);

echo 
"Ciudades:\n";
foreach (
$ciudades as $ciudad) {
    
$nombre = $ciudad->nodeValue;
    echo 
"$nombre\n";

    
$res_x = $xpath->query ($consulta_x, $ciudad);
    
$res_y = $xpath->query ($consulta_y, $ciudad);

    if (
$res_x->length > 0 && $res_y->length > 0) {
        echo 
"  Coordenadas: ";
        echo 
$res_x->item (0)->nodeValue;
        echo 
'-';
        echo 
$res_y->item (0)->nodeValue;
        echo 
"\n";
    }
}


/*
 * Alternativa 2
 * -------------
 * Obtener solo la lista inicial de elementos con una expresión xpath, y
 * luego obtener toda la información relacionada mediante manipulación DOM
 */

$consulta_ciudades = '//ciudad';

$ciudades = $xpath->query ($consulta_ciudades);

echo 
"Ciudades:\n";
foreach (
$ciudades as $ciudad) {
    
$nombre = '';

    for (
$nodo = $ciudad->firstChild; $nodo !== NULL;
         
$nodo = $nodo->nextSibling) {

        if (
$nodo->nodeName == 'es_ES') {
            
$nombre = $nodo->nodeValue;
        }

    }
    echo 
"$nombre\n";

    
$id = 0;
    
$x  = 0;
    
$y  = 0;

    foreach (
$ciudad->attributes as $atributo) {
        if (
$atributo->nodeName == 'id')
            
$id = $atributo->nodeValue;
        else if (
$atributo->nodeName == 'x')
            
$x = $atributo->nodeValue;
        else if (
$atributo->nodeName == 'y')
            
$y = $atributo->nodeValue;
    }

    if (
$id != 0)
        echo 
"  ID: $id\n";

    if (
$x != 0 && $y != 0)
        echo 
"  Coordenadas: $x - $y\n";
}

?>
Si necesitas algo más concreto o algo en particular no te queda claro, cuéntanos y vemos cómo hacerlo más claro :).