Ma megszivatott a cimben szereplő hármas. Egy pár szimpla XPath lekérdezést akartam irni a BNR valutaárfolyam XML feedjére. Eléggé kezdő vagyok XML feldolgozásban, eddig nem nagyon használtam ilyesmit.

Olvasgattam az XPath tutorialt, a php SimpleXML dokját, s egyszerűnek tűnt az egész. Addig, amig leirtam az első lekérdezést.

Ilyesmit irtam:

$xml->xpath(”/DataSet/Body/OrigCurrency”);

Nem ment. Próbáltam direkt //OrigCurrency lekérdezést, az sem ment. Minden marhaságot végigpróbáltam, ami eszembe jutott, de eredmény nélkül.

Elkezdtem olvasgatni a php doksiban a commenteket, ahol megtaláltam a “hiba” okát. Nem kezeli rendesen az XPath implementáció a default namespacet. A BNR feedjében pedig van ilyen.

Fasz kivan, megnéztem pár minta kódot, s próbálgattam igy:

$namespaces = $xml->getNamespaces(true);
if(isset($namespaces[""]))  // if you have a default namespace
{
// register a prefix for that default namespace:
$xml->registerXPathNamespace(”d”, $namespaces[""]);
// and use that prefix in all of your xpath expressions:
$ns = “d:”;
}
else
$ns = “”;
$xml->xpath(”/”.$ns.”DataSet/Body/OrigCurrency”);

Lófasz, mert igy sem jó. Olvasgattam tovább, s aztán rájöttem, hogy itt már én vagyok a hülye. Azt a nyamvadt namespace prefixet minden element neve elé oda kell biggyeszteni.

Tehát igy néz ki a teljes lekérdezés:

$ret['date'] = $xml->xpath(”/”.$ns.”DataSet/”.$ns.”Body/”.$ns.”Cube/@date”);
$ret['orig_currency'] = $xml->xpath(”/”.$ns.”DataSet/”.$ns.”Body/”.$ns.”OrigCurrency”);

Nincs kommentelés.