Parsowanie nievalidującego się XMLa

Witam,

Chciałem użyć w jednej aplikacji httparty (http://github.com/jnunemaker/httparty). Niestety API, którego chcę używać ma błędy w XMLu. Z reguły niedomknięcie jakiegoś taga, albo jakieś inne “literówki”. Na stronie REXMLa jest napisane, że to jest ‘non-validating’ parser, czyli teoretycznie powinien sparsować nawet niewalidujący się dokument.

A httparty rzuca takim wyjątkiem:

REXML::ParseException: Missing end tag for 'costam'

Nie mogłem doszukać się w dokumentacji, czy można jakoś ręcznie wyłączyć walidację. Jest jakaś opcja, żeby taki dokument sparsować? Jeżeli nie, to jaka inna biblioteka?

Use HPricot, Luke!

Ugh, nie, tylko nie HPricot. Lubi sobie segfaultem rzucić, co w przypadku Railsów kończy się oczywiście zejściem całego serwera aplikacji.

Non-validating parser oznacza, że parser nie sprawdza poprawności dokumentu względem schematu ( w odróżnieniu od validating parser’a). To czego szukasz to parser dokumentów “not well-formed”. Nie wiem jak ustawić REXML’a aby to robił, miałem kiedyś znajomego z Ukrainy który opowiadał jak to zrobić ale niestety zapomniałem :slight_smile: . Korzystasz z httparty które tego i tak nie obsłuży (w sensie ustawienia REXML - jesli to w ogóle możliwe), musiałbyś hackować.

Również polecam Hpricot’a, korzystam z niego intensywnie już od ponad roku w system robotów które chodza po sieci i parsują html’a który pod względem “well-formedness” gorszy już być nie może :slight_smile: Ani razu w ciągu tego 1.5 roku nie miałem segfaulta. Hpricot jest dobry jeśli masz niewielkich rozmiarów pliki bo do większych raczej trzeba użyć strumieniowego SAX’a z REXML. W sumie mógłbyś się pobawić SAX’em do tego albo napisać swój parser dokumentów “not well formed” (jeśli już tego ktoś nie zrobił) ale pewnie nie masz na to czasu więc pozostaje Hpricot :slight_smile:

Podejrzewałem, że to musi być błąd w moim rozumieniu tego pojęcia :wink:

Z tego co obczajałem źródła httparty, to on korzysta z Hash.from_xml() z active_support, więc chciałem po prostu zrobić forka i napisać jakiś wymienialny backend, żeby można było wymienić biblioteki xmlowe. W każdym razie to nie jest problem - tak tylko napisałem, żeby był kontekst problemu.

Hpricota używałem i sprawdzałem oczywiście z tym problemem, ale on widząc 2 wpisy robi z nich “” zamiast zrobić z jednego z nich zamknięcie, czyli trochę niestety zmienia. Właściwie to cudów się nie spodziewałem, bo nie da się zrobić parsera, który będzie zgadywał o co chodziło autorowi XMLa :slight_smile: Chciałem się tylko upewnić czy może nie da się tego zrobić jakoś inaczej :slight_smile:

Jedną z opcji jaką wypróbowałem było jeszcze przepuszczenie xmla przez html tidy z opcją -xml. Output taki sam jak w hpricot. Swoją drogą jak ktoś będzie instalował libtidy w ubuntu hardy, to niech od razu ściągnie paczki z gutsy - te nowsze wyrzucają segfaulta.

Co do SAX’a, to nie sądzę żebym potrzebował czegoś mocniejszego. Stosunkowo małe pliki. Ale dzięki za info, może się przydać.

Tomash: nie wykorzystywałem nigdy Hpricota w produkcji jako takiej, ale całkiem sporo chodził przy crawlowaniu i późniejszym parsowaniu stronek, czasami nawet kilka dni bez przerwy się coś mieliło (czysty ruby). Czyli tak jak u hosiawaka - całkiem spoko. Może chodzi o wielkość XMLi tak jak hosiawak wyżej pisał? Albo macie jakieś bardzo niestandardowe haxorskie ustawienia? :slight_smile:

Albo po prostu trafiłem na jakiś zły release w gemsach. W każdym razie dawno nie wywaliłem gema w raptem dwie godziny po instalacji…