Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/09/2007, 14:46
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
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 && $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 != && $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 :).