it-swarm.dev

Groovy XmlSlurper vs XmlParser

Chvíli jsem na toto téma hledal a našel jsem i některé výsledky, o kterých se zmiňuji na konci příspěvku. Může mi někdo pomoci přesně odpovědět na tyto tři otázky pro případy uvedené níže?

  1. Pro které použití-případy použití XmlSluper dává větší smysl než XmlParser a naopak (z hlediska snadnosti použití API/Syntaxe)?

  2. Který z nich je paměťově efektivnější? (vypadá jako Slurper)

  3. který zpracovává xml rychleji?

Případ a. když musím číst téměř všechny uzly v XML?

Případ b. když musím číst jen několik uzlů (např. pomocí výrazu gpath)?

Případ c. když mám aktualizovat/transformovat xml?

za předpokladu, že dokument XML není triviální (s úrovní hloubek a velikostí xml).

Zdroje

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html uvádí:

Rozdíl mezi XMLParser a XMLSlurper:

Tam jsou podobnosti mezi XMLParser a XMLSlurper, když se používá pro Jednoduché čtení, ale když je používáme pro pokročilé čtení a když zpracování XML dokumentů v jiných formátech existují rozdíly Mezi dvěma.

XMLParser ukládá průběžné výsledky po analýze dokumentů. Ale na druhou stranu, 

XMLSlurper neuloží interní výsledky po zpracování dokumentů XML .

Skutečné fundamentální rozdíly se projevují při zpracování analyzovaných informací. To je při zpracování s přímými daty na místě Manipulací a zpracováním ve streamingovém scénáři.

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

Drobný dokument ( XmlParser , XmlSlurper ) a stránka groovy's je dobře vysvětluje ( zde a zde ), ale nevede skvělou práci při vysvětlování výše uvedené otázky.

71
kunal

Velký rozdíl mezi XmlSlurper a XmlParser spočívá v tom, že Parser vytvoří něco podobného DOM, zatímco Slurper se snaží vytvářet struktury pouze v případě, že je to opravdu potřeba, a používá tedy cesty, které jsou lenoše hodnoceny. Pro uživatele mohou oba vypadat naprosto stejně. Rozdíl je v tom, že struktura syntaktického analyzátoru je vyhodnocena pouze jednou, cesty sběrače mohou být vyhodnoceny na vyžádání. Na požádání je zde možno číst jako „více paměťově efektivní, ale pomalejší“. Nakonec záleží na tom, kolik cest/požadavků děláte. Pokud například chcete znát pouze hodnotu atributu v určité části XML a poté s ním provést, XmlParser by stále zpracovával všechny a spouštil dotaz na quasi DOM. V tom bude vytvořeno mnoho objektů, utrácet paměť a CPU. XmlSlurper nebude vytvářet objekty, a tím šetří paměť a CPU. Pokud přesto potřebujete všechny části dokumentu, ztratíte výhodu, protože vytvoří alespoň tolik objektů, kolik by analyzátor měl. 

Oba se mohou v dokumentu transformovat, ale tenčí nástroj předpokládá, že se jedná o konstantu, a proto byste nejprve museli tyto změny zapsat a vytvořit nový slurper, který bude číst nové xml. Analyzátor podporuje zobrazení změn ihned.

Odpověď na otázku (1), případ použití, by tedy spočívala v tom, že syntaktický analyzátor použijete, pokud budete muset zpracovat celý XML, ten menší, pokud je to jen jeho část. API a syntax v tom nehrají žádnou roli. Lidé z Groovy se snaží tyto dvě zkušenosti velmi podobat. Pokud chcete provést změny XML, můžete také upřednostnit syntaktický analyzátor.

Toto intro výše také vysvětluje, co je více paměťově efektivní, otázka (2). Slabší je, pokud nečtete vůbec, pak parser může, ale nemám skutečná čísla o tom, jak velký je rozdíl.

Otázka (3) může být zodpovězena také úvodem. Máte-li několik cest, které jsou vyhodnoceny líně, je třeba znovu eval, pak to může být pomalejší, než kdybyste procházeli existujícím grafem jako v parseru. Analyzátor tedy může být rychlejší v závislosti na vašem použití.

Řekl bych tedy (3a), že čtení téměř všech uzlů samo o sobě příliš neznamená rozdíl, protože požadavky jsou tím rozhodujícím faktorem. Ale v případě (3b) bych řekl, že slurper je rychlejší, když stačí číst několik uzlů, protože nebude muset vytvářet kompletní strukturu v paměti, která sama o sobě již stojí čas a paměť.

Pokud jde o (3c) ... v těchto dnech oba mohou aktualizovat/transformovat XML, což je rychlejší je vlastně více spojené s tím, kolik částí xml musíte změnit. Kdybych mnoho částí řeknu parseru, ne-li, pak možná ten šuplík. Ale pokud chcete například změnit hodnotu atributu z "Fred" na "John" se slurperem, jen pro pozdější dotaz na tento "John" pomocí stejného slurperu, nebude to fungovat.

97
blackdrag

Dám ti ostré odpovědi:

* XML Parser je rychlejší než XML Slurper.
* XML Slurper spotřebovává méně paměti než XML Parser.
* XML Parser umí analyzovat a aktualizovat XML současně.
* Pro XML Slurper, který potřebujete k MarkupBuild XML po každé aktualizaci, kterou provedete.
* Když chcete používat výrazy cesty, XML Slurper by byl lepší než analyzátor.
* Pro čtení téměř všech uzlů XML Parser by bylo v pořádku

Doufám, že to pomůže

0
srinivasan