Разбор XML с помощью PHP XMLReader - PullRequest
1 голос
/ 17 марта 2010

Я пишу программу, которая читает некоторые XML-данные из переменной $ _POST, а затем анализирует их, используя PHP XMLReader и извлеченные данные, вводимые в базу данных. Я использую XMLReader, поскольку предоставленный XML, скорее всего, будет слишком большим для размещения в памяти.

Однако у меня возникли некоторые проблемы, мой 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 ]

0 голосов
/ 17 марта 2010

хорошо, основной кодировщик с красным шрифтом, внеся некоторые изменения в мою среду разработки, я вчера установил новую версию php, и magic_quotes_gpc был установлен на «on», таким образом, экранируя кавычки в XML и вызывая проблему

спасибо за вашу помощь

0 голосов
/ 17 марта 2010

Я не могу воспроизвести поведение (используя 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'] содержит то, что вы ожидаете?

edit: или другой пример, который на самом деле использует _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 печатается при отправке формы.

0 голосов
/ 17 марта 2010

Вам нужно будет подтвердить несколько вещей:

  1. То, что ваш тип столбца в вашей базе данных достаточно велик для хранения xml, в противном случае он будет хранить только его часть, что приведет к неверному xml-документу и приведет к сбою синтаксического анализатора XML.
  2. Проверьте папку php.ini, чтобы убедиться, что значения post_max_size, max_upload_filesize и memory_limit достаточно велики, в противном случае php не может быть обработан, потому что это недопустимый «документ»

Кроме того, вам, вероятно, следует использовать $ _POST для извлечения этих данных, просто лучшая практика.

0 голосов
/ 17 марта 2010

Что вы имеете в виду под "не работает"? Вы получаете какие-либо ошибки?

[редактировать] ...

Я могу воспроизвести и вашу проблему, я попробовал то же самое, что и 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 с Suhosin-Patch (cli) (сборка: 9 марта 2010 г. 10:14:53)

...