simplexmlelement simplexml_load_file recorrer namespace leer imprimir con complejo php xml xpath simplexml

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



SimpleXML xpath dentro del nodo seleccionado (2)

Realizable a su nodo de contexto $ item (no tengo ninguna duda de por qué necesita ese nodo de contexto ;-)) está buscando ImageSet que a) es hijo de ImageSets (que a su vez es hijo directo de su nodo de contexto) yb) tiene el atributo Categoría con el valor primary (que ha codificado correctamente)

<?php $itemset = new SimpleXMLElement(data()); foreach ($itemset as $item) { // or something else - just some reason why you have to work with $item foreach ($item->xpath(''ImageSets/ImageSet[@Category="primary"]'') as $p) { echo $p->SwatchImage->URL; } } function data() { return <<< eox <ItemSet> <Item> <name>...</name> <id>...</id> <ImageSets> <ImageSet Category="variant"> <SwatchImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SwatchImage> <SmallImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SmallImage> </ImageSet> <ImageSet Category="primary"> <SwatchImage> <URL>primary swatch image url</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SwatchImage> <SmallImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SmallImage> </ImageSet> </ImageSets> </Item> <Item>...</Item> </ItemSet> eox; }

Tengo el siguiente archivo XML

<Item> <name>...</name> <id>...</id> <ImageSets> <ImageSet Category="variant"> <SwatchImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SwatchImage> <SmallImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SmallImage> </ImageSet> <ImageSet Category="primary"> <SwatchImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SwatchImage> <SmallImage> <URL>...</URL> <Height Units="pixels"></Height> <Width Units="pixels"></Width> </SmallImage> </ImageSet> </ImageSets> </Item> <Item>....</Item>

Luego uso PHP para iterar a través de los nodos Item dentro del archivo.

foreach ($Xml as $item){ $name = $item->name; $ID = $item->id; };

Y así. El código funciona perfectamente extrayendo nombres e Id para cada artículo.

Ahora mi problema es extraer ImageSet Category = ''primary'' -> SmallImage-> URL. Los nodos ImageSet no entran en ningún orden en particular, por lo que a veces ''primario'' será el primero, a veces ''variante'', por eso $item->ImageSets->ImageSet[1] no es una solución

Entonces, dentro de mi ciclo foreach principal, he intentado usar xpath de la siguiente manera:

$src=''''; foreach ($item->ImageSets->xpath(''//ImageSet[@Category="primary"]'') as $img){ $src = $img->MediumImage->URL; };

Sin absolutamente nada de suerte.

Cualquier idea sería apreciada.


Usted tiene un error en la expresión XPath. Si la expresión comienza con un / es relativo al documento en sí. Lo quieres en relación con el nodo actual. Esto significa que tienes dos soluciones posibles

ImageSet[@Category="primary"]

Esto se expande a child::ImageSet . ImageSet nodos del elemento ImageSet que son hijos directos del nodo de contexto.

.//ImageSet[@Category="primary"]

Se expande y se normaliza a descendant::ImageSet . ImageSet cualquier ImageSet dentro del contexto actual, incluso si no es un elemento secundario directo. El . representa el nodo actual y // cambia el eje a los descendientes.