2016-10-12 4 views
0

私はSymfonyプロジェクトでXMLファイルを読み込み、フロントエンドにデータを送信しようとしています。PHPでXMLファイルを処理してデータを少しずつ送信する

XMLファイルが巨大なので、XMLReaderとSimpleXMLの組み合わせを使用しています(How to use XMLReader in PHP?)。それらは改ページとテーブルに表示されるように

class XMLReader { 

private $xmlFile; 
private $reader; 

public function __construct($xmlFile = null) 
{ 
    $this->xmlFile = $xmlFile; 
} 


public function initReader() 
{ 
    $this->reader = new \XMLReader(); 
    $this->reader->open($this->xmlFile); 
} 

public function getData() 
{ 
    $products = array(); 
    $index = 0; 
    while ($this->reader->read()) { 
     while ($this->reader->name === 'product') { 
      $node = new \SimpleXMLElement($this->reader->readOuterXML()); 
      array_push($products, $node); 
      $index++; 
      if ($index < 20) 
       $this->reader->next(); 
      else 
       break 2; 
     } 
    } 
    return $products; 
} 

私の目的は、少しずつデータを送信することです:

は、ここでXMLリーダーのための私のコードです。つまり、初めて20個の結果が送信され、2番目のページをクリックすると次の20個の結果が要求されます。

これを行う方法はありますか?

+4

そうでもないような良いアイデア、それは基本的にあなたがテーブルにXMLファイル_eachのtime_を新しいページを解析する必要があることを意味するから要求されています。代わりに、ファイル全体を処理して転送し、クライアントサイドロジックをページング(JavaScript)に使用することができます。これは簡単ではるかに魅力的ですが、妥当な量のデータまでしか機能しません。それがオプションでない場合は、xmlファイルをデータベースに解析し、そこからページ付けされたデータを配信する必要があります。 – arkascha

+0

arkaschaには、javascriptでXMLを解析し、xpathクエリを使用してページを取得する必要があるノードを選択できるという点があります。 –

答えて

1

symfonyでは、StreamedResponseを使用して小さなチャンクで応答を送信できます。大容量のファイルを送信するために使用されるのは、ファイル全体をメモリにロードする必要はないが、ニーズにも対応できるからです。

は、それがドキュメントで使われている方法を参照してください:http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response

+0

Okですが、もう一度要求した場合、どのように読み込みを続けることができますか? – Mahcih

+0

@Mahcihセッションなどで保存できます。 – martin

関連する問題