Чтение файла и запись в таблицу?
Получаю курсы валют с сайта Центробанка в формате XML, используя функцию, которая реализована здесь.
Пришла идея следующего плана: прочитать содержимое файла построчно и записать в таблицу базы данных (код валюты, наименование и значение).
Сейчас я могу только отобразить содержимое файла
$file = __DIR__ . '/XML_daily.asp';
$file_handle = fopen($file, "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
Сам файл выглядит так:
<?xml version="1.0" encoding="windows-1251"?>
<ValCurs Date="16.01.2021" name="Foreign Currency Market">
<Valute ID="R01010"><NumCode>036</NumCode><CharCode>AUD</CharCode><Nominal>1</Nominal><Name>Австралийский доллар</Name><Value>56,8799</Value></Valute>
<Valute ID="R01020A"><NumCode>944</NumCode><CharCode>AZN</CharCode><Nominal>1</Nominal><Name>Азербайджанский манат</Name><Value>43,2874</Value></Valute>
<Valute ID="R01035"><NumCode>826</NumCode><CharCode>GBP</CharCode><Nominal>1</Nominal><Name>Фунт стерлингов Соединенного королевства</Name><Value>100,3599</Value></Valute>
//.................................
</ValCurs>
Как это сделать?
Ответы (1 шт):
Автор решения: DiD
→ Ссылка
А что сложного в чтении XML?
<?php
function xml2assoc(&$xml){
$assoc = NULL;
$n = 0;
while($xml->read()){
if($xml->nodeType == XMLReader::END_ELEMENT) break;
if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = xml2assoc($xml);
$n++;
}
else if($xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = "";
$n++;
}
else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
}
return $assoc;
}
$xml = new XMLReader();
$xml->XML(file_get_contents('https://www.cbr-xml-daily.ru/daily_utf8.xml'));
$currency_assoc = xml2assoc($xml);
print_r($currency_assoc);
$currency_vals = $currency_assoc[0]['val'];
$currency_flat = array_map(function($val){ return array_combine(array_column($val,'name'),array_column($val,'val')); }, array_column($currency_vals,'val'));
print_r($currency_flat);