Avatar billede mini-me Nybegynder
15. marts 2009 - 01:07 Der er 11 kommentarer

Hjælp til RSS reader

Hej,

Jeg håber der er nogen der kan hjælpe mig - jeg er stødt panden mod muren.

Jeg ønsker at lave en XML reader, som kan hente data fra eks. tv2's RSS feeds.

Jeg har lavet følgende kode, men jeg kan ikke få læst de items fra Tv2, så kan ikke rigtig komme videre.

var xmlHttp
function showRSSFeed()
{
    xmlHttp=GetXmlHttpObject();

    var url="rssFetch.asp";
    url=url+"?sid="+Math.random();
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}

function stateChanged()
{
    if (xmlHttp.readyState==4) // Der er internet forbindelse
    {
        if (xmlHttp.status==200){ // XML siden er læsbar
            var xmldata=xmlHttp.responseXML
            var instanceOfTicker=this
           
            if(xmldata.getElementsByTagName("item").length==0)
            { // Der er ikke fundet emner...
                document.getElementById("title").innerHTML = "Der er ikke fundet nogle emner";
            }
            else
            {
                this.feeditems=xmldata.getElementsByTagName("item")
                for (var i=0; i<this.feeditems.length; i++)
                {
                // Arrayr af items, til senere brug...
                }
            }
        }
    }
}

function GetXmlHttpObject()
{
var xmlHttp=null;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp;
}
Avatar billede chrisbuchholz Nybegynder
16. marts 2009 - 15:37 #1
Jeg vil foreslå dig at læse lidt om nye javascript + dom. Især fordi det der ikke er måden at parse xml i javascript er deprecated.

Det nemmeste ville faktisk være at lave en php/asp fil (eller hvad du nu ønsker) som parser xml'n og spytter dette ud som json. Så kan du derefter hente det ind med javascript ligesom du gør ovenstående, bare med:

xmlData = eval('(' + xmlData + ')');

så har du al' xml'en i et array og du kan f.eks. få titlerne på alle entriesne med:

for(var i = 0; i < xmlData.length; i++)
alert(xmlData[i].title);
Avatar billede olebole Juniormester
17. marts 2009 - 02:13 #2
<ole>

Prøv at lægge et link til XML-filen

/mvh
</bole>
Avatar billede mini-me Nybegynder
17. marts 2009 - 08:37 #3
http://sporten.tv2.dk/rss/sporten.xml

jeg har så lavet min egen fil til at "hente" den, da jeg ikke kan få lov at læse RSS'en fra sites som ikke ligger lokalt.

<%
response.ContentType = "text/xml"
response.Charset = "iso-8859-1"

Response.Buffer = True
Dim xmlFile
Set xmlFile = Server.CreateObject("Msxml2.XMLHTTP")

xmlFile.Open "GET","http://sporten.tv2.dk/rss/sporten.xml", False
xmlFile.Send

Response.write xmlFile.responseText

Set xml = Nothing
%>
Avatar billede olebole Juniormester
17. marts 2009 - 09:47 #4
Du er nødt til at bruge utf-8, når TV2 gør det - og det skal du så også bruge i filen, der viser resultatet (du skal også huske XML-deklarationen):

<%
response.ContentType = "text/xml"
response.Charset = "utf-8"

Response.Buffer = True
Dim xmlFile
Set xmlFile = Server.CreateObject("Msxml2.XMLHTTP")

xmlFile.Open "GET","http://sporten.tv2.dk/rss/sporten.xml", False
xmlFile.Send

Response.write "<?xml version=""1.0"" encoding=""utf-8""?>" & xmlFile.responseText

Set xml = Nothing
%>

Traversering og oprettelse af DOMElementer må vente til i aften  =)
Avatar billede mini-me Nybegynder
17. marts 2009 - 09:52 #5
Jeg takker indtil videre og ser frem til i aften ;-)
Avatar billede mini-me Nybegynder
26. marts 2009 - 19:49 #6
Hej Ole,

Hvordan står den til med resten ? :-)
Avatar billede olebole Juniormester
27. marts 2009 - 01:01 #7
Sorry ... den stod slet ikke. Jeg havde glemt denne tråd  =)

Når jeg genlæser den, tror jeg bare, der skal stå:
    Response.write xmlFile.responseText

description noden i item noderne indeholder desværre HTML-formaterede data. Jeg har her valgt at vise dig et eksempel med DOM, men hvor jeg indsætter indholdet af description noden med innerHTML ... YDDDRRK!:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>RSS Reader - http://www.eksperten.dk/spm/868143</title>
<style type="text/css">
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
    font: 0.85em verdana, tahoma, sans-serif;
}
#sportContainer img {
    display: block;
    margin: 0 auto;
}
.item {
    width: 200px;
    margin: 5px;
    border: 1px dotted #999;
    float: left;
}
.clear {
    height: 0;
    overflow: hidden;
    clear: both;
}
</style>
<script type="text/javascript">
(function(){if(window.XMLHttpRequest)return;var o=null,s,a=["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0,j=a.length;i<j;s=a[i],i++){try{if(o=new ActiveXObject(s))break}catch(e){}}window.XMLHttpRequest=o?function(){return new ActiveXObject(s)}:null;o=null})();
function gE(id,D){return (D?D:document).getElementById(id)};
function gAt(o,tN){return o.getElementsByTagName(tN)};
function cE(tN,D){return (D?D:document).createElement(tN)};
function sE(o,t,f){if(o.addEventListener)o.addEventListener(t,f,false);else if(o.attachEvent)o.attachEvent("on"+t,function(){f.apply(o)});else if(typeof o["on"+t]=="function"){var x=o["on"+t];o["on"+t]=function(){x.apply(o,arguments);f.apply(o,arguments)};}else o["on"+t]=f};

function insertSports(oXmlDoc) {
    var sTitle, sLink, sDescr, oItem, oLnk, oDv = null,
    aItems = gAt(oXmlDoc, "item"), oCl = cE("div");
    oCl.className = "clear";
    for (var i=0,j=aItems.length; i<j; i++) {
        if (i%4==0) {
            if (oDv) {
                oDv.appendChild(oCl.cloneNode(true));
                oCont.appendChild(oDv);
            }
            oDv = cE(oDv);
        }
        sTitle = gAt(aItems[i], "title")[0].firstChild.nodeValue;
        sLink = gAt(aItems[i], "link")[0].firstChild.nodeValue;
        sDescr = gAt(aItems[i], "description")[0].firstChild.nodeValue;
        oItem = oTempl.cloneNode(true);
        oLnk = gAt(oItem, "a")[0];
        oLnk.setAttribute("href", sLink);
        oLnk.firstChild.nodeValue = sTitle;
        gAt(oItem, "div")[0].innerHTML = sDescr;
        oDv.appendChild(oItem);
    }
}
function loadSports() {
    var oHttp = new XMLHttpRequest();
    oHttp.open("post", "resp.php", true);
    oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    oHttp.onreadystatechange = function(){
        if (oHttp.readyState<4) return;
        insertSports(oHttp.responseXML);
        oHttp = null;
    }
    oHttp.send("contxt=getSports");
}

var oCont = oTempl = null;
function init() {
    oCont = gE("sportContainer");
    oTempl = gAt(oCont, "div")[0];
    oCont.removeChild(oTempl);
}
sE(window, "load", init);
</script>
</head>
<body>

<p><button onclick="loadSports()">Load</button></p>

<div id="sportContainer">
<div class="item">
    <p><a href="">&nbsp;</a></p>
    <div></div>
</div>
</div>

</body>
</html>

Der er brugt nogle wrappers, som står i begyndelsen af JS-blokken. Den første er min XMLHttpRequest wrapper http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php - som du vist kender i forvejen - og resten burde du nok kunne tyde anvendelsen af  ;o)
Avatar billede olebole Juniormester
27. marts 2009 - 01:14 #8
Du burde dog nok gå en helt anden vej - nemlig at hente RSS'en og lægge den (responseText'en) i en DB, som din bruger henter den fra.

Så kunne du evt. først loade XML-strengen ind i et DOMDocument object. Det ville give dig mulighed for at parse XML'en og hente indholdet af description noden ud og parse strengen med RegExp.

Derefter kunne du erstatte tekstrengen i description noden med de hentede data, formateret som XML. Til slut kunne du gemme XML-strengen i databasen.

Det er skod at syndikere HTML-formterede data  :o|
Avatar billede olebole Juniormester
27. marts 2009 - 01:17 #9
Inden du loader, bør du nok lige tømme containeren, hvis der har været loaded noget før:
    while (oCont.firstChild) oCont.removeChild(oCont.firstChild);
Avatar billede olebole Juniormester
27. marts 2009 - 01:20 #10
Spørg, hvis der er noget, du er i tvivl om. Jeg skal op på arbejde, så jeg har ikke taget tid til at kommentere koden  ;o)
Avatar billede mini-me Nybegynder
28. april 2009 - 17:22 #11
Hej,

Har slet ikke fået en mail om at der var kommet svar på dette spørgsmål.

Ole smid et svar, jeg er kommet helt væk fra det lige p.t. men nu har jeg da noget nyt at tage udgangspunkt i.
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