2017-05-25 79 views
1

我想从我们的中央银行获取一些数据,但无法解决。 (OFC和他们不提供支持...)在PHP中str_replace似乎不起作用

$client = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?wsdl",array('trace' => 1)); 
$xml = new SimpleXMLElement($client->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult); 
echo $client->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult; 
echo (string)htmlentities($client->__getLastResponse()); 

而且我得到了这样做的结果是:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <GetCurrentExchangeRatesResult> 
    &lt;MNBCurrentExchangeRates&gt; 
     &lt;Day date="2017-05-25"&gt; 
     &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt; 
     &lt;/Day&gt; 
    &lt;/MNBCurrentExchangeRates&gt; 
    </GetCurrentExchangeRatesResult> 
</GetCurrentExchangeRatesResponse> 

这是不是很不错的处理。所以我用:

$res = (string)htmlentities($client->__getLastResponse()); 
$res = str_replace("&lt;", "<", $res); 
$res = str_replace("&gt;", ">", $res); 
echo $res; 

,由于某种原因,结果是:

&lt;MNBCurrentExchangeRates&gt; 
      &lt;Day date="2017-05-25"&gt; 
      &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt; 
      &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt; 
      &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt; 
      &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt; 
      &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt; 
      &lt;/Day&gt; 
     &lt;/MNBCurrentExchangeRates&gt; 

这比奇怪了。我想清除这些lt和gt代码,但是却从输出中丢失了部分零件。我想用simplexml来获取数据,但不管输出到哪个输出都会返回false。这是我想要使用的代码,但现在它只是给出错误消息,因为$ xml的争论是“false”;

$xml = simplexml_load_string((string)$res); 

    var_dump($xml); 

    foreach($xml->xpath('//Day') as $header) { 
    echo (string)$header->Rate; 
    } 

(它实际上给出了一个线上的结果个XML,我只是整理了一下。)

回答

0

Try this code snippet here

<?php 

ini_set('display_errors', 1); 

$string = <<<HTML 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <GetCurrentExchangeRatesResult> 
    &lt;MNBCurrentExchangeRates&gt; 
     &lt;Day date="2017-05-25"&gt; 
     &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt; 
     &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt; 
     &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt; 
     &lt;/Day&gt; 
    &lt;/MNBCurrentExchangeRates&gt; 
    </GetCurrentExchangeRatesResult> 
</GetCurrentExchangeRatesResponse> 
</s:Body> 
</s:Envelope> 
HTML; 
$xml= html_entity_decode($string); 

$domDocument = new DOMDocument(); 
$domDocument->loadXML($xml); 
$results=$domDocument->getElementsByTagName("Day"); 
foreach($results->item(0)->childNodes as $node) 
{ 
    if($node instanceof DOMElement) 
    { 
     echo $node->nodeValue; 
    } 
} 
+0

我不知道它做什么,但它给回只有连续的数字。 等一下,我觉得应该。但最后的回声并没有新的路线,所以很难看清楚。给我几分钟。 它完美的作品,谢谢! – kry

+0

@kry如果您有任何疑问,可以查看https://eval.in/805373 –

+0

不止是。接下来的目标是获取属性,而DOM文档已经做到了。现在我比我的工作提前了几天。 :) – kry