Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][xml] Parsowanie niepełnego xml, Optymalizacja transferu, aby nie pobierać całego pliku xml.
janlgorski
post
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
irmidjusz
post
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?
Go to the top of the page
+Quote Post
janlgorski
post
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 ;-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 06:50