Avatar billede andersasp Nybegynder
15. august 2008 - 14:50 Der er 7 kommentarer og
1 løsning

Fejl ved udskrivning af RSS feeds via array

Hejsa,

Jeg bruger nedenstående script til at skrive nogle RSS feeds ud.. Der sker dog det, at nogle gange hvor der mangler en description til et feed (tror jeg nok), så bliver overskrifter og beskrivelser mixet sammen??

Så man f.eks. får en feed lige som nedenstående, som ikke giver nogen mening :(


Michael Phelps takes sixth Beijing gold in 200M medley
------------------------------------------------------------
SAN FRANCISCO (MarketWatch) -- Warner Bros. Pictures, a unit of Time Warner Inc. , said late Thursday it has delayed the release of "Harry Potter and the Half-Blood Prince" to July 19, 2009. The sixth installment of the Harry Potter franchise had been expected to open at ....


Mit script ser således ud, og jeg er helt blank I hvad der skal gøres for at denne ikke laver denne sammenblanding ?? 

på forhånd tak


' Adressen på det RSS-feed der skal loades
extURL = therssfeedlink

' RSS-feedet loades
set xmlDoc = createObject("Msxml.DOMDocument")
xmlDoc.async = false
xmlDoc.setProperty "ServerHTTPRequest", true
xmlDoc.load(extURL)

' Check at RSS-feedet er loadet korrekt
If (xmlDoc.parseError.errorCode <> 0) then
    ' Udskriv eventuelle fejl (for nem fejlretning)
    Response.Write "XML error: " & xmlDoc.parseError.reason
' Fortsæt hvis alt er ok
Else

    ' Åbn elementet <channel>
    set channelNodes = xmlDoc.selectNodes("//channel/*")

    for each entry in channelNodes
        ' De tre obligatoriske elementer i channel lægges i variable
        if entry.tagName = "title" then
            strChannelTitle = entry.text
        elseif entry.tagName = "description" then
            strChannelDescription = entry.text
        elseif entry.tagName = "link" then
            strChannelLink = entry.text
        end if
    next

    ' Åbn elementerne <item>
    set itemNodes = xmlDoc.selectNodes("//item/*")

    For each item in itemNodes
        ' Elementerne i channel lægges i variable med #%# som adskillelse
        if item.tagName = "title" then
            strItemTitle = strItemTitle & item.text & "#%#"
        elseif item.tagName = "link" then
            strItemLink = strItemLink & item.text & "#%#"
        elseif item.tagName = "description" then
            strItemDescription = strItemDescription & item.text & "#%#"
        end if
    next

    ' Elementerne i channel splittes i arrays
    arrItemTitle        = split(strItemTitle,"#%#")
    arrItemLink        = split(strItemLink,"#%#")
    arrItemDescription    = split(strItemDescription,"#%#")
 
    'response.write "<em>" & strItemDescription & "</em>"


    ' Elementerne i channel udskrives
    'response.write "<ul>"
        for a = 0 to UBound(arrItemTitle) - 1
            'response.write "<li>"
         
            if ubound(arrItemDescription) >= a then
                response.write "<p><b>" & arrItemTitle(a) & "</b>"
             
                response.write "<br />" & arrItemDescription(a)
            end if
            'response.write "</li>"
        next
    'response.write "</ul>"
 

    ' Vi rydder op
    set channelNodes = nothing
    set itemNodes = nothing

End If
Avatar billede softspot Forsker
16. august 2008 - 22:12 #1
Kan du give et eksempel på hvordan de rå data i dit feed ser ud?
Avatar billede andersasp Nybegynder
18. august 2008 - 08:57 #2
Hejsa, ja du kan se det her:

http://www.spreadinvest.dk/rss/showuniquefeed.asp

Det er en lidt lang liste.. men hvis du søger på "Oil sinks as global economy slows" (virker nok kun en dags tid, da de ændrer sig hele tiden) kan du se at overskriften ikke passer med beskrivelsen.. så der må være et eller andet sted hvor scriptet går i ged.. den fejl..

Jeg har en eller anden fornemmelse at det sker når nedenstående kke passer

            if ubound(arrItemDescription) >= a then
                response.write "<p><b>" & arrItemTitle(a) & "</b>"
                response.write "<br />" & arrItemDescription(a)
            end if

Men jeg er helt blank over for hvad der går galt :(
Avatar billede softspot Forsker
18. august 2008 - 10:44 #3
Er der ikke et underliggende XML-dokument som indeholder disse feeds (det du linker til er vel efter du har behandlet feeddata, eller hvad)?
Avatar billede andersasp Nybegynder
18. august 2008 - 11:13 #4
Jo det er det, som du kan se udfra listen står der i toppen hvilken Feed nyhederne kommer fra, så kører den bare i LOOP.. men ved nogle feeds bliver overskrifterne forskubbet i forhold til beskrivelsen.. og det (tror jeg) sker når den laver den fejl at der mangler beskrivelse til en feed.. men jeg er helt ny i RSS feeds, så det er kun et gæt :(

Feed loop

  news loop
  news loop end

feed loop end
Avatar billede softspot Forsker
18. august 2008 - 11:35 #5
Ahaaa! Nu tror jeg at jeg fatter hvad det er du prøver (og hvad der går galt) :D

I stedet for at bygge dine arrays op baseret på at der er en node, så skal du nok prøve at spørge efter noden i stedet for at iterere over dem der eksisterer (du ved jo hvilke noder du forventer i det enkelte "item"...). Så i stedet for at gøre sådan:

    set itemNodes = xmlDoc.selectNodes("//item/*")

    For each item in itemNodes
        ' Elementerne i channel lægges i variable med #%# som adskillelse
        if item.tagName = "title" then
            strItemTitle = strItemTitle & item.text & "#%#"
        elseif item.tagName = "link" then
            strItemLink = strItemLink & item.text & "#%#"
        elseif item.tagName = "description" then
            strItemDescription = strItemDescription & item.text & "#%#"
        end if
    next

Bør du nok gøre noget i stil med dette:

    set itemNodes = xmlDoc.selectNodes("//item")
    For each item in itemNodes
        ' Elementerne i channel lægges i variable med #%# som adskillelse
        set title = item.selectSingleNode("title")
        set link = item.selectSingleNode("link")
        set description = item.selectSingleNode("description")

        if not title is nothing then
            strItemTitle = strItemTitle & title.text & "#%#"
        else
            strItemTitle = strItemTitle & "#%#"
        end if
        if not link is nothing then
            strItemLink = strItemLink & link.text & "#%#"
        else
            strItemLink = strItemLink & "#%#"
        end if
        if not description is nothing then
            strItemDescription = strItemDescription & description.text & "#%#"
        else
            strItemDescription = strItemDescription & "#%#"
        end if
    next

På denne måde sikrer du dig at de enkelte arrays er synkrone hvad indeksering angår.
Avatar billede andersasp Nybegynder
18. august 2008 - 11:43 #6
Nu tror jeg det virker :) - det er jo helt perfekt.. tusinde tak for hjælpen... det kunne jeg ikke have klaret uden dig... jeg smider lige hele koden, da andre måske kunne få gavn af den :)

Smid lige et meget velfortjent svar :)

<%
set findallthelinks = Connbrugere.Execute("select * FROM rsslinks")

do while not findallthelinks.eof

therssfeedlink     = findallthelinks("DFLink")
therssfeedlink    = replace(therssfeedlink, " ", "")
therssfeedlink    = replace(therssfeedlink, "?cat=3&scat=27", "")

response.write "<p>*************************** " & therssfeedlink & " *************************<p>"

' ****************************************************************
' Dette script kan benyttes gratis, frit, og uden at indhente tilladelse først
' - dog må selve kildekoden ikke distribueres på andre sites end HTML.dk
' Kontakt HTML.dk hvis du er i tvivl
' ****************************************************************

' Adressen på det RSS-feed der skal loades
extURL = therssfeedlink

' RSS-feedet loades
set xmlDoc = createObject("Msxml.DOMDocument")
xmlDoc.async = false
xmlDoc.setProperty "ServerHTTPRequest", true
xmlDoc.load(extURL)

' Check at RSS-feedet er loadet korrekt
If (xmlDoc.parseError.errorCode <> 0) then
    ' Udskriv eventuelle fejl (for nem fejlretning)
    Response.Write "XML error: " & xmlDoc.parseError.reason
' Fortsæt hvis alt er ok
Else

    ' Åbn elementet <channel>
    set itemNodes = xmlDoc.selectNodes("//item")
    For each item in itemNodes
        ' Elementerne i channel lægges i variable med #%# som adskillelse
        set title = item.selectSingleNode("title")
        set link = item.selectSingleNode("link")
        set description = item.selectSingleNode("description")

        if not title is nothing then
            strItemTitle = strItemTitle & title.text & "#%#"
        else
            strItemTitle = strItemTitle & "#%#"
        end if
        if not link is nothing then
            strItemLink = strItemLink & link.text & "#%#"
        else
            strItemLink = strItemLink & "#%#"
        end if
        if not description is nothing then
            strItemDescription = strItemDescription & description.text & "#%#"
        else
            strItemDescription = strItemDescription & "#%#"
        end if
    next

    ' Elementerne i channel splittes i arrays
    arrItemTitle         = split(strItemTitle,"#%#")
    arrItemLink         = split(strItemLink,"#%#")
    arrItemDescription     = split(strItemDescription,"#%#")
   
    'response.write "<em>" & strItemDescription & "</em>"


    ' Elementerne i channel udskrives
    'response.write "<ul>"
        for a = 0 to UBound(arrItemTitle) - 1
            'response.write "<li>"
           
            if ubound(arrItemDescription) >= a then
                response.write "<p><b>" & arrItemTitle(a) & "</b>"
               
                response.write "<br />" & arrItemDescription(a)
            end if
            'response.write "</li>"
        next
    'response.write "</ul>"
   

    ' Vi rydder op
    set channelNodes = nothing
    set itemNodes = nothing

End If


    findallthelinks.MoveNext
loop
findallthelinks.close
%>
Avatar billede softspot Forsker
18. august 2008 - 11:53 #7
Velbekomme :)
Avatar billede softspot Forsker
18. august 2008 - 12:24 #8
Tak for point :)
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
Kurser inden for grundlæggende programmering

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