對於某個項目,我需要一些方法來解析XML並從中獲取數據。所以我想知道,哪一個內置的解析器是最快的?什麼是PHP中最快的XML解析器?
另外,這將是很好的解析器可以接受一個XML字符串作爲輸入 - 我有我自己的線程安全使用文件的實現,我不想一些討厭的非線程安全的庫使我努力沒用。
對於某個項目,我需要一些方法來解析XML並從中獲取數據。所以我想知道,哪一個內置的解析器是最快的?什麼是PHP中最快的XML解析器?
另外,這將是很好的解析器可以接受一個XML字符串作爲輸入 - 我有我自己的線程安全使用文件的實現,我不想一些討厭的非線程安全的庫使我努力沒用。
最快的解析器將是SAX--它不必創建dom,並且可以使用部分xml或逐步完成。有關PHP SAX parser (Expat) can be found here的信息。另外還有一個libxml based DOM parser named SimpleXML。基於DOM的解析器將更容易處理,但它通常要慢幾個數量級。
PHP中沒有真正的解析器。
最有效的將是PHP提供的那些,用DOM和SimpleXML編寫一個基準,並檢查哪個性能更好。
不要只測試,基準測試和發佈測試數據,測試方法和結果! – Charles 2010-06-15 20:12:21
每個XML擴展都有自己的長處和短處。例如,我有一個腳本來分析Stack Overflow的XML數據轉儲。 posts.xml文件是2.8GB!對於這個大的XML文件,我不得不使用XMLReader
,因爲它以流模式讀取XML,而不是像DOM擴展一樣嘗試一次加載和表示整個XML文檔。
因此,您需要更具體地描述您將如何使用XML,以決定使用哪個PHP擴展。
PHP的所有XML擴展都提供了一些將XML數據作爲字符串讀取的方法。
你會推薦什麼樣的加載許多小XML文件最快的? – 2013-02-15 19:19:48
@JohnMagnolia,我會嘗試SimpleXML和Evan Carroll的答案中提到的SAX解析器。速度是一個考慮因素,以及編程界面的簡易性。後者是個人品味的問題,所以你應該嘗試兩種,看看你喜歡什麼。 – 2013-02-15 19:31:21
在回答John Magnolia的問題時,對於許多小文件,XMLReader比SimpleXML更快(請參閱下面的答案);據推測SAX也會如此。 – Josiah 2014-10-15 19:06:22
**這主要面向那些從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整體。
使用XMLReader的一些信息是線程安全的確是令人擔憂? 99%的PHP應用程序都是單線程的。 – 2010-06-15 20:02:31
我很確定他說的是競爭條件[基於他的另一個問題](http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658)。 – Charles 2010-06-15 20:11:03
恐怕是這樣。猜猜我會使用SimpleXML。但是,不知道它的性能。 – 2010-06-15 20:12:28