2010-11-16 61 views
3

我通過一個約12mb大的XML文件進行解析。我需要解析整個文件並在MySQL數據庫中存儲我所需要的內容。如何解析PHP中的大型XML文件?

我將XML文件轉換爲數組。然後我解析數組並存儲值。

這很好,當XML是非常小,但它只是停止行爲時,我運行我的12MB文件。

我嘗試了將XML轉換爲我在網上找到的數組並且它們都不工作的多個函數。

這是我有兩個不同的XML到陣列的功能得到了一個常見的錯誤我在網上找到:

Fatal error: [] operator not supported for strings 

我使用SimpleXML,有沒有解決這個更好的辦法?除了SimpleXML以外,是否還有足夠強大的庫來處理大型XML文件?

我現在有這樣的:

$z = new XMLReader; 
$z->open('feedfetch.xml'); 

$doc = new DOMDocument; 
while ($z->read() && $z->name !== 'collection'); 
while ($z->name === 'collection') 
{ 
    $node = simplexml_import_dom($doc->importNode($z->expand(), true)); 
    var_dump($node[0]); 
    exit; 

    $z->next('collection'); 
} 

你看到我的變種轉儲?它迴響了一堆XML對象,但我不知道如何使用數據到達實際節點?

回答

3

使用SimpleXML切換到使用大型XML文件時的XMLReader。這是一個Pull解析器,它不會將整個文件加載到內存中進行處理。

+0

我應該將它轉換爲數組,然後解析它並填充我的數據庫或解析實際的XML? – vick 2010-11-16 22:26:05

+1

不!整個過程就是你通過實體處理實體,使用循環從XML中檢索需要的內容,將每行插入到數據庫中,然後執行插入操作。這樣,你沒有把整個東西加載到內存中,並使用PHP的限制 – 2010-11-16 22:41:51

+0

我更新了這篇文章,你可以看一下嗎? – vick 2010-11-16 23:44:35

0

SimpleXML是黑盒子代碼的一個很好的例子,它在封面上做了一些神奇的事情,使它看起來更簡單。換句話說,不要做一個SimpleXML對象的var_dump();你會感到困惑。

加載到SimpleXML中的XML文件可以看起來像嵌套對象和對象數組。您可以使用$dom->element->subelement引用嵌套元素。是的,起初感覺很有趣,但你很快就會習慣它。不過,您必須嚴格關注您的XML格式,否則您可能會嘗試訪問不存在的元素。這就是你的錯誤所在。

不幸的是,SimpleXML將整個XML文件拖入內存並解析它。這爲您提供了隨機訪問的優勢,但代價是佔用大量內存,可能不必要。也就是說,12Mb並沒有超出SimpleXML的能力,你給出的錯誤信息並不是內存不足的錯誤。

+0

我做$ dom-> element-> subelement它只是不輸出數據。 – vick 2010-11-18 18:07:00

+0

我承認,子元素引用可能有點棘手。隨着XML,看起來像'',那麼你會得到與'$ dom->集團 - >第[1]第二個'Value'標籤 - > Value' – staticsan 2010-11-18 23:42:18