JavaScript Problem mit RSS Parser & for(...)

david96

Ensign
Registriert
März 2007
Beiträge
218
Hio,
HTML:
<html>
<head>
<title>RSS Parser Test</title>
<script type="text/javascript" language="javascript">
var http_request = false;

function doRequest(url) {
    /* if(!widget.sysInfo.network.getIsNetworkAvailable()) {
        document.write('Error: Network connection not available');
        return false;
    } */
    
    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    } catch (e) {}
    
    http_request = false;
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
        http_request.overrideMimeType('text/xml');
    }    
    
    if (!http_request) {
        document.write('Error: Cannot create XMLHTTP instance');
        return false;
    }

    http_request.open('GET', url, true);
    http_request.onreadystatechange = parseFeed;
    http_request.send(null);
}

function parseFeed() {
    if (http_request.status == 200) {
        var xmlstring = http_request.responseText;
        var xmlobject = (new DOMParser()).parseFromString(xmlstring, "text/xml");
        
        var root     = xmlobject.getElementsByTagName('rss')[0];
        var channels = root.getElementsByTagName("channel");
        var items    = channels[0].getElementsByTagName("item");

        for (int i=0; i<5; i++) {
            var desc = items[i].getElementsByTagName("description")[0].firstChild.nodeValue;
            var head = items[i].getElementsByTagName("title")[0].firstChild.nodeValue;
            var ref  = items[i].getElementsByTagName("link")[0].firstChild.nodeValue;
            var line = '<a href="' + ref + '">' + head + '</a>';
        
            alert(line);
            //document.write('<br>');
            alert(desc);
            //document.write('<br>');
        }
    } else {
        document.write('Error: There was a problem with the request.');
        return false;
    }
}
</script>
</head>
<body onload="javascript:doRequest('http://www.tagesschau.de/newsticker.xml');"></body>
</html>
Dieser Code soll den Newsticker der Tagesschau parsen und die ersten 5 Einträge erstmal (wird später noch geändert) per alert ausgeben.

Das ganze hat auch funktioniert, bis ich das for(...) eingebaut habe und anstatt items[0] items reingeschrieben habe. Als es noch funktioniert hat, hat er mir aber seltsamerweise jedes alert 2 mal gegeben ... ?!

Jetzt wird gar nichts mehr angezeigt.

Danke im Vorraus für jegliche Hilfe,

David :)
 
Zuletzt bearbeitet:
Mach mal aus "for (int i=0; i<5; i++) {"
"for (var i=0; i<5; i++) {"

MfG,
tec
 
Danke, dass funktioniert jetzt. Komme aus dem c++ Bereich und habe versucht, das mit der for-Schleife genau so in JS umzusetzen - naja jetzt klappts ja :p

Neues (bzw. altes) Problem: Wie vorher erscheint jetzt jede Meldung 2 mal... d. h. Sobald die 5 Meldungen und die zugehörigen Beschreibungen per OK geschlossen wurden kommt das ganze in gleicher Reihenfolge nochmal... :freak:

edit: Problem gelöst :D

Aktueller Code:
Code:
<html>
<head>
<title>RSS Parser Test</title>
</head>
<body>
<input type="button" name="button" value="Load & Update" onclick="javascript:doRequest('http://www.tagesschau.de/newsticker.xml');">
<script type="text/javascript" language="javascript">
var http_request = false;

function doRequest(url) {
    /* if(!widget.sysInfo.network.getIsNetworkAvailable()) {
        document.write('Error: Network connection not available');
        return false;
    } */

    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    } catch (e) {}

    http_request = false;
    http_request = new XMLHttpRequest();

    if (http_request.overrideMimeType) {
        http_request.overrideMimeType('text/xml');
    }

    if (!http_request) {
        document.write('Error: Cannot create XMLHTTP instance');
        return false;
    }

    http_request.open('GET', url, true);
    http_request.onreadystatechange = parseFeed;
    http_request.send(null);
}

function parseFeed() {
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
            var xmlstring = http_request.responseText;
            var xmlobject = (new DOMParser()).parseFromString(xmlstring, "text/xml");

            var root     = xmlobject.getElementsByTagName('rss')[0];
            var channels = root.getElementsByTagName("channel");
            var items    = channels[0].getElementsByTagName("item");

            for (var i=0; i<5; i++) {
                var desc = items[i].getElementsByTagName("description")[0].firstChild.nodeValue;
                var head = items[i].getElementsByTagName("title")[0].firstChild.nodeValue;
                var ref  = items[i].getElementsByTagName("link")[0].firstChild.nodeValue;
                var line = '<a href="' + ref + '">' + head + '</a>';

                document.write(line + '<br>' + desc + '<br><br>');
            }
        } else {
            document.write('Error: There was a problem with the request.');
            return false;
        }
    }
}
</script>
</body>
</html>
Neues Problem: Sobald ich auf den Button klicke, werden zwar die ersten 5 Ergebnisse geladen und ins Dokument geschrieben. Aber oben im Firefox wird durch den sich drehenden Kreis angezeigt, dass die Seite immer weiter lädt. Außerdem wird alles überschrieben, also der Button ist weg, der Titel in der Browserleiste oben wird nicht angezeigt und der Quellcode ist leer.

Ich führe das ganze offline von meinem PC ohne Serverumgebung aus. Wenn ich anstatt document.write ein alert mache, geht alles.

Wodran kann das liegen und gibt es noch andere Möglichkeiten, dass ganze in einen div-Container reinzubekommen? Jede Nachricht soll in ihren eigenen Container, der per seperatem Stylesheet gestyled wird.

Grüße
 
Zuletzt bearbeitet:
Am besten benützt du dafür 5 leere Div Container, die du dir dann im JS Code als DOM Nodes (wenn sie sowieso einzelnd gestylet werden per ID, geht aber auch über eine gemeinsame Klasse oder einfach den Tag, wo du dann alle Elemente in einem Array zurück bekommst) holst und per JS-Funktion innerHTML den Content in die Container schreibst.

Ich habs dir mal hergerichtet:

PHP:
<html>
<head>
<title>RSS Parser Test</title>
</head>
<body>
<input type="button" name="button" value="Load & Update" onclick="javascript:doRequest('http://www.tagesschau.de/newsticker.xml');">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<script type="text/javascript" language="javascript">
var http_request = false;

function doRequest(url) {
    /* if(!widget.sysInfo.network.getIsNetworkAvailable()) {
        document.write('Error: Network connection not available');
        return false;
    } */

    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    } catch (e) {}

    http_request = false;
    http_request = new XMLHttpRequest();

    if (http_request.overrideMimeType) {
        http_request.overrideMimeType('text/xml');
    }

    if (!http_request) {
        document.write('Error: Cannot create XMLHTTP instance');
        return false;
    }

    http_request.open('GET', url, true);
    http_request.onreadystatechange = parseFeed;
    http_request.send(null);
}

function parseFeed() {
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
            var xmlstring = http_request.responseText;
            var xmlobject = (new DOMParser()).parseFromString(xmlstring, "text/xml");

            var root     = xmlobject.getElementsByTagName('rss')[0];
            var channels = root.getElementsByTagName("channel");
            var items    = channels[0].getElementsByTagName("item");
            var divs     = document.getElementsByTagName("div");

            for (var i=0; i<5; i++) {
                var desc = items[i].getElementsByTagName("description")[0].firstChild.nodeValue;
                var head = items[i].getElementsByTagName("title")[0].firstChild.nodeValue;
                var ref  = items[i].getElementsByTagName("link")[0].firstChild.nodeValue;
                var line = '<a href="' + ref + '">' + head + '</a>';

                divs[i].innerHTML = (line + '<br>' + desc + '<br><br>');
            }
        } else {
            alert('Error: There was a problem with the request.');
            return false;
        }
    }
}
</script>
</body>
</html>

Dein Problem lag übrigens darin, dass du mit document.write soweit ich weiß nicht neuen Inhalt hinzufügst sondern einfach alles überschreibst.

Achja und hier noch ein Link falls du den divs eine Klasse geben willst und sie über die Klasse suchen willst (Das mit dem document.getElementsByTagName wird wohl keinen Bestand haben): Alle Elemente die eine gemeinsame "class" haben mit JS holen.

- Fedex
 
Zurück
Oben