2016-12-16 9 views
0

Я не использовал PHP в течение многих лет, и я пытаюсь манипулировать RSS-каналами твитов таким образом, чтобы требовалось имя твитера. Я в настоящее время вытаскиваю RSS-каналы из TwitRSS, и все работает отлично, за исключением того, что имя твитера использует пространство имен, поэтому элемент говорит имя твитера. Я видел много потоков на этом сайте о том, как использовать пространство имен, и я пробовал все из них без успеха.Как заменить пространства имен на SimpleXML?

Прямо сейчас мой код выглядит следующим образом:

$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";} 

Это, конечно, хорошо работает для всех нормальных элементов, являющихся эха при, но всякий раз, когда я пытаюсь получить пространство имен тега каждое решение я пытался привело сообщения об ошибках в цикле. Обычно это связано с тем, что дочерний элемент имеет значение null.

Я хотел бы попробовать другое решение. Я хотел бы сделать замену строки, которая изменила бы каждый элемент пространства имен с помощью элемента, отличного от пространства имен. В идеале результирующий RSS-канал будет иметь каждый элемент, который был заменен, а затем выходил бы нормально.

Я пытался добавить такие вещи, как:

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

Я добавил его перед циклом, потому что я хотел бы предположить, что массив элементов элементов должен быть изменен в массиве SimpleXML перед циклом и echo'ing , Я знаю, что одна проблема с тем, что я делаю, это то, что php str_replace ожидает 3 параметра, и я могу думать только о двух. Слово, которое я хочу заменить, и что я хочу заменить. Что еще мне нужно? Я также думаю, что мне, возможно, придется запустить цикл для замены строки перед запуском цикла для нового бесплатного фида пространства имен.

+0

упс, «название твитер» должны быть окружены тегом с пространством имен, но он получил раздели – XCon065

+0

'str_replace' является глобальной функцией. '-> str_replace' использует метод класса. Вы obvioulsy делать это неправильно. –

+0

oops, автор остался там с предыдущей попытки заменить строку – XCon065

ответ

0

Ваш код имеет много хаков, скопированные из других примеров, которые делают вашу жизнь труднее, а не легче:

  • вам не нужно LIBXML_NO_CDATA; это имеет значение только тогда, когда вы все равно возвращаете объект обратно в XML (это также имеет значение для результата print_r, но вы не должны полагаться на это в любом случае для «магических» объектов, таких как SimpleXMLElement)
  • $newsoutput = json_decode(json_encode($newsoutput), TRUE); в основном говорит «выбросить все полезные биты SimpleXML API и попытаться дать мне массив без гарантии его формата»
  • добавление манипуляции над строкой поверх всего лишь добавление хаков к хакам.

Вместо этого, вы должны знать, как использовать пространство имен с SimpleXML, который с помощью the ->children() method (и, возможно, также the ->attributes() method, который работает точно так же).

Таким образом, вы можете просто использовать что-то вроде этого:

$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

Да, это работает. Фактически вскоре после публикации этого я понял это. – XCon065

+0

Теперь у меня есть совершенно новая проблема эхо-эха в качестве собственного RSS-канала. Решение, которое я использую только в последней строке фида в вашем браузере, даже если вы нажмете на источник просмотра, все есть. Источник также отображается только как одна строка кода. – XCon065

+0

Должен был указать последний элемент фида в браузере. – XCon065