{"id":15716,"date":"2026-09-06T10:40:18","date_gmt":"2026-09-06T08:40:18","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/rss-atom-feed-checker\/"},"modified":"2026-09-06T10:40:18","modified_gmt":"2026-09-06T08:40:18","slug":"rss-atom-feed-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/","title":{"rendered":"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig?"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Ein Feed ist der eine Teil einer Seite, den andere Programme unmittelbar lesen. Das macht ihn ungew\u00f6hnlich unnachsichtig: Ein einziges nicht maskiertes Und-Zeichen, und ein Leseprogramm h\u00f6rt mitten in der Datei auf. Diese Pr\u00fcfung liest die Feed-Verweise aus der Seite, holt sie und liest nach, was ein Leseprogramm wirklich braucht.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"feed-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Seitenadresse<\/label><br \/>\n        <input id=\"feed-url\" type=\"text\" value=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Von diesem Server: eine Anfrage f\u00fcr die Seite und bis zu drei f\u00fcr Feeds, jede mit 1-MB-Bremse. Es werden keine Cookies gesendet, keine Skripte ausgef\u00fchrt und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.<\/p>\n<p>    <button id=\"feed-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Feeds pr\u00fcfen<\/button><\/p>\n<div id=\"feed-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Grenzen, die zu kennen sich lohnt: Verfolgt werden nur Feeds, die im ausgelieferten HTML verlinkt sind. Ist keiner verlinkt, werden \/feed\/ und \/rss.xml probiert \u2014 eine Seite mit einem anderen Pfad wird als Seite ohne Feed gemeldet, und genau das w\u00fcrde ein Leseprogramm auch schlie\u00dfen.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Ein Feed ist der eine Teil einer Seite, den andere Programme unmittelbar lesen. Das macht ihn ungew\u00f6hnlich unnachsichtig: Ein einziges nicht maskiertes Und-Zeichen, und ein Leseprogramm h\u00f6rt mitten in der Datei auf. Diese Pr\u00fcfung liest die Feed-Verweise aus der Seite, holt sie und liest nach, was ein Leseprogramm wirklich braucht.\",\"label_url\":\"Seitenadresse\",\"datenschutz\":\"Von diesem Server: eine Anfrage f\u00fcr die Seite und bis zu drei f\u00fcr Feeds, jede mit 1-MB-Bremse. Es werden keine Cookies gesendet, keine Skripte ausgef\u00fchrt und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.\",\"knopf\":\"Feeds pr\u00fcfen\",\"laeuft\":\"Seite und Feeds werden geholt...\",\"grenze\":\"Grenzen, die zu kennen sich lohnt: Verfolgt werden nur Feeds, die im ausgelieferten HTML verlinkt sind. Ist keiner verlinkt, werden \\\/feed\\\/ und \\\/rss.xml probiert \u2014 eine Seite mit einem anderen Pfad wird als Seite ohne Feed gemeldet, und genau das w\u00fcrde ein Leseprogramm auch schlie\u00dfen.\",\"h_feeds\":\"Gepr\u00fcfte Feeds\",\"tabelle_hinweis\":\"Gefunden sagt, ob der Feed in der Seite verlinkt war oder nur an einem \u00fcblichen Pfad geraten wurde. Art ist das, was das XML tats\u00e4chlich ist, nicht das, was der Verweis behauptet hat.\",\"h_befunde\":\"Befunde\",\"sp_feed\":\"Feed\",\"sp_gefunden\":\"Gefunden\",\"sp_status\":\"Status\",\"sp_typ\":\"Content-Type\",\"sp_art\":\"Art\",\"sp_eintraege\":\"Eintr\u00e4ge\",\"zeile_seite\":\"Seite\",\"zeile_verlinkt\":\"In der Seite verlinkte Feeds\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Pr\u00fcfungen in dieser Stunde \u00fcbrig\",\"wert_fehlt\":\"fehlt\",\"wert_verlinkt\":\"verlinkt\",\"wert_geraten\":\"geraten\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu melden.\",\"urteil_gut\":\"Der Feed ist auffindbar und in Ordnung.\",\"urteil_warnung\":\"Der Feed funktioniert, etwas daran wird ein Leseprogramm aber \u00e4rgern.\",\"urteil_kritisch\":\"Der Feed l\u00e4sst sich nicht lesen, oder die Adresse liefert keinen.\",\"fehler_kein_token\":\"Die Pr\u00fcfung lie\u00df sich nicht starten, weil reCAPTCHA nicht geladen hat.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft meist.\",\"fehler_zu_viele\":\"Das Limit von {limit} Pr\u00fcfungen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_adresse\":\"Diese Adresse l\u00e4sst sich nicht verwenden.\",\"fehler_abruf\":\"Die Seite lie\u00df sich nicht abrufen.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts gepr\u00fcft.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage lie\u00df sich nicht lesen.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort lie\u00df sich nicht lesen.\",\"fehler_unbekannt\":\"Es ist etwas schiefgegangen, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Die Eingabe ist zu lang.\",\"grund_unlesbar\":\"Das ergibt keine Adresse.\",\"grund_schema\":\"Gepr\u00fcft werden nur http- und https-Adressen.\",\"grund_benutzerinfo\":\"Eingaben mit Zugangsdaten darin werden abgewiesen.\",\"grund_kein_punkt\":\"Der Hostname braucht mindestens einen Punkt.\",\"grund_hostform\":\"Erwartet wird ein Hostname, keine IP-Adresse.\",\"grund_port\":\"Gepr\u00fcft werden nur die Ports 80, 443, 8080 und 8443.\",\"grund_gesperrter_bereich\":\"Dieser Host l\u00f6st in ein privates oder reserviertes Netz auf. Solche werden nie abgerufen.\",\"grund_kein_dns\":\"Der Hostname l\u00f6st nicht auf.\",\"grund_abruf\":\"Die Adresse hat nicht geantwortet.\",\"grund_zu_viele_spruenge\":\"Die Adresse leitet zu oft weiter.\",\"befund_status\":\"Die Seite antwortete mit Status {status} || Die Feed-Verweise wurden trotzdem aus dem gelieferten Rumpf gelesen.\",\"befund_feed_unerreichbar\":\"Ein verlinkter Feed lie\u00df sich nicht abrufen || {url}, Grund: {grund}. Die Seite zeigt darauf, Leseprogramme versuchen es also und scheitern.\",\"befund_feed_status\":\"Ein verlinkter Feed antwortet mit Status {status} || {url}. Der Verweis steht in der Seite, dahinter ist aber nichts.\",\"befund_feed_zu_gross\":\"Ein Feed ist gr\u00f6\u00dfer als {kb} KB || {url}. Er wurde nicht zerlegt. So gro\u00dfe Feeds tragen meist den Volltext jedes je geschriebenen Beitrags; die meisten Leseprogramme brauchen nur die neuesten Eintr\u00e4ge.\",\"befund_nicht_wohlgeformt\":\"Ein Feed ist kein wohlgeformtes XML || {url}, Zeile {zeile}: {meldung}. Leseprogramme h\u00f6ren an dieser Stelle auf \u2014 ein nicht maskiertes Und-Zeichen oder ein verirrtes Steuerzeichen gen\u00fcgt. Alles danach wird nicht mehr gelesen.\",\"befund_kein_feed\":\"Die Adresse liefert keinen Feed || {url} ist zwar XML, das Wurzelelement hei\u00dft aber {wurzel}. Dort wohnt etwas anderes.\",\"befund_feed_unlesbar\":\"Ein Feed lie\u00df sich nicht lesen || {url}, Grund: {grund}\",\"befund_feed_nicht_verlinkt\":\"Unter {url} liegt ein Feed, der in der Seite nicht verlinkt ist || Er antwortet, und er ist ein g\u00fcltiger {art}-Feed. Ohne link-Element im Kopf k\u00f6nnen Leseprogramme ihn nicht entdecken \u2014 es findet ihn nur, wer die Adresse ohnehin kennt.\",\"befund_ohne_content_type\":\"Der Feed kommt ohne Content-Type || {url}. Leseprogramme raten dann, und manche raten falsch.\",\"befund_falscher_content_type\":\"Der Feed wird als {typ} ausgeliefert || {url}. Erwartet werden application\\\/rss+xml oder application\\\/atom+xml; bei text\\\/plain oder text\\\/html verweigern manche Leseprogramme den Dienst.\",\"befund_feed_als_html\":\"Der Feed wird als text\\\/html ausgeliefert || {url}. Browser stellen ihn dar, Leseprogramme weisen ihn ab.\",\"befund_ohne_titel\":\"Der Feed hat keinen Titel || {url}. Er erscheint in einem Leseprogramm dann unter seiner Adresse.\",\"befund_ohne_selbstverweis\":\"Der Feed tr\u00e4gt keinen Selbstverweis || {url}. Ein {art}-Feed sollte seine eigene Adresse nennen, damit eine weitergereichte Kopie noch nach Hause zeigt. Es ist eine einzige Zeile, und sie fehlt erstaunlich oft.\",\"befund_selbstverweis_abweichend\":\"Der Selbstverweis zeigt woandershin || Angegeben: {gemeldet}, geholt von: {geholt}. Leseprogramme, die der angegebenen Adresse folgen, abonnieren unter Umst\u00e4nden einen anderen Feed.\",\"befund_ohne_eintraege\":\"Der Feed hat keine Eintr\u00e4ge || {url}. G\u00fcltig und nutzlos: Ein Leseprogramm hat nichts zu zeigen und wirft das Abonnement wom\u00f6glich weg.\",\"befund_eintraege\":\"{n} Eintr\u00e4ge im {art}-Feed || {url}\",\"befund_eintraege_ohne_datum\":\"{n} von {gesamt} Eintr\u00e4gen haben kein lesbares Datum || Leseprogramme sortieren nach Datum. Eintr\u00e4ge ohne eines landen dort, wo das Programm sie hinlegt, oft dauerhaft ganz oben.\",\"befund_eintraege_ohne_link\":\"{n} Eintr\u00e4ge haben keine Adresse || Der Eintrag l\u00e4sst sich im Leseprogramm lesen, aber es f\u00fchrt kein Weg zur\u00fcck auf die Seite.\",\"befund_eintraege_ohne_titel\":\"{n} Eintr\u00e4ge haben keinen Titel || Leseprogramme zeigen stattdessen die ersten Worte des Textes.\",\"befund_relative_links\":\"{n} Eintr\u00e4ge verwenden relative Adressen || Ein Feed wird au\u00dferhalb der Seite gelesen, eine relative Adresse hat dort keine Grundlage. Manche Leseprogramme raten, die meisten scheitern schlicht.\",\"befund_feed_eingeschlafen\":\"Der neueste Eintrag ist {tage} Tage alt || Kein Mangel, aber Leseprogramme stufen einen ruhenden Feed niedriger ein, und manche fragen ihn nicht mehr ab.\",\"befund_feed_frisch\":\"Der neueste Eintrag ist {tage} Tag(e) alt || Der Feed wird gepflegt.\",\"befund_ohne_aktualisierungsdatum\":\"Der Feed tr\u00e4gt kein Aktualisierungsdatum || Ein {art}-Feed kann angeben, wann er sich zuletzt ge\u00e4ndert hat. Ohne diese Angabe m\u00fcssen Leseprogramme die Eintr\u00e4ge vergleichen, um Neues zu bemerken.\",\"befund_inhaltslaenge\":\"Die Eintr\u00e4ge tragen im Mittel {zeichen} Zeichen || Ob das ein Auszug oder der Volltext ist, ist eine Entscheidung und kein Mangel.\",\"befund_kein_feed_gefunden\":\"Kein Feed gefunden || Weder in der Seite verlinkt noch unter {pfade}. Gibt es einen an anderer Stelle, finden Leseprogramme ihn ebenfalls nicht.\",\"befund_feed_verlinkt\":\"{n} Feed(s) in der Seite verlinkt || Leseprogramme und Browser entdecken sie von selbst.\",\"befund_nur_stichprobe\":\"{gesamt} Feeds sind verlinkt, gepr\u00fcft wurden die ersten {n} || Eine Stichprobe h\u00e4lt die Last auf dem gepr\u00fcften Server klein.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-feedcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function zeichen(w) { return (typeof w === 'string' && w !== '') ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }\n    \/** Adresse auf das kuerzen, was in einer Tabellenzelle lesbar bleibt. *\/\n    function kurz(url) {\n        var s = String(url || '');\n        s = s.replace(\/^https?:\\\/\\\/\/, '');\n        if (s.length <= 52) { return s; }\n        return s.slice(0, 24) + '\u2026' + s.slice(-26);\n    }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var feeds = liste(a.feeds).map(function (z) {\n            return { url: String(z.url || ''), geraten: z.geraten === true, status: zahl(z.status),\n                typ: zeichen(z.typ), art: zeichen(z.art), eintraege: zahl(z.eintraege), kb: zahl(z.kb) };\n        });\n        return {\n            fehler: null, url: String(a.url || ''), endurl: String(a.endurl || ''),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            verlinkt: zahl(a.verlinkt), feeds: feeds,\n            befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'feedcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.FEED = { bewerten: bewerten, darstellen: null, text: text, kurz: kurz, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };\n\n    var btn = document.getElementById('feed-btn');\n    var out = document.getElementById('feed-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n\n    function tabelle(b) {\n        var huelle = el('div', 'overflow-x: auto; margin: 0 0 6px;');\n        var t = el('table', 'border-collapse: collapse; width: 100%; min-width: 620px; font-size: 0.84rem;');\n        var kopf = el('tr', '');\n        [T.sp_feed, T.sp_gefunden, T.sp_status, T.sp_typ, T.sp_art, T.sp_eintraege].forEach(function (n) {\n            kopf.appendChild(el('th', 'text-align: left; padding: 6px 12px 6px 0; color: #8a8a99; font-weight: 700; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.4px; border-bottom: 1px solid var(--border, #2a2a35); white-space: nowrap;', n));\n        });\n        t.appendChild(kopf);\n        b.feeds.forEach(function (z) {\n            var r = el('tr', '');\n            function zelle(txt, stil) { r.appendChild(el('td', 'padding: 7px 12px 7px 0; border-bottom: 1px solid var(--border, #2a2a35); font-family: monospace; color: var(--text-primary, #e8e8ee);' + (stil || ''), txt)); }\n            zelle(kurz(z.url), ' word-break: break-all;');\n            zelle(z.geraten ? T.wert_geraten : T.wert_verlinkt, z.geraten ? WARN : GUT);\n            zelle(z.status !== null ? String(z.status) : T.wert_fehlt, z.status === 200 ? GUT : ROT);\n            zelle(z.typ || '-', GRAU);\n            zelle(z.art || '-', z.art ? GRAU : WARN);\n            zelle(z.eintraege !== null ? String(z.eintraege) : '-', GRAU);\n            t.appendChild(r);\n        });\n        huelle.appendChild(t);\n        return huelle;\n    }\n\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund &#038;&#038; T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));\n\n        var g = gitter('auto auto');\n        paar(g, T.zeile_seite, b.endurl || b.url, GRAU);\n        paar(g, T.zeile_verlinkt, String(b.verlinkt !== null ? b.verlinkt : '-'), b.verlinkt ? GUT : WARN);\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);\n\n        if (b.feeds.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_feeds));\n            ziel.appendChild(tabelle(b));\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 6px; font-size: 0.8rem;', T.tabelle_hinweis));\n        }\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var daten = {};\n                Object.keys(f.daten).forEach(function (n) { daten[n] = (n === 'url') ? kurz(f.daten[n]) : f.daten[n]; });\n                var t = text('befund_' + f.key, daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.FEED.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('feed-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liest die Feed-Verweise einer Seite, holt sie und pr\u00fcft, was ein Leseprogramm braucht: wohlgeformtes XML, einen Content-Type, den niemand raten muss, Eintr\u00e4ge mit Adresse und Datum und einen Selbstverweis, damit der Feed wei\u00df, wo er wohnt. Ist kein Feed verlinkt, werden zwei \u00fcbliche Pfade probiert \u2014 ein Feed, den niemand verlinkt, ist praktisch unsichtbar.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92737,92289,92759],"class_list":["post-15716","page","type-page","status-publish","hentry","tag-content-de","tag-seo-de","tag-web-development-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Liest die Feed-Verweise einer Seite, holt sie und pr\u00fcft, was ein Leseprogramm braucht: wohlgeformtes XML, einen Content-Type, den niemand raten muss, Eintr\u00e4ge mit Adresse und Datum und einen Selbstverweis, damit der Feed wei\u00df, wo er wohnt. Ist kein Feed verlinkt, werden zwei \u00fcbliche Pfade probiert \u2014 ein Feed, den niemand verlinkt, ist praktisch unsichtbar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/rss-atom-feed-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/rss-atom-feed-checker\\\/\",\"name\":\"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-06T08:40:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/rss-atom-feed-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/rss-atom-feed-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/rss-atom-feed-checker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/","og_locale":"en_US","og_type":"article","og_title":"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog","og_description":"Liest die Feed-Verweise einer Seite, holt sie und pr\u00fcft, was ein Leseprogramm braucht: wohlgeformtes XML, einen Content-Type, den niemand raten muss, Eintr\u00e4ge mit Adresse und Datum und einen Selbstverweis, damit der Feed wei\u00df, wo er wohnt. Ist kein Feed verlinkt, werden zwei \u00fcbliche Pfade probiert \u2014 ein Feed, den niemand verlinkt, ist praktisch unsichtbar.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/","name":"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig? - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-06T08:40:18+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/rss-atom-feed-checker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"RSS- und Atom-Feed-Pr\u00fcfer: auffindbar, wohlgeformt und lebendig?"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15716"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15716\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15716"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}