Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][xml] Parsowanie niepełnego xml
Forum PHP.pl > Forum > PHP
janlgorski
Moim celem jest optymalizacja transferu na serwer. Muszę skanować w pewnych odstępach czasu dużą liczbę strumieni RSS (xml). Co pewien czas skrypt odwiedza strony, ściąga xml i próbuje zobaczyć, czy pojawiło się coś nowego. Niestety sam fakt pobrania całego pliku RSS nie musi oznaczać, że cokolwiek nowego doszło, a jeśli doszło, to zazwyczaj z pobranych 300kb potrzebuję jedynie pierwszych kilkanaście.

Po używaniu 'wyszukaj', doszedłem do wniosku, że potrzebny mi SAX parser, albo PULL parser. Wybór padł na XMLReader i file_get_contents. W file_get_contents precyzuję zakres znaków od 0 do X, ściągam ten kawałek i próbuję parsować niepoprawny plik xml, skacząc z elementu na element. Niestety, kończy się to komunikatem Extra content at the end of the document in.

Może można podejść do problemu inaczej? Sam nie wiem jak zachowuje się pobieranie zdalnego pliku jako 'strumień'? A może jest jeszcze inny sposób?

Być może poruszone przeze mnie zagadnienie jest już opracowane, ale ja sam nie mam takiej wiedzy. Spróbuję jednak zadać ciut inne pytanie. Otóż, co można wykorzystać do parsowania kawałka pliku XML, żeby wydobyć z niego pełne elementy, ignorując błędy?

SAX4PHP przy tej próbie wyrzuca błąd :

Cytat
SAXException >> [5]: Invalid document end at 1,4251


Mój pomysł polega na tym, żeby pociągnąć strumieniem fragment pliku XML(RSS feed) i sprawdzać go po kawałku. Jeśli okaże się, że przeczytany fragment jest już w bazie danych, skrypt przestanie dalej czytać ten plik, co zaoszczędzi transfer.
irmidjusz
ciekawe zagadnienie, tutaj takie luźne myśli:

1. może w cale nie musisz parsować tego częściowego XMLa? może wystarczy usunięcie białych znaków i porównanie tekstu, albo coś innego w ten deseń?

2. może jakieś kluczowe fragmenty do porównania znajdziesz łatwo wyrażeniami regularnymi?

3. może jest gotowa biblioteka "naprawiająca" uszkodzony XML, tzn. zamykająca wszystkie otwarte tagi? może mógłbyś sam taką napisać? I dopiero po tym przetwarzać XML?
janlgorski
Znając strukturę XML można przy pomocy wyrażenia regularnego sprawdzać, czy dany węzeł został już ściągnięty, jeśli nie, dalej czytać strumień. Jeśli węzeł został ściągnięty, można przekazać go odpowiedniej specjalizowanej funkcji do parsowania. W zasadzie to moje tymczasowe rozwiązanie. Jeżeli macie lepszy pomysł, lub wiecie, że ten nie jest najlepszy, możecie mi oszczędzić pracy ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.