
- Admin
- Forum-Beiträge: 7.969
08.07.2016, 20:05:48 via Website
08.07.2016 20:05:48 via Website
Ich zeige euch heute wie man aus einem RSS-Feed einen Json-String erstellt und weiterverarbeitet.
TEIL 1
Was wird gebraucht?
- einen Server der PHP und DOMDocument beherrscht.
- einen Texteditor, ich nutze Notepad++ UTF-8 ohne BOM
- Android Studio
Nun geht es los:
Als erstes erstellen wir uns eine PHP-Datei (rss.php), mit den gewohnten PHP-Tags.
<?php
?>
In dem PHP-Tag schreiben wir die Header-Information:
- Type Json
encoding UTF-8.
header("Content-type: application/json; charset=utf-8");
Nun erstellen wir die Variable ($rss_url) für die Url des Feeds und erstellen ein Objekt ($feed) der Klasse DOMDocument. Wenn das geschafft ist, laden wir die Informationen von der Seite des RSS-Feeds in $feed.
$rss_url = 'https://www.nextpit.de/feed/main.xml';
$feed = new DOMDocument();
$feed->load($rss_url);
Mit vier Codezeilen haben wir die halbe Miete, dann holen wir uns nun noch die zweite Hälfte.
Was wir jetzt brauchen, finden wir im Feed selber (er sollte als Quellcode betrachtet werden).
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title>...</title>
<link>https://www.nextpit.de/</link>
<description>...</description>
<language>de</language>
<pubDate>Tue, 05 Jul 2016 09:52:04 GMT</pubDate>
<dc:creator>AndroidPIT</dc:creator>
<dc:date>2016-07-05T09:52:04Z</dc:date>
<dc:language>de</dc:language>
<item>
<title>...</title>
<link>https://...</link>
<description>...</description>
<pubDate>...</pubDate>
<guid isPermaLink="false">...</guid>
<dc:creator>...</dc:creator>
<dc:date>...</dc:date>
</item>
</channel>
</rss>
Schematisch sieht das Ganze so aus, jetzt wird das wichtigste herausgesucht und das bleibt dann über.
<channel>
<title>...</title>
<link>https://www.nextpit.de/</link>
<description>...</description>
<language>de</language>
<pubDate>...</pubDate>
<dc:creator>AndroidPIT</dc:creator>
<item>
<title>...</title>
<link>https://...</link>
<description>...</description>
<pubDate>...</pubDate>
<dc:creator>...</dc:creator>
</item>
</channel>
Okay, dann wissen wir das channel-Tag unser Eltern-Tag ist, von dem alles ausgeht.
Zunächst erstellen wir uns ein Array() ($json).
Channel besitzt mehrere „einfache“ (title, link, description, language, pubDate, dc:creator) Kinder und ein „kompliziertes“ (item) Kind. Da nachher ein Json-String entstehen soll, geben wir $json den title, link description, language, pubDate und dc:creator mit.
An dc:creator seht ihr eine Besonderheit, es gibt keinen "normalen" TagName(creator) sondern einen TagName mit Namespace (dc).
Die Namespace-URI findet ihr im Tag rss unter dem Attrebut xmls:{Namespace}=URI
sie lautet http://purl.org/dc/elements/1.1/, diese muss immer dort angewendet werden, wo kein normaler Tagname definiert ist, nun gut, noch eine Variable geschrieben.
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
$slashNS = "http://purl.org/dc/elements/1.1/";
$parentElement = $feed->getElementsByTagName('channel')->item(0);
$json = array();
$json['title'] = $parentElement->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
$json['link'] = $parentElement->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
$json['description'] = $parentElement->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
$json['language'] = $parentElement->getElementsByTagName('language')->item(0)->firstChild->nodeValue;
$json['pubDate'] = $parentElement->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
$json['creator'] = $parentElement->getElementsByTagNameNS($slashNS, 'creator')->item(0)->firstChild->nodeValue;
Der Header-Teil des RSS-Feed ist nun schon einmal fertig und könnte theoretisch Json encoded werden, aber ein Feed soll mehr sein, er soll die Infos der Seite widerspiegeln.
Nun werden wir die item Kinder-Tags untersuchen – enthalten ist 'title', 'link', 'description', 'pubDate' und 'dc:creator'.
Da so ein Feed bzw. Artikel mehrere Informationen liefert, werden die item auch mehrfach vorkommen.
Daher definieren wir eine Variabel items ($items) und dieser übergeben wir alle 'item'-Tags.
Dem Json-Array geben wir noch einen Array (item) mit.
$items = $parentElement->getElementsByTagName('item');
$json['item'] = array();
Um $json['item'] zu füllen brauchen wir eine 'foreach'-Schleife, sie wird solange ausgeführt bis kein 'item'-Tag mehr vorhanden ist. Jetzt gehen wir wie beim Headerteil vor - Variablen erstellen von 'title', 'link', 'description', 'pubDate' und 'dc:creator'.
$json['item'] wird in der Schleife befüllt, aber dass nicht immer wieder unserer Wert im Array überschrieben wird, ergänzen wir diesen mit einem Array() in der Schleife.
Aus 'title', 'link', 'description', 'pubDate' und 'dc:creator' erstellen wir innerhalb der Schleife einen assoziativen Array()
$json['item'][] = array("title"=>$title, "link"=>$link, "description"=>$description, "pubDate"=>$pubDate, "creator"=>$creator);
foreach ($items as $item) {
$title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
$link = $item->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
$description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
$pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
$creator = $item->getElementsByTagNameNS($slashNS, 'creator')->item(0)->firstChild->nodeValue;
$json['item'][] = array("title"=>$title,"link"=>$link,"description"=>$description,"pubDate"=>$pubDate,"creator"=>$creator);
}
Und als letzten Schritt geben wir unser Resultat aus.
echo json_encode($json);
— geändert am 15.07.2016, 21:02:49
Gruß Ludy (App Entwickler)
✴
Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺
✴
☕ Buy Me A Coffee ☕
✴
✨Meine Wunschliste✨
✴
?Telegram NextPit News?