simplexmlelement registerxpathnamespace query namespace name php xml xpath

php - registerxpathnamespace - simplexmlelement::xpath(): undefined namespace prefix



Consulta XPath con PHP (3)

Aquí está el código XML con el que estoy trabajando:

<inventory> <drink> <lemonade supplier="mother" id="1"> <price>$2.50</price> <amount>20</amount> </lemonade> <lemonade supplier="mike" id="4"> <price>$3.00</price> <amount>20</amount> </lemonade> <pop supplier="store" id="2"> <price>$1.50</price> <amount>10</amount> </pop> </drink> </inventory>

Luego escribí un código simple para practicar el trabajo con XPath:

<?php $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml''); $xpathvar = new Domxpath($xmldoc); $queryResult = $xpathvar->query(''//lemonade/price''); foreach($queryResult as $result) { echo $result->textContent; } ?>

Ese código está funcionando bien, produciendo todos los valores del precio de la limonada como se esperaba. Ahora cuando cambio la cadena de consulta para seleccionar solo los elementos con un atributo establecido en un cierto valor, como

// limonada [proveedor = "madre"] / precio

o

// limonada [id = "1"] / precio

no funcionará, no producirá nada. ¿Qué estoy haciendo mal?


Esto solo está relacionado tangencialmente, pero cuando usa XPath en un documento del que conoce la estructura, no use "// algún-nombre-nombre". Es muy bueno para un ejemplo rápido, pero cuando aciertas con un gran archivo xml con esa consulta, particularmente si va seguido de algo complejo, rápidamente encontrarás problemas de rendimiento.

inventario / bebida / limonada [@ provider = "mother"] / price


Prueba esto:

//lemonade[@id="1"]/price

o

//lemonade[@supplier="mother"]/price

Sin la "@" busca elementos secundarios con ese nombre en lugar de atributos.


tienes que usar el signo @ para indicar el atributo dentro del predicado como lo hace: //lemonade[@supplier="mother"]/price , eso es todo.