2012-07-30 70 views
4

嗨,我有一個xml文件,其中約12,000條記錄。我編寫的代碼,它工作正常,只需要一段時間來解析XML文件並返回內容。有什麼辦法可以加快這個過程嗎?加快xml解析與PHP

我的代碼:

<?php 
$dom = new DOMDocument(); 
$dom->load('comics.xml'); 
foreach ($dom->getElementsByTagName('record') as $entry) 
{ 
$title = $entry->getElementsByTagName('title')->item(0)->textContent; 
echo $title; 

} 
?> 

XML文件(在那裏只要1演示着聯繫他們所有的笑):

<?xml version='1.0' encoding='utf-8'?> 
<calibredb> 
    <record> 
    <id>1</id> 
    <uuid>991639a0-7cf6-4a34-a863-4aab8ac2921d</uuid> 
    <publisher>Marvel Comics</publisher> 
    <size>6109716</size> 
    <title sort="Iron Man v1 101">Iron Man v1 101</title> 
    <authors sort="Unknown"> 
     <author>Unknown</author> 
    </authors> 
    <timestamp>2012-04-15T18:49:22-07:00</timestamp> 
    <pubdate>2012-04-15T18:49:22-07:00</pubdate> 
    <cover>M:/Comics/Unknown/Iron Man v1 101 (1)/cover.jpg</cover> 
    <formats> 
     <format>M:/Comics/Unknown/Iron Man v1 101 (1)/Iron Man v1 101 - Unknown.zip</format> 
    </formats> 
    </record> 
    </calibredb> 
+0

第1步,找出什麼是實際上很慢。關鍵字:剖析。 – salathe 2012-07-30 22:56:31

+0

你可以嘗試xpath並比較結果嗎?我認爲這可能會更快,但我從未測試過。 – mrok 2012-07-30 22:56:39

+0

使用[XML Parser](http://www.php.net/manual/en/book.xml.php)。它將數據分成塊,並且需要手動解析(基於事件),但它比DOMDocument或SimpleXML更有效(沒有內部樹被構建並卡入內存) – 2012-07-30 22:59:47

回答

1

答案取決於數據很多。一些可能的解決方案是將數據移動到像MySQL這樣的關係數據庫中,或者將數據規範化爲像CSV這樣的格式,這樣更容易解析,佔用更少的空間,並且可以逐行閱讀。

+0

是的,我希望我可以避免將信息存儲在數據庫,但看起來這可能是我最好的解決方案。 – rackemup420 2012-07-30 23:23:26

+0

@ rackemup420你看我的答案嗎?\ – 2012-07-30 23:57:38

0

我並不特別熟悉PHP實現,但是在使用Xerces的C++中使用以下方法我已經看到您的方案有了巨大的性能改進。

而不是按名稱請求所有的元素,並等待返回一個完整的NodeList,我發現只要獲得根節點下的第一個子節點並獲取NextSibling節點就快得多了。使用每個兄弟節點作爲新節點,您將繼續獲得NextSibling,直到沒有剩下的節點。

希望這可以提供PHP性能改進,類似於C++中的改進。

2

DOM方法適用於小數據集,因爲所有的XML結構都被解析並放入內存中。

在你的情況下,你應該在解析大型XML文件時使用SAX方法,因爲XML文件是逐行讀取的,而不是一次一行讀取。

谷歌有一些例子:https://www.google.lv/search?q=php+SAX+XML