Avatar billede weeelo Nybegynder
17. august 2006 - 16:10 Der er 10 kommentarer og
1 løsning

RSS-parser hjælp..

Hejsa,

Jeg benytter en RSS-parser, men synes ofte at der opstår fejl i de feeds jeg prøver at bruge. De forskellige feeds, er i et array, men kan det lade sig gøre at springe et feed over, hvis der ikke kan oprettes forbindelse til dette, eller hvis der opstår en fejl i feedet?

$feeds = Array(
        "feed1",
        "feed2"
        "etc..");
for($i = 0; $i < count($feeds); $i++)
{
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen("$feeds[$i]","r")
    or die("Error reading RSS data.");
while ($data = fread($fp, 4096))
    xml_parse($xml_parser, $data, feof($fp))
        or die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($xml_parser)),
            xml_get_current_line_number($xml_parser)));
}
fclose($fp);
xml_parser_free($xml_parser);

Håber at nogle kan være behjælpelige. Skal jeg copy-paste hele koden?
Avatar billede weeelo Nybegynder
17. august 2006 - 16:29 #1
Kan se det måske ikke blev forklaret helt tydeligt. Jeg har i alt 10-15 forskellige feeds, som jeg bruger, men hvis bare ét feed går død, så går det udover resten og så står jeg med ingenting - hvilket er ret irriterende.

Kan det lade sig gøre med et par modifikationer, at ændrer lidt således, at et dødt eller fejlet feed ignoreres og der fortsættes med de resterende "raske" feeds?

MVH Weeelo
Avatar billede weeelo Nybegynder
18. august 2006 - 13:26 #2
Ingen hjælp her?
Avatar billede weeelo Nybegynder
18. august 2006 - 17:18 #3
$fp = fopen("$feeds[$i]","r")
    or die("Error reading RSS data.");

Kan jeg ændre den til:

$fp = fopen("$feeds[$i]","r");
Avatar billede nielle Nybegynder
18. august 2006 - 17:32 #4
Du kan jo prøve med nogt i denne stil:

$feeds = Array(
        "feed1",
        "feed2"
        "etc..");

for ($i = 0; $i < count($feeds); $i++)
{
    $xml_parser = xml_parser_create();
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");

    $fp = fopen($feeds[$i], "r");
    if ($fp !== false)
    {
        while ($data = fread($fp, 4096))
            xml_parse($xml_parser, $data, feof($fp)) or die(sprintf("XML error: %s at line %d",
                xml_error_string(xml_get_error_code($xml_parser)),
                xml_get_current_line_number($xml_parser)));
        fclose($fp);
    }

    xml_parser_free($xml_parser);
}
Avatar billede weeelo Nybegynder
18. august 2006 - 17:46 #5
nielle > Det ser umiddelbart ud til at virke. Jeg har testet det med et feed, der ikke eksisterede og der fortsatte den.

Hvis du er sikker i din sag, så smid endelig et svar. Jeg afventer dog lige et par timer  for at se om der opstår nogle problemer. MANGE TAK for løsningen, hvis det holder er det helt fantastisk!
Avatar billede nielle Nybegynder
18. august 2006 - 18:06 #6
fopen() returnere false hvis det ikke går godt at åbne feedet. Derfor tjekker jeg på den returnerede værdi:

    $fp = fopen($feeds[$i], "r");
    if ($fp !== false)
    {
        ...
    }

Desuden har jeg flyttet lidt rundt på dine linjer sådan at koden giver mere fornuft generelt:

1) F.eks. bliver fclose($fp) kun kaldt hvis det gik godt at åbne feedet,
2) xml_parser_free($xml_parser) er flyttet indenfor i løkken sådan at der er et kald til xml_parser_free() for hvert kald til xml_parser_create(),
3) og fopen("$feeds[$i]","r") er ændret til fopen($feeds[$i],"r"). De ekstre "-tegn er nemligt totalt overflødige og gør kun applikationen (lidt) tungere.

Jo, jeg er ret sikker på at det var det der skulle til. :^)

Men, jeg venter nu gerne til at du siger god for den.
Avatar billede weeelo Nybegynder
21. august 2006 - 21:48 #7
Ja, nu har den kørt et par dage uden den mindste snært af problemer, så skal du selvfølgelig ha' dine point.

Jeg takker rigtig mange gange - det er super, at det nu kan køre problemfrit uden man manuelt skal fjerne "dårlige" feeds.
Avatar billede nielle Nybegynder
21. august 2006 - 22:48 #8
Svar :^)
Avatar billede weeelo Nybegynder
02. september 2006 - 12:39 #9
Hmmm...

Det lader til at det åbenbart ikke var helt nok.

Ved en XML-tolkningsfejl, springer den ikke videre til næste feed.

Fejlen ses her:
www.sport-iweb.dk/screendump.gif

Det betyder, at hvis den modtager sådan en fejl, droppes de sidste feeds på listen.

Kan det klares, således at "fejl"-feedet blot springes over istedet for?
Avatar billede nielle Nybegynder
02. september 2006 - 16:19 #10
Måske er det nok at droppe ... or die() ... delen i denne:

xml_parse($xml_parser, $data, feof($fp)) or die(sprintf("XML error: %s at line %d",
    xml_error_string(xml_get_error_code($xml_parser)),
    xml_get_current_line_number($xml_parser)));

Altså:

xml_parse($xml_parser, $data, feof($fp));
Avatar billede weeelo Nybegynder
02. september 2006 - 16:50 #11
Det lader det til. Mange tak igen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester