2010-05-11 11 views
7

Używam Java DocumentBuilder.parse(InputStream) do parsowania dokumentu XML. Czasami dostaję zniekształcone dokumenty XML, ponieważ po ostatnim > pojawiają się dodatkowe śmieci, które powodują, że SAXException: Content is not allowed in trailing section. (W przypadkach, które widziałem, śmieć to po prostu jeden lub więcej zerowych bajtów.)Ignorowanie "Treść nie jest dozwolona w sekcji końcowej" SAXException

Nie obchodzi mnie, co jest po ostatecznym >. Czy istnieje łatwy sposób na przeanalizowanie całego dokumentu XML w Javie i czy nie ignoruje on żadnych śmieci?

Zauważ, że "ignoruj" nie oznacza po prostu uchwycenia i zignorowania wyjątku: mam na myśli zignorowanie ciągłego śmiecia, nie rzucającego wyjątku i zwrócenia obiektu Document od czasu XML aż do końcowego > jest prawidłowe.

Odpowiedz

8

Ponieważ nadawca wyświetla nieprawidłowy plik XML, musi zostać poprawiony, zanim trafi do analizatora składni, jeśli chcesz uniknąć tego wyjątku. Jeśli nie możesz poprawić nadawcy, potrzebujesz jakiegoś rodzaju przetwarzania wstępnego.

Jeśli sytuacja jest po prostu taka, że ​​masz dodatkowe puste bajty po tagu zamykającym, na co wskazuje jedna z twoich odpowiedzi na inną odpowiedź, może to być coś, co możesz łatwo osiągnąć, zawijając strumień wejściowy w postaci FilterInputStream, implementuj, aby pominąć bajty null.

Jeśli problem jest bardziej złożony niż tylko puste znaki, będziesz potrzebować bardziej złożonego filtra, co może być trudne

Jeśli używasz ContentHandler, możesz dodać do niego oddzwanianie, aby mógł poinformować kod wywołujący, gdy zakończono koocowy znacznik główny, i na podstawie tej wiedzy kod wywołujący może mieć logikę w swoim obsługi dla wyjątku, aby po prostu zignorować go, jeśli koniec został zasygnalizowany. W tym momencie wszystko, co musiał zrobić parser, zostało prawdopodobnie zrobione! Ale to rozwiązanie nie wydaje się mieć zastosowania w twojej sytuacji.

-5

Nie. Dokument zawierający znaki końcowe nie jest dokumentem XML. Napraw nadawcę.

+3

Nie mam kontroli nad nadawcą. A twoja "odpowiedź" nie jest w duchu "Bądź liberalny w tym, co akceptujesz i surowo w tym, co emitujesz". –

+0

Zapytałeś "czy istnieje łatwy sposób na przeanalizowanie całego dokumentu XML w Javie i zignorowanie wszelkich śmieci?" Odpowiedź brzmi "nie, nie ma" i podałem powód. Może szukasz http://home.ccil.org/~cowan/XML/tagsoup/? Może wiesz, że twój XML nie ma CDATA i możesz zaimplementować prymitywny wrapper inputStream? Nie jestem pewien, jakiej odpowiedzi szukasz. –

+0

Każdy analizator składni XML śledzi każdy element i wie, kiedy wymieniony element został "zamknięty", parsując> jego zamykającego znacznika. Oznacza to, że każdy analizator składni XML zna także końcowe>, gdy widzi je, ponieważ pierwszy element został zbalansowany przez jego znacznik zamykający. W tym momencie chcę, żeby parser po prostu przestał. Sprawiasz, że jest to bardziej skomplikowane, niż jest. –

Powiązane problemy