1

我正在编写程序,它从 $_POST 变量中读取一些 XML,然后使用 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

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 -

我使用:带有 Suhosin-Patch (cli) 的 PHP 5.3.2-0.dotdeb.1(构建时间:2010 年 3 月 9 日 10:14:53)

于 2010-03-17T15:16:24.047 回答
0

我无法重现该行为(使用 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

您需要确认几件事:

  1. 您的数据库中的列类型足够大以容纳 xml,如果不是,它将仅存储其中的一部分,从而导致无效的 xml“文档”并导致 XML 解析器失败。
  2. 检查您的 php.ini 文件夹以确保您的 post_max_size、max_upload_filesize 和 memory_limit 值足够大,如果它们不是,同样的问题出现,php 无法解析它,因为它是一个无效的“文档”

此外,您可能应该使用 $_POST 来检索该数据,这只是一种更好的做法。

于 2010-03-17T15:49:51.097 回答
0

好的,这里主要的redfaced coder对我的开发环境进行了一些更改,我昨天安装了一个新版本的php,magic_quotes_gpc被设置为'on',从而转义了XML中的引号并导致问题

谢谢您的帮助

于 2010-03-17T16:36:28.570 回答