2016-09-05 4 views
0

私は外部APIからXMLを読み込み、それをsimplexml文字列に変換しようとしています。私はcURLクロスドメインプロキシスクリプトを使用してXMLを取得していますが、XMLをsimplexml_load_string関数で実行すると、すべてが白い画面になります。外部XMLからsimplexml_load_stringが白いページを返します

JSONに簡単に変換できる方法があれば、XMLは自分の特典ではないので、私はそのルートを辿ることができます。

ここで私が使用している次のコード+ XMLです:

外部XMLファイル:

<Sensors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Sensor> 
     <ID>12</ID> 
     <Name>EFM W.level</Name> 
     <Series>Level</Series> 
     <Unit>m</Unit> 
    </Sensor> 
    <Sensor> 
     <ID>13</ID> 
     <Name>EFM Wave h.</Name> 
     <Series>Height</Series> 
     <Unit>m</Unit> 
    </Sensor> 
</Sensors> 

PHP:参照用

<?php 

    $url = 'LINK TO EXTERNAL XML'; 
    $headers = ($_POST['headers']) ? $_POST['headers'] : $_GET['headers']; 
    $mimeType = ($_POST['mimeType']) ? $_POST['mimeType'] : $_GET['mimeType']; 

    $session = curl_init($url); 

    if ($_POST['url']) { 
     $postvars = ''; 
     while ($element = current($_POST)) { 
      $postvars .= key($_POST).'='.$element.'&'; 
      next($_POST); 
     } 
     curl_setopt($session, CURLOPT_POST, true); 
     curl_setopt($session, CURLOPT_POSTFIELDS, $postvars); 
    } 

    curl_setopt($session, CURLOPT_HEADER, ($headers == "true") ? true : false); 
    curl_setopt($session, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 

    $response = curl_exec($session); 

    if ($mimeType != "") { 
     header("Content-Type: ".$mimeType); 
    } 

    $xml = simplexml_load_string($response); 

    print_r($xml); 

    curl_close($session); 

?> 

、i「は、クロスドメインのプロキシスクリプトは、使用している - https://github.com/abdul/php-proxy/blob/master/proxy.php

ありがとう。

+0

あなたは '$ response'変数に正しい内容がありますか? – Gedweb

+0

私は$応答を返すときこれを得る - > https://s13.postimg.org/avuosdix3/Screen_Shot_2016_09_05_at_13_33_09.png –

答えて

1

XMLがUTF-16でエンコードされていることが判明しました。明らかにsimplexmlはこれを好まないので、次の正規表現を使用してUTF-8に変更しました。

$xml = simplexml_load_string(preg_replace('/(<\?xml[^?]+?)utf-16/i', '$1utf-8', $response)); 
+0

あなたはXMLが壊れた/間違ったエンコーディングを宣言し、それを修正したということです。 XML宣言のエンコーディング値を置き換えても、ドキュメントのエンコーディングは変更されません。作品を修正すると、UTF-8がUTF-16として宣言されます。 – ThW

+0

はい、出力XMLのエンコーディングを変更できません。それゆえ、なぜ私はそれが私のようにしなければならなかったのですか?私が今まで見ることができる限り、何も壊れておらず、すべてが働いています。これはラインの下で何か問題を生み出しますか? –

+0

これは、外部APIがUTF-8を返しますが、UTF-16であることを宣言していることを意味します。これは壊れています。 DOMはさまざまなエンコーディングをロードできますが、宣言はエンコーディングと一致する必要があります。 – ThW

関連する問題