![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 13.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 60 Dołączył: 25.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
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? -------------------- there is much to be learned
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 13.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 ;-)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 09:26 |