Groovy XmlSlurper vs XmlParser - PullRequest
       30

Groovy XmlSlurper vs XmlParser

73 голосов
/ 26 сентября 2011

Я некоторое время искал по этой теме и тоже нашел некоторые результаты, о которых упоминаю в конце поста. Может ли кто-нибудь помочь мне точно ответить на эти три вопроса для перечисленных ниже случаев?

  1. Для каких вариантов использования XmlSluper имеет больше смысла, чем XmlParser и наоборот (с точки зрения простоты использования API / синтаксиса)?

  2. Какой из них более эффективен для памяти? (выглядит как Slurper)

  3. какая из них быстрее обрабатывает xml?

Дело а. когда мне нужно прочитать почти все узлы в XML?

Дело b. когда мне нужно прочитать только несколько узлов (например, используя выражение gpath)?

Дело c. когда мне нужно обновить / преобразовать xml?

при условии, что документ xml не является тривиальным (с уровнем глубины и размером xml).

Ресурсы :

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html состояния:

Разница между XMLParser и XMLSlurper:

Есть сходство между XMLParser и XMLSlurper при использовании для простое чтение, но когда мы используем их для расширенного чтения и когда при обработке документов XML в других форматах существуют различия между двумя.

XMLParser сохраняет промежуточные результаты после анализа документов. Но на С другой стороны,

XMLSlurper не сохраняет внутренние результаты после обработки XML документы.

Реальные, фундаментальные различия становятся очевидными при обработке разобранная информация. То есть при обработке с непосредственными данными на месте манипулирование и обработка в потоковом сценарии.

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

Groovy Doc ( XmlParser , XmlSlurper ) и сайт groovy хорошо их объясняют ( здесь и здесь ), но не проделали большую работу по объяснению вышеупомянутого вопроса.

Ответы [ 2 ]

100 голосов
/ 01 октября 2011

Большая разница между XmlSlurper и XmlParser заключается в том, что Parser создаст что-то похожее на DOM, в то время как Slurper пытается создавать структуры, только если это действительно необходимо, и поэтому использует пути, которые лениво оцениваются.Для пользователя оба могут выглядеть чрезвычайно равными.Разница в том, что структура синтаксического анализатора оценивается только один раз, траектории логова могут оцениваться по требованию.По требованию здесь можно прочитать как «более эффективный, но более медленный».В конечном итоге это зависит от того, сколько путей / запросов вы делаете.Если, например, вы хотите узнать только значение атрибута в определенной части XML, а затем покончить с этим, XmlParser все равно обработает все и выполнит ваш запрос в квазиодноме DOM.При этом будет создано много объектов, память и процессор.XmlSlurper не будет создавать объекты, тем самым экономя память и процессор.В любом случае, если вам нужны все части документа, slurper теряет преимущество, поскольку он создаст как минимум столько же объектов, сколько и анализатору.

Оба могут выполнять преобразования в документе, но slurper предполагает, что он является константой, и поэтому вам придется сначала записать изменения и создать новый slurper для чтения нового xml-кода. Анализатор поддерживает просмотрсразу меняется.

Таким образом, ответ на вопрос (1), вариант использования, будет, что вы используете синтаксический анализатор, если вам нужно обработать весь XML, блудник, если только его части.API и синтаксис на самом деле не играют большой роли в этом.Groovy люди пытаются сделать эти два очень похожими в пользовательском опыте.Кроме того, вы бы предпочли синтаксический анализатор над slurper, если вы хотите вносить инкрементные изменения в XML.

Это введение выше также объясняет, что является более эффективным с точки зрения памяти, вопрос (2).Нехватка есть, если вы все равно не читаете все, тогда парсер может, но у меня нет фактических цифр о том, насколько велика тогда разница.

Также вступление может ответить на вопрос (3).Если у вас есть несколько ленивых оцененных путей, вы должны выполнить eval снова, тогда это может быть медленнее, чем если бы вы просто перемещались по существующему графику, как в парсере.Таким образом, синтаксический анализатор может быть быстрее, в зависимости от вашего использования.

Так что я бы сказал (3a), что чтение почти всех узлов само по себе не имеет большого значения, так как запросы являются более определяющим фактором.Но в случае (3b) я бы сказал, что slurper быстрее, если вам просто нужно прочитать несколько узлов, поскольку ему не нужно создавать полную структуру в памяти, которая сама по себе уже стоит времени и памяти.

Что касается (3c) ... в наши дни оба могут обновлять / преобразовывать XML, что быстрее на самом деле больше связано с тем, сколько частей xml вам нужно изменить.Если много деталей я бы сказал парсером, если нет, то может быть лохотрон.Но если вы хотите, например, изменить значение атрибута с «Fred» на «John» с помощью slurper, просто для последующего запроса этого «John» с использованием того же slurper, это не сработает.

1 голос
/ 02 августа 2018

Я дам вам четкие ответы:

* Синтаксический анализатор XML быстрее XML Slurper.
* XML Slurper потребляет меньше памяти, чем XML-анализатор.
* XML Parser может анализировать и обновлять XML одновременно.
* Для XML Slurper вам нужно пометить создание XML после каждого обновления, которое вы делаете.
* Если вы хотите использовать выражения пути, XML Slurper будет лучше, чем Parser.
* Для чтения почти всех узлов XML Parser будет в порядке

Надеюсь, что это поможет

...