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”);

Bejegyzések (RSS)