Simplexml_load_file正在使用一个示例,但不与其他示例一起使用

时间:2017-04-06 15:01:59

标签: php html xml api simplexml

我创建了一个简单的网站来显示银行网站的货币汇率,这里是xml,我得到了这些数据:http://www.nbp.pl/kursy/xml/LastA.xml。我把它放到这样的代码中:

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

并将其转换为类似的变量:

<?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)

有效。但是如果我想从这个xml中获取这些数据,例如从昨天开始:http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05?format=xml,并且做同样的事情我只有错误:

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

第13行:

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

还有其他错误:

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

第18行:

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

这些xml有什么区别?我究竟做错了什么?你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

错误1(无效的xml):

您错过了网址末尾的?format=xml

如果您通过浏览器调用http://api.nbp.pl/api/exchangerates/tables/a/2017-04-05(没有format参数),它似乎会自动默认为XML。如果你通过脚本调用它,它似乎默认为JSON。

所以它应该可行,只需更改

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

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

错误2(来自非对象的属性):

xml看起来像这样:

<?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>
                    ....

当您尝试获取费率时,您错过了第一级节点(ExchangeRatesTable)。
添加它,它将起作用:

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