Каков самый быстрый XML-парсер в PHP?

для определенного проекта, мне нужно каким-то образом разобрать XML и получить данные от него. Так что, интересно, какой из встроенных парсеров является самым быстрым?

Кроме того, было бы неплохо, чтобы анализатор мог принимать XML-строку в качестве входных данных - у меня есть своя реализация потокобезопасной работы с файлами, и я не хочу, чтобы некоторые неприятные библиотеки, не связанные с потоками, делали мои усилия бесполезно.

Ответ 1

Самый быстрый парсер будет SAX - ему не нужно создавать dom, и это можно сделать с помощью частичного xml или постепенно. Информацию о PHP SAX parser (Expat) можно найти здесь. Кроме того, существует основанный на libxml парсер DOM с именем SimpleXML. Парсер, основанный на DOM, будет легче работать, но он, как правило, на несколько порядков медленнее.

Ответ 2

** Это ориентировано прежде всего на те, которые начинаются с анализа XML, и не уверены, какой парсер использовать.

Существует два "больших" способа анализа: вы можете загружать XML в память и находить то, что вам нужно (DOM, SimpleXML), или вы можете передавать его - читать и выполнять код на основе того, что вы читаете ( XMLReader, SAX).

В соответствии с Microsoft SAX - это синтаксический анализатор, который отправляет каждую информацию в ваше приложение, и ваше приложение обрабатывает его. SimpleXML - это синтаксический анализатор, который позволяет вам пропускать фрагменты данных и получать только то, что вам нужно. По мнению Microsoft, это может упростить и ускорить ваше приложение, и я бы предположил, что реализация .NET и PHP аналогична. Я предполагаю, что ваш выбор будет зависеть от ваших потребностей - если вы вытаскиваете только несколько тегов из большего фрагмента и можете использовать $xml->next('Element') для пропуска значительных фрагментов, вы можете обнаружить, что XMLReader быстрее SAX.

Повторяя синтаксический анализ "малых" (< 30kb, 700 строк) файлов XML, вы не можете ожидать, что между методами анализа будет огромная разница во времени. Я был удивлен, обнаружив, что это было. Я провел сравнение небольшого фида, обработанного в SimpleXML и XMLReader. Надеюсь, это поможет кому-то еще понять, насколько важны эти данные. Для сравнения реальной жизни, это синтаксический анализ ответа на два канала запроса информации о продукции Amazon 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 в Как использовать XMLReader в PHP?

Ответ 3

Каждое расширение XML имеет свои сильные и слабые стороны. Например, у меня есть script, который анализирует дамп данных XML из Stack Overflow. Файл posts.xml составляет 2,8 ГБ! Для этого большого XML файла мне пришлось использовать XMLReader, потому что он читает XML в потоковом режиме, вместо того, чтобы пытаться загружать и представлять весь XML-документ в памяти сразу, как это делает расширение DOM.

Итак, вам нужно более подробно описать, как вы собираетесь использовать XML, чтобы решить, какое расширение PHP использовать.

Все PHP-расширения XML предоставляют некоторый способ чтения XML-данных в виде строки.

Ответ 4

В PHP не так много парсеров.

Наиболее эффективными будут те, которые предоставляются PHP, пишут тесты с DOM и SimpleXML и проверяют, какая из них работает лучше.