Пример работы с xml Bitrix на примере получения курса валют с ЦБ

  • 2020-02-15
  • Дмитрий М.
  • 284

Пример работы с xml Bitrix на примере получения курса валют с ЦБ

<p> Напишем класс для получения списка и конвертации курсов валют. Информацию о курсах валют к рублю будем получить с сайта ЦБ (<a href="https://www.cbr.ru/scripts/XML_daily.asp">https://www.cbr.ru/scripts/XML_daily.asp</a>) в виде XML. </p> <p> Для начала нужно получить XML данные. Получать их будем при помощи класса для работы с HTTP запросами в Bitrix - <b>HttpClient()</b>. </p> <br> <pre class="line-numbers"><code class="language-php">use Bitrix\Main\Web\HttpClient; $httpClient = new HttpClient(); $httpClient-&gt;setHeader('Content-Type', 'application/xml; charset=UTF-8', true); $httpClient-&gt;query($this-&gt;method, $this-&gt;url, $entityBody = null); $content = $httpClient-&gt;getResult();</code> </pre> <p> Теперь в переменной <b>$content</b> содержатся XML данные о курсах валют. Структура XML документа следующая: </p> <pre class="line-numbers"><code class="language-xml">&lt;ValCurs Date="15.02.2020" name="Foreign Currency Market"&gt; &lt;Valute ID="R01010"&gt; &lt;NumCode&gt;036&lt;/NumCode&gt; &lt;CharCode&gt;AUD&lt;/CharCode&gt; &lt;Nominal&gt;1&lt;/Nominal&gt; &lt;Name&gt;Австралийский доллар&lt;/Name&gt; &lt;Value&gt;42,6916&lt;/Value&gt; &lt;/Valute&gt; &lt;Valute ID="R01020A"&gt; &lt;NumCode&gt;944&lt;/NumCode&gt; &lt;CharCode&gt;AZN&lt;/CharCode&gt; &lt;Nominal&gt;1&lt;/Nominal&gt; &lt;Name&gt;Азербайджанский манат&lt;/Name&gt; &lt;Value&gt;37,4027&lt;/Value&gt; &lt;/Valute&gt; ... &lt;/ValCurs&gt; </code></pre> <p> Далее обработаем XML данные и соберём их в массив индексами которого будут коды валют. </p> <p> </p> <pre class="line-numbers"><code class="language-php">use Bitrix\Main\XML; $xml = new CDataXML(); $xml-&gt;LoadString($httpClient-&gt;getResult()); $arCurrency = []; $node = $xml-&gt;GetArray(); $Value = $xml-&gt;SelectNodes('/ValCurs/Valute/CharCode'); if ($node = $xml-&gt;SelectNodes('/ValCurs')): foreach ($node-&gt;children() as $arTabNode): $id = $arTabNode-&gt;getAttribute('ID'); foreach($arTabNode-&gt;children() as $el): $arCurrency[$id][$el-&gt;name()] = iconv("windows-1251", "UTF-8", $el-&gt;textContent()); endforeach; endforeach; endif; foreach($arCurrency as $val): $rates[$val['CharCode']] = array( 'NAME' =&gt; $val['Name'], 'CODE' =&gt; $val['CharCode'], 'VALUE' =&gt; str_replace(',', '.',$val['Value']), ); endforeach;</code></pre><br> <p> В результате мы получили массив <b>$rates</b> в котором содержаться данные о курсе валют. </p> <p> Оформим всё в виде класса <b>CurrencyRate</b>: </p> <pre class="line-numbers"><code class="language-php">use Bitrix\Main\Web\HttpClient; use Bitrix\Main\XML; class CurrencyRate{ private $method = 'GET'; private $url = "https://www.cbr.ru/scripts/XML_daily.asp"; private $arRate = []; public function __construct(){ $httpClient = new HttpClient(); $httpClient-&gt;setHeader('Content-Type', 'application/xml; charset=UTF-8', true); $httpClient-&gt;query($this-&gt;method, $this-&gt;url, $entityBody = null); $xml = new CDataXML(); $xml-&gt;LoadString($httpClient-&gt;getResult()); $arCurrency = []; $node = $xml-&gt;GetArray(); $Value = $xml-&gt;SelectNodes('/ValCurs/Valute/CharCode'); if ($node = $xml-&gt;SelectNodes('/ValCurs')): foreach ($node-&gt;children() as $arTabNode): $id = $arTabNode-&gt;getAttribute('ID'); foreach($arTabNode-&gt;children() as $el): $arCurrency[$id][$el-&gt;name()] = iconv("windows-1251", "UTF-8", $el-&gt;textContent()); endforeach; endforeach; endif; foreach($arCurrency as $val): $rates[$val['CharCode']] = array( 'NAME' =&gt; $val['Name'], 'CODE' =&gt; $val['CharCode'], 'VALUE' =&gt; str_replace(',', '.',$val['Value']), ); endforeach; $this-&gt;arRate = $rates; } public function convertRate($val, $code){ $value = $this-&gt;arRate[$code]['VALUE']*$val; return $value; } public function rateList(){ return $this-&gt;arRate; } }</code> </pre> <p> Класс содержит два метода: </p> <ol> <li><b>convertRate($val, $code)</b> - метод принимает сумму <b>$val</b> в валюте и код валюты <b>$code</b>, а возвращает значение в рублях.</li> <li><b>rateList()</b> - метод возвращает полный список курсов валют</li> </ol>

15.02.2020 22:27:00

337959.png

337959.png

Пример работы с xml Bitrix на примере получения курса валют с ЦБ

Рассмотрим пример обработки XML данных при помощи класса CDataXML на примере получения курса валют с сайта www.cbr.ru

Напишем класс для получения списка и конвертации курсов валют. Информацию о курсах валют к рублю будем получить с сайта ЦБ (https://www.cbr.ru/scripts/XML_daily.asp) в виде XML.

Для начала нужно получить XML данные. Получать их будем при помощи класса для работы с HTTP запросами в Bitrix - HttpClient().


use Bitrix\Main\Web\HttpClient;
$httpClient = new HttpClient();
$httpClient->setHeader('Content-Type', 'application/xml; charset=UTF-8', true);
$httpClient->query($this->method, $this->url, $entityBody = null);
$content = $httpClient->getResult();

Теперь в переменной $content содержатся XML данные о курсах валют. Структура XML документа следующая:

<ValCurs Date="15.02.2020" name="Foreign Currency Market">
  <Valute ID="R01010">
    <NumCode>036</NumCode>
    <CharCode>AUD</CharCode>
    <Nominal>1</Nominal>
    <Name>Австралийский доллар</Name>
    <Value>42,6916</Value>
  </Valute>
  <Valute ID="R01020A">
    <NumCode>944</NumCode>
    <CharCode>AZN</CharCode>
    <Nominal>1</Nominal>
    <Name>Азербайджанский манат</Name>
    <Value>37,4027</Value>
  </Valute>

  ...

</ValCurs>

Далее обработаем XML данные и соберём их в массив индексами которого будут коды валют.

use Bitrix\Main\XML;
$xml = new CDataXML();
    $xml->LoadString($httpClient->getResult());
    $arCurrency = [];
    $node = $xml->GetArray();
    $Value = $xml->SelectNodes('/ValCurs/Valute/CharCode');
    if ($node = $xml->SelectNodes('/ValCurs')):
      foreach ($node->children() as $arTabNode):
        $id = $arTabNode->getAttribute('ID');
        foreach($arTabNode->children() as $el):
          $arCurrency[$id][$el->name()] = iconv("windows-1251", "UTF-8", $el->textContent());
        endforeach;
      endforeach;
    endif;
    foreach($arCurrency as $val):
      $rates[$val['CharCode']] = array(
        'NAME' => $val['Name'],
        'CODE' => $val['CharCode'],
        'VALUE' => str_replace(',', '.',$val['Value']),
      );
    endforeach;

В результате мы получили массив $rates в котором содержаться данные о курсе валют.

Оформим всё в виде класса CurrencyRate:

use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\XML;
class CurrencyRate{
  private $method = 'GET';
  private $url = "https://www.cbr.ru/scripts/XML_daily.asp";
  private $arRate = [];

  public function __construct(){
    $httpClient = new HttpClient();
    $httpClient->setHeader('Content-Type', 'application/xml; charset=UTF-8', true);
    $httpClient->query($this->method, $this->url, $entityBody = null);
    $xml = new CDataXML();
    $xml->LoadString($httpClient->getResult());
    $arCurrency = [];
    $node = $xml->GetArray();
    $Value = $xml->SelectNodes('/ValCurs/Valute/CharCode');
    if ($node = $xml->SelectNodes('/ValCurs')):
      foreach ($node->children() as $arTabNode):
        $id = $arTabNode->getAttribute('ID');
        foreach($arTabNode->children() as $el):
          $arCurrency[$id][$el->name()] = iconv("windows-1251", "UTF-8", $el->textContent());
        endforeach;
      endforeach;
    endif;
    foreach($arCurrency as $val):
      $rates[$val['CharCode']] = array(
        'NAME' => $val['Name'],
        'CODE' => $val['CharCode'],
        'VALUE' => str_replace(',', '.',$val['Value']),
      );
    endforeach;
    $this->arRate = $rates;
  }

  public function convertRate($val, $code){
    $value = $this->arRate[$code]['VALUE']*$val;
    return $value;
  }

  public function rateList(){
    return $this->arRate;
  }
}

Класс содержит два метода:

  1. convertRate($val, $code) - метод принимает сумму $val в валюте и код валюты $code, а возвращает значение в рублях.
  2. rateList() - метод возвращает полный список курсов валют


Статья была полезна? Поблагодарите автора.

Возврат к списку

Другие статьи