blackdarthvader
@blackdarthvader
Только учусь кодить ^_^

Как забрать данные из xml средствами php?

Здравствуйте.
Ситуация такая, есть xml файл, который присылает мне курсы валют, выглядит он так

<Result>
<Content>
<Item FirstCode="USD" SecondCode="RUB">67.966986</Item>
<Item FirstCode="CNY" SecondCode="USD">0.160033</Item>
<Item FirstCode="CNY" SecondCode="KZT">49.347697</Item>
<Item FirstCode="USD" SecondCode="KZT">314.526551</Item>
<Item FirstCode="RUB" SecondCode="CNY">0.093776</Item>
<Item FirstCode="CNY" SecondCode="KZT">49.347697</Item>
<Item FirstCode="USD" SecondCode="KZT">314.526551</Item>
<Item FirstCode="RUB" SecondCode="CNY">0.093776</Item>
</Content>
</Result>


Я переделываю его в php массив, выглядит так

public static function GetInstanceCurrencyRateList() {
        $xmlstring=file_get_contents("ссылка на файл");
        $xml = simplexml_load_string($xmlstring);
        $json = json_encode($xml);
        $array = json_decode($json,TRUE);
        print_r($array);
        //echo number_format ($array[Result][Content][Item][3], 0, '.', ' ');
    }


После чего получаем следующий массив
Array
(
    [ErrorCode] =&gt; Ok
    [SubErrorCode] =&gt; Array
        (
        )
    [Result] =&gt; Array
        (
            [Content] =&gt; Array
                (
                    [Item] =&gt; Array
                        (
                            [0] =&gt; 67.966986
                            [1] =&gt; 0.160033
                            [2] =&gt; 49.347697
                            [3] =&gt; 314.526551
                            [4] =&gt; 0.093776
                            [5] =&gt; 49.347697
                            [6] =&gt; 314.526551
                            [7] =&gt; 0.093776
                        )
                )
        )
)


Здесь меня интересует курс валюты
<Item FirstCode="USD" SecondCode="KZT">314.526551</Item>

в нашем php массиве получается
echo number_format ($array[Result][Content][Item][3], 0, '.', ' ');

но вот в чем проблема, каждый раз при обновлении курса валют, массив меняется и расположение валют в нем тоже, например если сейчас курс USD к KZT находит на 3 месте, то после обновления может стать на 5 или на 1, и поэтому забирать так не верно.
echo number_format ($array[Result][Content][Item][3], 0, '.', ' ');


Можно ли как то забирать из XML только курс USD к KZT, ведь мы имеем уже значения для определения валюты, а именно FirstCode="USD" SecondCode="KZT", но я не знаю как это сделать, кто может помочь?

Гуглить не могу, живу в Китае...
  • Вопрос задан
  • 2624 просмотра
Решения вопроса 1
@n1ger
html+css
Единственное, у вас две одинаковых строчки.
Наверное на деле неправильно скопировали.

Я могу только кривой код предложить, но он вернет, что вам надо

$currency = simplexml_load_file("test.xml");
foreach($currency->Result->Content as $v){
    $valuta = $v->Item;
    foreach($valuta as $val){
        if($val['SecondCode']=='KZT'&&$val['FirstCode']=='USD'){
            echo $val;
        }
    }
}

Вот в IF конструкции, идет проверка, если у Item параметр SecondCode равен KZT и у этого же ITEM параметр FirstCode равен USD, тогда выведем этот ITEM - но так как у вас два одинаковых Item то в вашем случае выведет оба. Но в моем решении будет все равно. в какой позиции в массива находится вам Item
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
Мне лень писать код, я тебе расскажу как надо сделать:

1) simplexml_load_string, возвращает объект класса SimpleXMLElement:
php.net/manual/en/function.simplexml-load-string.php

2) У класса SimpleXMLElement, есть метод xpath:
php.net/manual/en/simplexmlelement.xpath.php

3) В xpath можно делать выборку по аттрибутам:
www.w3schools.com/xsl/xpath_syntax.asp

По ссылкам есть примеры.

И не надо слушать говнокодеров не образованных программистов, которые для парсинга XML используют preg_match
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Юзайте: preg_match()
Vitaliy Orlov, я поясню для образованных:
1. В данном случае промежуточные звенья не содержат элементов, т.е. листовой контейнер - плоский.
2. При неверной структуре документа XML - simplexml* остановится с ошибкой и на этом всё.
3. У него есть ограничение на объем документа XML.
Поэтому, разумнее применить здесь preg_match()

PS: Алексей Уколов, Спасибо!
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
https://github.com/olamedia/nokogiri

Парсинг будет выглядеть как то так
$сontentElement= (new nokogiri(<xml строка>))->get('Content');
var_dump($сontentElement->get('Item[FirstCode="USD"]')->toText());

Под капотом тот же xpath, оверхед не большой. Тем более у вас данных мало.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы