簡體   English   中英

使用PHP XMLReader解析XML

[英]Parsing XML with the PHP XMLReader

我正在編寫程序,該程序從$ _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"?>行,但是如果我將其包含在內,則該代碼將可以完美地工作,並且當應用程序進入實時生產環境時將被包含在內。 ,while循環的$reader->read()代碼不起作用,並且XML不在while循環內進行解析。

有沒有人曾經見過類似的行為或知道為什么會發生這種情況?

提前致謝。

您是什么意思:“不起作用”? 您有任何錯誤嗎?

[編輯]

我也可以重現您的問題,我嘗試了與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-13-1-15-14-15-14-14-3-15-14-15-

我使用過:帶有Suhosin-Patch(cli)的PHP 5.3.2-0.dotdeb.1(構建於:2010年3月9日10:14:53)

我無法重現此行為(使用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

您需要確認幾件事:

  1. 數據庫中的列類型足夠大以容納xml,如果不是,它將僅存儲它的一部分,從而導致xml'document'無效,並導致XML解析器失敗。
  2. 檢查您的php.ini文件夾,以確保您的post_max_size,max_upload_filesize和memory_limit值足夠大,如果不足夠,則會出現相同的問題,php無法解析它,因為它是無效的“文檔”

另外,您可能應該使用$ _POST來檢索該數據,這是一個更好的做法。

好的,這里是主要的紅臉程序員,對我的開發環境進行了一些更改,我昨天安裝了新版本的php,並且magic_quotes_gpc設置為“ on”,從而轉義了XML中的引號並導致了問題

謝謝您的幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM