SPWD

Tag: XMLReader

PHP 5, Twitter & XMLReader

by Billy on Oct.22, 2008, under Blogging, Internet Tools, PHP, Web 2.0

I was interested in using and experimenting with the XMLReader class that is part of PHP 5, and thought why not test it out using my Twitter feed. Turns out, the feed contained more information than I really wanted, so I had to find a way to extract only what I needed. To that, I present the following, simple and basic script to extract just the text of the latest update on Twitter.

A basic Twitter feed might appear like mine below:

Quick Code


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Twitter / southplatte</title>
    <link>http://twitter.com/southplatte</link>
 
    <description>Twitter updates from southplatte / southplatte.</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>southplatte: working on database stuff with MySQL</title>
    <description>southplatte: working on database stuff with MySQL</description>
 
    <pubDate>Tue, 21 Oct 2008 05:35:21 +0000</pubDate>
    <guid>http://twitter.com/southplatte/statuses/968543230</guid>
    <link>http://twitter.com/southplatte/statuses/968543230</link>
  </item>
  </channel>
</rss>

As you can see we get a channel name with related information, and then the items, or Tweets. In this case, Twitter has used some duplicate XML tags, namely title, description and link in both the channel element and item elements, so our script should pull only the item information, unless we wanted to publish the channel information, which for this we will not.

Quick Code


1.   <?php
2.   $reader = new XMLReader();
3.   $reader->open('http://twitter.com/statuses/user_timeline/twitterusernamehere.rss?count=1/');
4.  
5.   while ($reader->read())
6.   {
7.      if ($reader->nodeType == XMLREADER::ELEMENT)
8.      {
9.         $name = $reader->name;
10.  
11.        if($name == "item")
12.      {
13.        while($reader->read())
14.      {
15.       if($reader->nodeType == XMLREADER::ELEMENT)
16.        {
17.          $noName = $reader->name;
18.          if($noName == "description" || $noName == "pubDate" || $noName == "link")
19.          {
20.            $reader->read();
21.            $result .= $reader->value."<br>";
22.          }
23.  
24.        }
25.      }
26.      
27.      }
28.      
29.     }
30.  
31.  }
32.  
33.  
34.  $reader->close();
35.  
36.  ?>
 

What the script does:
Line 2 creates a new instance of an XMLReader object
Line 3 opens the RSS feed from Twitter - the username will be your Twitter user name (or what ever Twitter user name you want to get updates for) and the count URL parameter tells it to only retrieve the latest Tweet. You can ommit the count and get all, or specify another number here.
Line 5 starts a while loop that will loop through the entire contents of the XML file returned from our open command.
Line 7 checks for the node type and if it is equal to an ELEMENT, takes action.
Line 9 sets the value of the Element.
Line 11 Validates the element to be equal to item, item being the element that contains our tweet.
Line 13 begins a new while loops (almost a recursive action here) and moves through the file again, to get the actual Tweet text from within the Item element.
Line 15 again checks that we are working with elements
Line 17 assigns each element to the variable
Line 18 checks the variable to be equal to the elements that we want, description, pubDate and link.
Line 20 tells the object to read the XML/RSS stream
Line 21 appends the $result variable with the values from our selected elements.
Line 34 closes our XMLReader stream.

Now all we need to do is include this into a PHP page, echo or print the $result variable and we will get an output like the following:

Quick Code


southplatte: working on database stuff with MySQL
Tue, 21 Oct 2008 05:35:21 +0000
http://twitter.com/southplatte/statuses/968543230
southplatte: Another interview setup for Wednesday, still waiting on the one from last week to decide, it is between myself and one other person!
Sat, 18 Oct 2008 15:28:30 +0000
http://twitter.com/southplatte/statuses/965216528

As you can see, we have some formatting issues to deal with, such as double spacing between Tweets, maybe formatting the date string, and encasulating the entire tweet with the link so it could be clicked and take the visitor to the individual Tweet on the Twitter web site.

The final page I have it in on my testing server is:

Quick Code


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
<!--
.style1 {
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: .8em;
  color: #666666;
  background-color: #FFFFFF;
}
-->
</style>
</head>
<?php
$reader = new XMLReader();
$reader->open('http://twitter.com/statuses/user_timeline/southplatte.rss?count=1/');
 
while ($reader->read())
{
   if ($reader->nodeType == XMLREADER::ELEMENT)
   {
       $name = $reader->name;
 
      if($name == "item")
    {
      while($reader->read())
    {
      if($reader->nodeType == XMLREADER::ELEMENT)
      {
        $noName = $reader->name;
        if($noName == "description" || $noName == "pubDate" || $noName == "link")
        {
          $reader->read();
          $result .= $reader->value."<br>";
          //break;
        }
 
      }
    }
    
    }
    
   }

}
 
$reader->close();
 
?>
<body>
<span class="style1"><?php echo $result;?></span>
</body>
</html>
 

This could definitely not be used for much, but you could also set up a very similar and though not quite as simplistic page to read any RSS feed, thus creating your own PHP RSS/XML reader. It could definitely be extended and enhanced to perform some very advanced functionality as well.

Leave a Comment :, , , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...