1

$_POST 変数から XML を読み取り、PHP XMLReader を使用して解析し、抽出されたデータをデータベースに入力するプログラムを作成しています。提供される XML は大きすぎてメモリに配置できない可能性が高いため、XMLReader を使用しています。

ただし、いくつかの問題があります。XML と基本的なコードは次のとおりです。

'<?xml version="1.0"?> <data_root> <data> <info>value</info> </data> <action>value</action> </data_root>'

$request = $_REQUEST['xml'];

$reader = new XMLReader();
$reader->XML($request);

while($reader->read()){
   //processing code
}

$reader->close()

私の問題は、渡される XML に行がない場合、コードが完全に機能することですが<?xml version="1.0"?>、それを含めると、アプリケーションが実際の運用環境に入ったときに含まれ$reader->read()、while ループのコードが機能しません。 XML は while ループ内で解析されません。

以前に同様の動作を見たことがありますか、またはなぜこれが起こっているのか知っていますか?

前もって感謝します。

4

4 に答える 4

0

「うまくいかない」とはどういう意味ですか? エラーが発生していますか?

[編集] ...

問題を再現できます。VolkerK とまったく同じことを試しました。

$r = new XMLReader();
$x = '<?xml version="1.0"?> <data_root>  <data>  <info>value</info>  </data> <action>value</action> </data_root>';
$r->XML($x);
while ($r->read()) { echo $r->nodeType . " - "; }

1 - 14 - 1 - 14 - 1 - 3 - 15 - 14 - 15 - 14 - 1 - 3 - 15 - 14 - 15 -

私が使用したもの: PHP 5.3.2-0.dotdeb.1 with Suhosin-Patch (cli) (ビルド: 2010 年 3 月 9 日 10:14:53)

于 2010-03-17T15:16:24.047 に答える
0

いくつか確認する必要があります。

  1. データベース内の列の型が xml を保持するのに十分な大きさであること。そうでない場合、その一部のみが格納されるため、無効な xml 'ドキュメント' が生成され、XML パーサーが失敗します。
  2. php.ini フォルダをチェックして、post_max_size、max_upload_filesize、および memory_limit の値が十分に大きいことを確認してください。そうでない場合、同じ問題が発生します。無効な「ドキュメント」であるため、php はそれを解析できません。

また、おそらく $_POST を使用してそのデータを取得する必要がありますが、より良い方法です。

于 2010-03-17T15:49:51.097 に答える
0

動作を再現できません (2 番目の例のクライアントとして php 5.3.2/win32 + firefox を使用)。

$request = '<?xml version="1.0"?> <data_root>  <data>  <info>value</info>  </data>  <action>value</action> </data_root>';
$reader = new XMLReader();
$reader->XML($request);
while($reader->read()){
  echo $reader->nodeType, " ";
}
$reader->close();

印刷し1 14 1 14 1 3 15 14 15 14 1 3 15 14 15ます。
$_REQUEST['xml'] は本当にあなたが期待するものを含んでいますか?

編集: または、実際に _REQUEST を使用する別の例

<?php
if ( isset($_REQUEST['xml']) ) {
  $request = $_REQUEST['xml'];
  $reader = new XMLReader();
  $reader->XML($request);
  while($reader->read()){
    echo $reader->nodeType, " ";
  }
  $reader->close();
  die;
}
$pre = htmlspecialchars(
'<?xml version="1.0"?>
  <data_root>
    <data> 
      <info>value</info>
    </data> 
  <action>value</action>
</data_root>');
?>
<html><head><title>....</title></head><body>
  <form method="post" action="?">
    <div>
      <textarea cols="25" rows="8" name="xml"><?php echo $pre; ?></textarea>
      <br />
      <input type="submit" />
    </div>
  </form>
</body></html>

1 14 1 14 1 3 15 14 15 14 1 3 15 14 15フォームが送信されると、再び印刷されます。

于 2010-03-17T15:41:55.387 に答える
0

わかりました、ここで主要な赤字のコーダー、私の開発環境にいくつかの変更を加えたので、昨日phpの新しいバージョンをインストールし、magic_quotes_gpcが「オン」に設定されたため、XMLの引用符がエスケープされ、問題が発生しました

ご協力いただきありがとうございます

于 2010-03-17T16:36:28.570 に答える