2011-09-26 15 views
65

Poszukałem trochę czasu na ten temat i znalazłem również wyniki, o których wspominam na końcu postu. Czy ktoś może mi pomóc precyzyjnie odpowiedzieć na te trzy pytania w przypadkach wymienionych poniżej?Groovy XmlSlurper vs XmlParser

  1. , których stosowanie gabloty pomocą XmlSluper bardziej sensowne niż XMLParser i vice-versa (z punktu widzenia łatwości obsługi interfejsu API/składni)?

  2. Który z nich jest bardziej wydajny? (wygląda jak Slurper)

  3. , który z nich szybciej przetwarza xml?

Przypadek a. kiedy muszę przeczytać prawie wszystkie węzły w xml?

Przypadek b. kiedy muszę przeczytać tylko kilka węzłów (np. używając wyrażenia gpath)?

Przypadek c. kiedy muszę zaktualizować/transformować xml?

pod warunkiem, że dokument xml nie jest banalny (z poziomem głębokości i wielkości xml).

Resources:

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html Zjednoczone:

różnica między XMLParser i XMLSlurper:

istnieją podobieństwa między XMLParser i XMLSlurper kiedy wykorzystywane do prostego odczytu, ale kiedy używamy ich do zaawansowany odczyt i gdy przetwarzanie dokumentów XML w innych formatach różni się pomiedzy dwa.

XMLParser przechowuje wyniki pośrednie po analizie dokumentów. Ale na z drugiej strony,

XMLSlurper nie przechowuje wewnętrznych wyników po przetworzeniu dokumentów XML .

Prawdziwe, fundamentalne różnice stają się oczywiste podczas przetwarzania przeanalizowanych informacji . To jest wtedy, gdy przetwarzanie z bezpośrednimi danymi lokalnymi manipuluje i przetwarza w scenariuszu transmisji strumieniowej.

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

Groovy doc (XmlParser, XmlSlurper) i strona Groovy wyjaśnia je dobrze (here i here), ale nie robi wielką pracę w wyjaśnianiu ww pytanie.

Odpowiedz

90

Duża różnica między XmlSlurperem i XmlParserem polega na tym, że Parser tworzy coś podobnego do DOM, podczas gdy Slurper próbuje tworzyć struktury tylko wtedy, gdy jest to naprawdę potrzebne, a zatem używa ścieżek, które są leniwie oceniane. Dla użytkownika oba mogą wyglądać bardzo równomiernie. Różnica polega bardziej na tym, że struktura parsera jest oceniana tylko raz, ścieżki slurper mogą być oceniane na żądanie. Na żądanie można tu odczytać jako "więcej pamięci wydajniej, ale wolniej". Ostatecznie zależy to od tego, ile ścieżek/żądań wykonasz.Jeśli na przykład chcesz tylko znać wartość atrybutu w określonej części kodu XML, a następnie go wykonać, XmlParser nadal będzie przetwarzał wszystkie i wykonuje zapytanie w quasi DOM. W tym czasie zostanie utworzonych wiele obiektów, wydanych na pamięć i procesor. XmlSlurper nie tworzy obiektów, a tym samym oszczędza pamięć i procesor. Jeśli mimo wszystko potrzebujesz wszystkich części dokumentu, slurper traci przewagę, ponieważ stworzy co najmniej tyle obiektów, ile zrobiłby analizator składni.

Oba mogą wykonywać transformacje na dokumencie, ale slurper zakłada, że ​​jest stały i dlatego musisz najpierw napisać zmiany i utworzyć nowy slurper, aby odczytać nowy xml. Parser wspiera poprawne wyświetlanie zmian z dala.

Tak więc odpowiedź na pytanie (1), przypadek użycia, byłby taki, że używasz parsera, jeśli musisz przetworzyć cały kod XML, slurper, jeśli tylko jego części. API i składnia nie odgrywają w tym żadnej roli. Ludzie Groovy starają się uczynić te dwa bardzo podobne w doświadczeniach użytkowników. Również wolisz parser nad suwakiem, jeśli chcesz wprowadzić przyrostowe zmiany w pliku XML.

Powyższe wprowadzenie również wyjaśnia, czym jest pamięć, pytanie (2). Slurper jest, chyba że mimo wszystko przeczytasz, to parser może, ale nie mam rzeczywistych liczb o tym, jak duża jest różnica.

Na pytanie (3) można również odpowiedzieć w intro. Jeśli masz wiele leniwych ocenianych ścieżek, musisz ponownie wykonać eval, wtedy może to być wolniejsze, niż po prostu nawigacja istniejącego wykresu, jak w parserze. Tak więc analizator składni może być szybszy, w zależności od sposobu użycia.

Powiedziałbym (3a), że odczytanie prawie wszystkich węzłów nie ma większego znaczenia, ponieważ wtedy żądania są bardziej decydującym czynnikiem. Ale w przypadku (3b) powiedziałbym, że slurper jest szybszy, jeśli wystarczy przeczytać kilka węzłów, ponieważ nie będzie musiał tworzyć kompletnej struktury w pamięci, co samo w sobie kosztuje już czas i pamięć.

Co do (3c) ... te dni mogą zaktualizować/przekształcić XML, który jest szybszy, w rzeczywistości jest bardziej powiązany z tym, ile części xml trzeba zmienić. Jeśli wiele części powiedziałbym parsera, jeśli nie, to może slurper. Ale jeśli chcesz na przykład zmienić wartość atrybutu z "Fred" na "John" z suwakiem, aby później zapytać o "Johna" używając tego samego slurpera, to nie zadziała.

+0

Niesamowite wyjaśnienie aktualizacji w odniesieniu do slurper, dzięki. Rozwiązało to mój problem podczas próby usunięcia rekursywnie węzłów, gdy "pusty" w slurper, co oczywiście nie będzie działać. – sandos