Search code examples
phphtmlxmlapisimplexml

Simplexml_load_file is working with one example, but not with other one


I made a simple website to show actually currency rates from bank website, here is xml from I got these data: http://www.nbp.pl/kursy/xml/LastA.xml. I put this into a code like that:

$xml = simplexml_load_file('http://www.nbp.pl/kursy/xml/LastA.xml');

and get it to variables like that:

<?php
  for($i=0; $i<35; $i++){
        $rate = (string)$xml->pozycja[$i]->kurs_sredni;
        $name = (string)$xml->pozycja[$i]->nazwa_waluty;
        $code = (string)$xml->pozycja[$i]->kod_waluty;
      (echo here)

It works. But if I'd like to get this data from this xml, for example from yesterday: http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05?format=xml, and do the same I have only errors:

Warning: simplexml_load_file(): http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05:1: parser error : Start tag expected, '<' not found in [PATH] on line 13

Line 13:

$xml = simplexml_load_file('http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05');

And other errors:

Warning: simplexml_load_file(): [{"table":"A","no":"067/A/NBP/2017","effectiveDate":"2017-04-05","rates":[{"curr in [PATH] on line 13

Warning: simplexml_load_file(): ^ in [PATH] on line 13

Notice: Trying to get property of non-object in [PATH] on line 18

Line 18:

$rate = (string)$xml->Rate[$i]->Mid;

What is difference between these xml's? What am I doing wrong? Could You help me?


Solution

  • Error 1 (invalid xml):

    You're missing the ?format=xml at the end of the URL.

    If you call http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05 (without the format param) through a browser, it seems to default to XML automatically. If you call it through a script, it seems to default to JSON instead.

    So it should work, just by changing

    $xml = simplexml_load_file('http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05');
    

    to

    $xml = simplexml_load_file('http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05?format=xml');
    

    Error 2 (property from non-object):

    The xml looks like this:

    <?xml version="1.0" encoding="utf-8"?>
        <ArrayOfExchangeRatesTable xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ExchangeRatesTable>
                <Table>A</Table>
                <No>067/A/NBP/2017</No>
                <EffectiveDate>2017-04-05</EffectiveDate>
                <Rates>
                    <Rate>
                        <Currency>bat (Tajlandia)</Currency>
                        <Code>THB</Code>
                        <Mid>0.1151</Mid>
                    </Rate>
                    <Rate>
                        ....
    

    When you're trying to get the Rate, you're missing the first level node (ExchangeRatesTable).
    Add it and it will work:

    $rate = (string)$xml->ExchangeRatesTable->Rates->Rate[$i]->Mid