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.