2010-03-17 53 views
1

我寫的程序,從$ _POST變量一些XML讀取信息,然後解析XML解析使用PHP的XMLReader和提取輸入到數據庫中的數據。我使用的是XMLReader,因爲提供的XML很可能太大而無法放入內存。與PHP的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"?>行,但是如果我包含它,並且它將在應用程序進入實際生產環境時包含,則while循環的$reader->read()代碼不起作用,並且XML在while循環內未被解析。

有沒有人見過類似的行爲,或知道爲什麼會發生這種情況?

在此先感謝。

回答

0

確定,主要redfaced編碼器在這裏,已經做了一些改動,以我的開發環境,我昨天安裝了PHP的新版本,並magic_quotes_gpc的設置爲「ON」,從而逃避報價在XML和引起的問題

感謝您的幫助

+0

如果它是您的開發服務器設置錯誤\ _reporting = E \ _ALL(或更高),也是如此。您將從xmlreader獲取有關格式錯誤的文檔的警告消息,然後;-) – VolkerK 2010-03-17 18:03:12

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用了Suhosin貼片(CLI)(內置:三月9 2010 10:14:53)

+0

while循環內的代碼沒有執行,就好像read()函數沒有正確調用。我已經通過讓整個程序執行來驗證,並且通過在永不被訪問的while循環中放置一個die()來驗證。 – coffeecoder 2010-03-17 15:19:21

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另一個例子是打印。

+0

mmm如果我將我的XML粘貼到代碼中,就像第一個示例中的代碼完全一樣,但是如果它是從前一頁和文本區域(如示例2)傳入的,或者粘貼到URL中時它不起作用,那麼im非常神祕通過這個 – coffeecoder 2010-03-17 16:05:34

0

你需要確認幾件事情:

  1. 您的數據庫中的字段類型是足夠大,以保存XML,如果不是的話,它將只存儲部分,導致無效的xml'文檔'並導致XML解析器失敗。
  2. 檢查你的php.ini文件夾,以確保您的post_max_size,max_upload_filesize和memory_limit的值是足夠大的,如果他們都沒有,同樣的問題棱,PHP無法解析它,因爲它是一個無效的「文件」

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

+0

也看看SimpleXml選項 - simplexml_load_file是另一種選擇,你可能有更好的運氣。 – Rabbott 2010-03-17 15:51:34