使用变量用PHP-XPath解析xml提要

时间:2011-01-18 14:37:43

标签: php variables xpath

我在使用PHPXPath根据登录客户的国家/地区获取汇率时遇到问题。

供参考:PHP XPath是一个用于使用XPath搜索XML文档的php类。

我有一个包含所有客户国家和相关货币值的数据库。

到目前为止我用来获取费率的代码(来自ECB Feed)是这样的:

$Rates = new XPath();
$Rates->importFromFile("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"); 
$userRate = $Rates->getAttributes("//Cube[@currency='USD']","rate"); 

现在,我想要的是将变量作为货币值传递(上例中为USD)。 我的问题是,因为我是XPath的新手,所以是这样做的语法。假设变量名是

$user_data->GRUPPO_005

我尝试了以下解决方案,但我一直收到“意外的T_VARIABLE”错误:

$userRate = $Rates->getAttributes("//Cube[@currency='"$user_data->GRUPPO_005"']","rate"); 
$userRate = $Rates->getAttributes("//Cube[@currency='".$user_data->GRUPPO_005."']","rate"); 
$userRate = $Rates->getAttributes("//Cube[@currency='.$user_data->GRUPPO_005.']","rate"); 

我认为这是因为我对语言的了解很少,我会喜欢这一点。

2 个答案:

答案 0 :(得分:1)

好的,我不知道PHPXPath是什么,但是因为你似乎在组装字符串时遇到了麻烦,试试

$Rates->getAttributes(
    sprintf('//Cube[@currency="%s"]', $user_data->GRUPPO_005),
    'rate'
);

请参阅http://us3.php.net/manual/en/function.sprintf.php

在旁注中,有一个PEAR Package for the ECB rates,因此您只需使用它就可以省去编写自己的查询工具的麻烦。

答案 1 :(得分:0)

虽然您的问题可能已经解决,但我会为ecb.int提供一些备用代码,以防您或其他用户需要收集更新的费率。

    function getCurrencyRates( $url ){
      $doc = new DOMDocument();
      ini_set('display_errors','Off'); 
      $doc->load( $url );
      ini_set('display_errors','On'); 
      $list = $doc->getElementsByTagName( 'Cube' );

      foreach( $list as $node )
        if( $node->getAttribute( 'currency' ) )
          $rates[
            strtoupper( $node->getAttribute( 'currency' ) )] =
            floatval( $node->getAttribute( 'rate' ) );

      return $rates;
    }

    $url = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';
    $currencies_array=getCurrencyRates( $url );

    if($currencies_array > ''){
      reset($currencies_array);
    }

    if($currencies_array['USD'] > 0)
    {
      $eurtousd = 1 / $currencies_array['USD'];
    }

    if($eurtousd > 0)
    {

        $sql_update_currencies=mysql_query("UPDATE currencies SET per1usdollar='" . $eurtousd . "', lastupdated=now() WHERE iso='EUR'");

        if($sql_update_currencies){}
    }

...并继续使用您想要更新的其他货币。 您甚至可以通过对已输入至少一次的货币的ISO代码进行分组来进行自动循环。

    $sql_rates_cycle=mysql_query("SELECT iso FROM currencies group BY iso ORDER BY iso ASC");

    while(list($iso)=mysql_fetch_row($sql_rates_cycle))
    {
       //...Put code here similar to that above, 
       //using the variable $iso in place of 'USD'
    }