2016-12-16 3 views
0

Ich habe PHP seit vielen Jahren nicht mehr verwendet und versuche, RSS-Feeds von Tweets so zu manipulieren, dass der Name des Tweeters benötigt wird. Ich ziehe derzeit RSS-Feeds von TwitRSS und es funktioniert alles gut außer der Name des Hochtöners verwendet einen Namespace, so dass das Element Hochton-Name sagt. Ich habe viele Threads auf dieser Site darüber gesehen, wie der Namespace verwendet wird, und ich habe alle ohne Erfolg versucht.Wie ersetze ich Namespaces mit SimpleXML?

Im Moment sieht mein Code wie folgt aus:

$newsoutput = new SimpleXMLElement('http://twitrss.me/twitter_search_to_rss/?term=php', LIBXML_NOCDATA, true); 
$newsoutput = json_decode(json_encode($newsoutput), TRUE); 
foreach ($newsoutput['channel']['item'] as $item) { 
echo $item['title']."<br>".$item['description']."<br>".$item['link']."<br>".$item['guid']."<br>".$item['pubDate']."<br>"; 
echo $item['author']."br";} 

Das ist natürlich für alle gängigen Elemente gut funktioniert Echos aus zu sein, aber wenn ich versuche, jede Lösung den Namespace-Tag zu bekommen habe ich versucht, hat dazu geführt, Fehlermeldungen in der Schleife. Normalerweise hat es damit zu tun, dass das Kindelement null ist.

Jetzt möchte ich eine andere Lösung versuchen. Ich möchte eine Zeichenfolge ersetzen, die jedes Namespace-Element mit einem Nicht-Namespace-Element ändern würde. Idealerweise würde der resultierende RSS-Feed jedes Element durch ersetzen und dann normal wieder ausgeben.

Ich habe versucht, indem Sachen wie:

$newsoutput->str_replace("dc:creator","author",""); 

habe ich es vor der Schleife, weil ich, dass das Array von item-Elementen übernehmen würde in der SimpleXML Array geändert werden müßte, bevor Looping und echo'ing . Ich weiß ein Problem mit dem, was ich tue ist, dass PHP str_replace 3 Parameter erwartet und ich kann nur an zwei denken. Das Wort, das ich ersetzen möchte und was ich es ersetzen möchte. Was brauche ich noch? Ich denke auch, dass ich möglicherweise eine Schleife für das Ersetzen der Zeichenfolge ausführen muss, bevor Sie die Schleife für den neuen freien Namespace-Feed ausführen.

+0

oops „Hochtöner name“ sollte durch den Tag mit dem Namensraum umgeben sein, aber es wurde gezupft – XCon065

+0

'str_replace' ist eine globale Funktion. '-> str_replace' verwendet die Klassenmethode. Sie tun es natürlich falsch. –

+0

oops, der Autor wurde von einem vorherigen String-Ersetzungs-Versuch da gelassen – XCon065

Antwort

0

Ihr Code hat eine Menge Hacks von anderen Beispielen kopiert, die Ihr Leben machen härter, nicht einfacher:

  • Sie nicht LIBXML_NO_CDATA brauchen; es macht nur einen Unterschied, wenn Sie das Objekt trotzdem in XML zurückverwandeln (es macht auch einen Unterschied für das Ergebnis von print_r, aber Sie sollten sich nicht darauf verlassen, dass "magische" Objekte wie SimpleXMLElement im Grunde genommen
  • sind sagt "wegwerfen alle nützlichen Bits der SimpleXML-API, und versuchen, mir ein Array ohne Garantie für sein Format geben"
  • Hinzufügen von String-Manipulation darüber ist nur Hinzufügen von Hacks zu Hacks.

Stattdessen sollten Sie lernen, wie Namespaces zu verwenden, mit SimpleXML, die unter Verwendung von the ->children() method ist (und vielleicht auch the ->attributes() method, die die gleiche Art und Weise funktioniert).

So kann man nur so etwas wie folgt verwenden:

$newsoutput = new SimpleXMLElement('http://twitrss.me/twitter_search_to_rss/?term=php', 0, true); 
foreach ($newsoutput->channel->item as $item) { 
    echo $item['title']."<br>".$item['description']."<br>".$item['link']."<br>".$item['guid']."<br>".$item['pubDate']."<br>"; 
    echo $item->children('http://purl.org/dc/elements/1.1/')->creator."<br>"; 
} 
+0

Ja, das funktioniert. Tatsächlich habe ich es kurz nach der Veröffentlichung herausgefunden. – XCon065

+0

Jetzt habe ich das völlig neue Problem, es als eigenen RSS-Feed auszugeben. Die Lösung Ich habe nur die letzte Zeile des Feeds in Ihrem Browser erstellt, obwohl wenn Sie auf Quelltext klicken, alles da ist. Die Quelle wird auch nur als einzelne Codezeile angezeigt. – XCon065

+0

Sollte das letzte Element des Feeds im Browser angegeben haben. – XCon065