2010-06-15 89 views
18

對於某個項目,我需要一些方法來解析XML並從中獲取數據。所以我想知道,哪一個內置的解析器是最快的?什麼是PHP中最快的XML解析器?

另外,這將是很好的解析器可以接受一個XML字符串作爲輸入 - 我有我自己的線程安全使用文件的實現,我不想一些討厭的非線程安全的庫使我努力沒用。

+1

使用XMLReader的一些信息是線程安全的確是令人擔憂? 99%的PHP應用程序都是單線程的。 – 2010-06-15 20:02:31

+0

我很確定他說的是競爭條件[基於他的另一個問題](http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658)。 – Charles 2010-06-15 20:11:03

+0

恐怕是這樣。猜猜我會使用SimpleXML。但是,不知道它的性能。 – 2010-06-15 20:12:28

回答

8

最快的解析器將是SAX--它不必創建dom,並且可以使用部分xml或逐步完成。有關PHP SAX parser (Expat) can be found here的信息。另外還有一個libxml based DOM parser named SimpleXML。基於DOM的解析器將更容易處理,但它通常要慢幾個數量級。

+0

同意。在流模式下無與倫比的性能,極低的內存消耗。對於類似Feed或重複的XML來說,這是最好的選擇。 請看http://www.php.net/manual/en/function.xml-parse.php上的例子。在10MB XML上測試,在I7筆記本上解析時間約爲3秒,包括存儲到帶有全文索引的MySQL平板表,峯值堆使用大約600kB(!) – OSP 2013-04-02 05:16:13

+6

如果只有...許多公司客戶端只是從CSV切換到XML並認爲JSON是來自帳戶的人。 – Tamlyn 2013-12-11 13:48:33

0

PHP中沒有真正的解析器。

最有效的將是PHP提供的那些,用DOM和SimpleXML編寫一個基準,並檢查哪個性能更好。

+7

不要只測試,基準測試和發佈測試數據,測試方法和結果! – Charles 2010-06-15 20:12:21

2

每個XML擴展都有自己的長處和短處。例如,我有一個腳本來分析Stack Overflow的XML數據轉儲。 posts.xml文件是2.8GB!對於這個大的XML文件,我不得不使用XMLReader,因爲它以流模式讀取XML,而不是像DOM擴展一樣嘗試一次加載和表示整個XML文檔。

因此,您需要更具體地描述您將如何使用XML,以決定使用哪個PHP擴展。

PHP的所有XML擴展都提供了一些將XML數據作爲字符串讀取的方法。

+0

你會推薦什麼樣的加載許多小XML文件最快的? – 2013-02-15 19:19:48

+0

@JohnMagnolia,我會嘗試SimpleXML和Evan Carroll的答案中提到的SAX解析器。速度是一個考慮因素,以及編程界面的簡易性。後者是個人品味的問題,所以你應該嘗試兩種,看看你喜歡什麼。 – 2013-02-15 19:31:21

+0

在回答John Magnolia的問題時,對於許多小文件,XMLReader比SimpleXML更快(請參閱下面的答案);據推測SAX也會如此。 – Josiah 2014-10-15 19:06:22

8

**這主要面向那些從XML解析開始並且不確定使用哪個解析器的人。

解析有兩種「大」的方法 - 您可以將XML加載到內存中,找到您需要的東西(DOM,SimpleXML)或者可以將其流式傳輸 - 根據讀取的內容讀取並執行代碼(XMLReader,SAX)。

According to Microsoft,SAX是一個「推」解析器,它將每一條信息發送到您的應用程序,並由您的應用程序處理它。 SimpleXML是一個「拉」解析器,它可以讓你跳過大塊的數據,只抓住你需要的東西。據微軟稱,這既可以簡化和加速你的應用程序,也可以假設.NET和PHP的實現類似。我想你的選擇將取決於你的需求 - 如果你只從一個較大的區塊中提取幾個標籤,並且可以使用$xml->next('Element')來跳過重要的區塊,那麼可能會發現XMLReader比SAX更快。

重複解析「小」(< 30kb,700行)XML文件,您可能不會指望解析方法之間會有巨大的時間差異。我很驚訝地發現有。我運行了在SimpleXML和XMLReader中處理的小型提要的比較。希望這會幫助其他人可視化這些數據的差異有多大。對於現實生活中的比較,這是解析對兩個亞馬遜MWS產品信息請求訂閱源的響應。

每個解析時間是採用2個XML字符串並返回大約120個包含每個字符串值的變量所需的時間。每個循環都採用不同的數據,但每個測試都以相同的順序處於相同的數據。

SimpleXML將文檔加載到內存中。我使用microtime來檢查完成解析的時間(提取相關值)以及創建元素所用的時間(當調用new SimpleXMLElement($xml)時)。我已將這些四捨五入到小數點後4位。

Parse Time: 0.5866 seconds 
Parse Time: 0.3045 seconds 
Parse Time: 0.1037 seconds 
Parse Time: 0.0151 seconds 
Parse Time: 0.0282 seconds 
Parse Time: 0.0622 seconds 
Parse Time: 0.7756 seconds 
Parse Time: 0.2439 seconds 
Parse Time: 0.0806 seconds 
Parse Time: 0.0696 seconds 
Parse Time: 0.0218 seconds 
Parse Time: 0.0542 seconds 
__________________________ 
      2.3500 seconds 
      0.1958 seconds average 

Time Spent Making the Elements: 0.5232 seconds 
Time Spent Making the Elements: 0.2974 seconds 
Time Spent Making the Elements: 0.0980 seconds 
Time Spent Making the Elements: 0.0097 seconds 
Time Spent Making the Elements: 0.0231 seconds 
Time Spent Making the Elements: 0.0091 seconds 
Time Spent Making the Elements: 0.7190 seconds 
Time Spent Making the Elements: 0.2410 seconds 
Time Spent Making the Elements: 0.0765 seconds 
Time Spent Making the Elements: 0.0637 seconds 
Time Spent Making the Elements: 0.0081 seconds 
Time Spent Making the Elements: 0.0507 seconds 
______________________________________________ 
           2.1195 seconds 
           0.1766 seconds average 
over 90% of the total time is spent loading elements into the DOM. 

Only 0.2305 seconds is spent locating the elements and returning them. 

雖然XMLReader的,這是基於流的,我能跳過XML之一的顯著塊飼料,因爲我想要的數據是接近每一個元素的頂部。 「你的旅費可能會改變。」

Parse Time: 0.1059 seconds 
Parse Time: 0.0169 seconds 
Parse Time: 0.0214 seconds 
Parse Time: 0.0665 seconds 
Parse Time: 0.0255 seconds 
Parse Time: 0.0241 seconds 
Parse Time: 0.0234 seconds 
Parse Time: 0.0225 seconds 
Parse Time: 0.0183 seconds 
Parse Time: 0.0202 seconds 
Parse Time: 0.0245 seconds 
Parse Time: 0.0205 seconds 
__________________________ 
      0.3897 seconds 
      0.0325 seconds average 

什麼是引人注目的是,雖然定位元素稍快於SimpleXML的是一旦所有的加載,它是更快實際上在6次使用的XMLReader整體。

你可以找到How to use XMLReader in PHP?