2016-10-01 16 views
1

.NET ASPサーバーへのクエリを実行し、その結果をXML文字列として取得します。StartTagで失敗したPHPのRubyスクリプトからxmlを解析する:無効な要素名< /封筒>

<?xml version="1.0" encoding="utf-8"?> 
<Envelope> 
    <Body> 
    <QueryServicesResponse> 
     <QueryServicesResult> 
     <Date>2016-01-01</Date> 
     <serviceList> 
      <service> 
      <uuid>10264b70-87ee-11e6-ae22-56b6b6499611</uuid> 
      <flight>EZY0000</flight> 
      <originName>London Heathrow</originName> 
      <originShort>LHR</originShort> 
      <destinationName>London Stansted</destinationName> 
      <destinationShort>STN</destinationShort> 
      <scheduledDeparture>2016-01-01T14:00:00</scheduledDeparture> 
      <scheduledArrival>2016-01-01T14:30:00</scheduledArrival> 
      </service> 
     </serviceList> 
     </QueryServicesResult> 
    </QueryServicesResponse> 
    </Body> 
</Envelope> 

これは、返されたボディを扱うルビースクリプトのセクションです。

# Post the request 
resp, data = http.post(path, data, headers) 

# Output the results 
doc = Nokogiri::XML(resp.body) 
doc.remove_namespaces! 
puts doc 

ruby​​スクリプトは、次のコードでPHPファイル経由で呼び出されます。

<?php 
$xml = exec("ruby test.rb EZY0000",($results)); 

$xmlparse = simplexml_load_string($xml); 
    echo $xmlparse; 
?> 

しかし、結果を解析しようとすると、次のエラーが発生します。

PHP Warning: simplexml_load_string(): Entity: line 1: parser error : StartTag: invalid element name PHP Warning: simplexml_load_string(): &lt;/Envelope&gt;

私は過去数日間であらゆる種類のものをしようとしたが、今問題にこだわったり盲目だしてきたSimpleXMLElement ObjectにXMLを解析しようとしています。私はhtmlspecialcharsを試しましたが、それはどちらも役に立たなかった。

私が考えることができるのは、これがルビスクリプトから出てくる文字列と関係していると思われますが、正しいxmlとして検証されます。

上記のXMLを使用して、次のPHPコードを使用すると、すべてが期待通りに機能し、目的の結果が得られます。

<?php 
$string = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<Envelope> 
    <Body> 
    <QueryServicesResponse> 
     <QueryServicesResult> 
     <Date>2016-01-01</Date> 
     <serviceList> 
      <service> 
      <uuid>10264b70-87ee-11e6-ae22-56b6b6499611</uuid> 
      <flight>EZY0000</flight> 
      <originName>London Heathrow</originName> 
      <originShort>LHR</originShort> 
      <destinationName>London Stansted</destinationName> 
      <destinationShort>STN</destinationShort> 
      <scheduledDeparture>2016-01-01T14:00:00</scheduledDeparture> 
      <scheduledArrival>2016-01-01T14:30:00</scheduledArrival> 
      </service> 
     </serviceList> 
     </QueryServicesResult> 
    </QueryServicesResponse> 
    </Body> 
</Envelope> 
XML; 

$xml = simplexml_load_string($string); 

print_r($xml); 
?> 

SimpleXMLElement Object 
(
    [Body] => SimpleXMLElement Object 
     (
      [QueryServicesResponse] => SimpleXMLElement Object 
       (
        [QueryServicesResult] => SimpleXMLElement Object 
         (
          [Date] => 2016-01-01 
          [serviceList] => SimpleXMLElement Object 
           (
            [service] => SimpleXMLElement Object 
             (
              [uuid] => 10264b70-87ee-11e6-ae22-56b6b6499611 
              [flight] => EZY0000 
              [originName] => London Heathrow 
              [originShort] => LHR 
              [destinationName] => London Stansted 
              [destinationShort] => STN 
              [scheduledDeparture] => 2016-01-01T14:00:00 
              [scheduledArrival] => 2016-01-01T14:30:00 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

私はどのように私はPHPで操作できる有効なオブジェクトに私のルビースクリプトからXMLを得ることができますか?何かオフラインでは、私はRailsでそれを試してみるべきだと言いました - しかし、私は現時点でそのような多くの挑戦のようなものは準備ができていません。

+0

あなたもルビースクリプトを投稿するべきです。あなたのルビースクリプトが特別なHTMLのエンタテイをエンコードしているようです。 – slowjack2k

+0

身体の反応を扱うスクリプトの部分で質問を更新しました。 – user3788685

答えて

0

私は@slowjack2kからのヒントを得て、応答を生成するRubyファイルを見直しました。

doc = Nokogiri::XML(resp.body)私はdoc = Nokogiri::HTML(resp.body)と低くなりました。これは現在動作しており、PHPで有効なxmlオブジェクトを期待どおりに返します。

関連する問題