sporkmonger-sax-machine 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,35 @@
1
+ module SAXMachine
2
+ class SAXEventRecorder < SAXHandler
3
+ def initialize(nsstack)
4
+ super(nil, nsstack)
5
+ @events = []
6
+ end
7
+
8
+ def object
9
+ # First and last belong to the parent element
10
+ @events[1..-2]
11
+ end
12
+
13
+ def start_element(name, attrs = nil)
14
+ @nsstack = NSStack.new(@nsstack, attrs)
15
+ prefix, name = name.split(COLON, 2)
16
+ prefix, name = nil, prefix unless name
17
+ @events << [:start_element, @nsstack[prefix], name, attrs]
18
+ end
19
+
20
+ def end_element(name)
21
+ prefix, name = name.split(COLON, 2)
22
+ prefix, name = nil, prefix unless name
23
+ @events << [:end_element, @nsstack[prefix], name]
24
+ @nsstack = @nsstack.pop
25
+ end
26
+
27
+ def characters(string)
28
+ @events << [:chars, string]
29
+ end
30
+
31
+ def sax_config
32
+ raise
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,118 @@
1
+ require 'nokogiri'
2
+ require 'sax-machine/ns_stack'
3
+
4
+ module SAXMachine
5
+ class SAXHandler < Nokogiri::XML::SAX::Document
6
+ attr_reader :object
7
+
8
+ def initialize(object, nsstack=nil)
9
+ @object = object
10
+ @nsstack = nsstack || NSStack.new
11
+ end
12
+
13
+ def characters(string)
14
+ if parsing_collection?
15
+ @collection_handler.characters(string)
16
+ elsif @element_config
17
+ if !@value || @value == EMPTY_STRING
18
+ @value = string
19
+ else
20
+ @value << string
21
+ end
22
+ end
23
+ end
24
+
25
+ def cdata_block(string)
26
+ characters(string)
27
+ end
28
+
29
+ def start_element(name, attrs = nil)
30
+ @name = name
31
+ @attrs = (attrs || []).map do |k, v|
32
+ # Do we actually need to decode the attribute key or just the value?
33
+ [SAXHandler.decode_xml(k), SAXHandler.decode_xml(v)]
34
+ end
35
+ @nsstack = NSStack.new(@nsstack, @attrs)
36
+
37
+ if parsing_collection?
38
+ @collection_handler.start_element(@name, @attrs)
39
+ elsif @collection_config = sax_config.collection_config(@name, @nsstack)
40
+ @collection_handler = @collection_config.handler(@nsstack)
41
+ if @object.class != @collection_handler.object.class
42
+ @collection_handler.start_element(@name, @attrs)
43
+ end
44
+ elsif (element_configs = sax_config.element_configs_for_attribute(@name, @attrs)).any?
45
+ parse_element_attributes(element_configs)
46
+ set_element_config_for_element_value
47
+ else
48
+ set_element_config_for_element_value
49
+ end
50
+ end
51
+
52
+ def end_element(name)
53
+ if parsing_collection? && @collection_config.name == name.split(COLON, 2).last
54
+ @collection_handler.end_element(name)
55
+ @object.send(@collection_config.accessor) << @collection_handler.object
56
+ reset_current_collection
57
+ elsif parsing_collection?
58
+ @collection_handler.end_element(name)
59
+ elsif characaters_captured?
60
+ @object.send(@element_config.setter, @value)
61
+ end
62
+
63
+ reset_current_tag
64
+ @nsstack = @nsstack.pop
65
+ end
66
+
67
+ def characaters_captured?
68
+ !@value.nil? && !@value.empty?
69
+ end
70
+
71
+ def parsing_collection?
72
+ !@collection_handler.nil?
73
+ end
74
+
75
+ def parse_element_attributes(element_configs)
76
+ element_configs.each do |ec|
77
+ @object.send(ec.setter, ec.value_from_attrs(@attrs))
78
+ end
79
+ @element_config = nil
80
+ end
81
+
82
+ def set_element_config_for_element_value
83
+ @value = EMPTY_STRING
84
+ @element_config = sax_config.element_config_for_tag(@name, @attrs, @nsstack)
85
+ end
86
+
87
+ def reset_current_collection
88
+ @collection_handler = nil
89
+ @collection_config = nil
90
+ end
91
+
92
+ def reset_current_tag
93
+ @name = nil
94
+ @attrs = nil
95
+ @value = nil
96
+ @element_config = nil
97
+ end
98
+
99
+ def sax_config
100
+ @object.class.sax_config
101
+ end
102
+
103
+ ##
104
+ # Decodes XML special characters.
105
+ def self.decode_xml(str)
106
+ return str.map &method(:decode_xml) if str.kind_of?(Array)
107
+
108
+ # entities = {
109
+ # '#38' => '&amp;',
110
+ # '#13' => "\r",
111
+ # }
112
+ # entities.keys.inject(str) { |string, key|
113
+ # string.gsub(/&#{key};/, entities[key])
114
+ # }
115
+ CGI.unescapeHTML(str)
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,33 @@
1
+ # SAX Machine, Copyright (c) 2009 Paul Dix
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ # Used to prevent the class/module from being loaded more than once
23
+ unless defined? SAXMachine::VERSION
24
+ module SAXMachine
25
+ module VERSION
26
+ MAJOR = 0
27
+ MINOR = 1
28
+ TINY = 0
29
+
30
+ STRING = [MAJOR, MINOR, TINY].join('.')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
3
+ <OperationRequest>
4
+ <HTTPHeaders>
5
+ <Header Name="UserAgent">
6
+ </Header>
7
+ </HTTPHeaders>
8
+ <RequestId>16WRJBVEM155Q026KCV1</RequestId>
9
+ <Arguments>
10
+ <Argument Name="SearchIndex" Value="Books"></Argument>
11
+ <Argument Name="Service" Value="AWSECommerceService"></Argument>
12
+ <Argument Name="Title" Value="Ruby on Rails"></Argument>
13
+ <Argument Name="Operation" Value="ItemSearch"></Argument>
14
+ <Argument Name="AWSAccessKeyId" Value="dontbeaswoosh"></Argument>
15
+ </Arguments>
16
+ <RequestProcessingTime>0.064924955368042</RequestProcessingTime>
17
+ </OperationRequest>
18
+ <Items>
19
+ <Request>
20
+ <IsValid>True</IsValid>
21
+ <ItemSearchRequest>
22
+ <SearchIndex>Books</SearchIndex>
23
+ <Title>Ruby on Rails</Title>
24
+ </ItemSearchRequest>
25
+ </Request>
26
+ <TotalResults>22</TotalResults>
27
+ <TotalPages>3</TotalPages>
28
+ <Item>
29
+ <ASIN>0321480791</ASIN>
30
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0321480791%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0321480791%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
31
+ <ItemAttributes>
32
+ <Author>Michael Hartl</Author>
33
+ <Author>Aurelius Prochazka</Author>
34
+ <Manufacturer>Addison-Wesley Professional</Manufacturer>
35
+ <ProductGroup>Book</ProductGroup>
36
+ <Title>RailsSpace: Building a Social Networking Website with Ruby on Rails (Addison-Wesley Professional Ruby Series)</Title>
37
+ </ItemAttributes>
38
+ </Item>
39
+ </Items>
40
+ </ItemSearchResponse>
@@ -0,0 +1,158 @@
1
+ require 'rubygems'
2
+ require 'benchmark'
3
+ require 'happymapper'
4
+ require 'sax-machine'
5
+ require 'rfeedparser'
6
+ include Benchmark
7
+ benchmark_iterations = 100
8
+
9
+ module Feedzirra
10
+ class AtomEntry
11
+ include SAXMachine
12
+ element :title
13
+ element :name, :as => :author
14
+ element "feedburner:origLink", :as => :url
15
+ element :summary
16
+ element :content
17
+ element :published
18
+ end
19
+
20
+ # Class for parsing Atom feeds
21
+ class Atom
22
+ include SAXMachine
23
+ element :title
24
+ element :link, :value => :href, :as => :url, :with => {:type => "text/html"}
25
+ element :link, :value => :href, :as => :feed_url, :with => {:type => "application/atom+xml"}
26
+ elements :entry, :as => :entries, :class => AtomEntry
27
+ end
28
+ end
29
+ feed_text = File.read("spec/sax-machine/atom.xml")
30
+
31
+ benchmark do |t|
32
+ t.report("feedzirra") do
33
+ benchmark_iterations.times {
34
+ Feedzirra::Atom.new.parse(feed_text)
35
+ }
36
+ end
37
+
38
+ t.report("rfeedparser") do
39
+ benchmark_iterations.times {
40
+ FeedParser.parse(feed_text)
41
+ }
42
+ end
43
+ end
44
+
45
+ # class AtomEntry
46
+ # include SAXMachine
47
+ # element :title
48
+ # element :name, :as => :author
49
+ # element :summary
50
+ # end
51
+ # class Atom
52
+ # include SAXMachine
53
+ # element :title
54
+ # elements :entry, :as => :entries, :class => AtomEntry
55
+ # end
56
+ #
57
+ # class Entry
58
+ # include HappyMapper
59
+ # element :title, String
60
+ # element :name, String
61
+ # element :summary, String
62
+ # end
63
+ # class Feed
64
+ # include HappyMapper
65
+ # element :title, String
66
+ # has_many :entry, Entry
67
+ # end
68
+ # feed_text = File.read("spec/sax-machine/atom.xml")
69
+ #
70
+ # benchmark do |t|
71
+ # t.report("sax-machine") do
72
+ # benchmark_iterations.times {
73
+ # Atom.new.parse(feed_text)
74
+ # }
75
+ # end
76
+ #
77
+ # t.report("happymapper") do
78
+ # benchmark_iterations.times {
79
+ # Feed.parse(feed_text)
80
+ # }
81
+ # end
82
+ # end
83
+
84
+ # xml = File.read("spec/benchmarks/public_timeline.xml")
85
+ # class Status
86
+ # include HappyMapper
87
+ #
88
+ # element :text, String
89
+ # element :source, String
90
+ # end
91
+ #
92
+ # class Statuses
93
+ # include SAXMachine
94
+ #
95
+ # elements :status, {:as => :statuses, :class => Class.new do
96
+ # include SAXMachine
97
+ # element :text
98
+ # element :source
99
+ # end}
100
+ # end
101
+ #
102
+ # benchmark do |t|
103
+ # t.report("happy mapper") do
104
+ # benchmark_iterations.times {
105
+ # Status.parse(xml)
106
+ # }
107
+ # end
108
+ #
109
+ # t.report("sax-machine") do
110
+ # benchmark_iterations.times {
111
+ # Statuses.parse(xml)
112
+ # }
113
+ # end
114
+ # end
115
+
116
+ # xml = File.read("spec/benchmarks/amazon.xml")
117
+ # class HItem
118
+ # include HappyMapper
119
+ #
120
+ # tag 'Item' # if you put class in module you need tag
121
+ # element :asin, String, :tag => 'ASIN'
122
+ # element :detail_page_url, String, :tag => 'DetailPageURL'
123
+ # element :manufacturer, String, :tag => 'Manufacturer', :deep => true
124
+ # end
125
+ # class HItems
126
+ # include HappyMapper
127
+ #
128
+ # tag 'Items' # if you put class in module you need tag
129
+ # # element :total_results, Integer, :tag => 'TotalResults'
130
+ # # element :total_pages, Integer, :tag => 'TotalPages'
131
+ # has_many :items, Item
132
+ # end
133
+ #
134
+ # class Item
135
+ # include SAXMachine
136
+ #
137
+ # element :ASIN, :as => :asin
138
+ # element :DetailPageUrl, :as => :detail_page_url
139
+ # element :Manufacturer, :as => :manufacturer
140
+ # end
141
+ # class Items
142
+ # include SAXMachine
143
+ # elements :Item, :as => :items
144
+ # end
145
+ #
146
+ # benchmark do |t|
147
+ # t.report("sax-machine") do
148
+ # benchmark_iterations.times {
149
+ # Items.new.parse(xml)
150
+ # }
151
+ # end
152
+ #
153
+ # t.report("happymapper") do
154
+ # benchmark_iterations.times {
155
+ # HItems.parse(xml)
156
+ # }
157
+ # end
158
+ # end
@@ -0,0 +1,411 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <statuses type="array">
3
+ <status>
4
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
5
+ <id>1122786091</id>
6
+ <text>@Ryudokun :-P</text>
7
+ <source>web</source>
8
+ <truncated>false</truncated>
9
+ <in_reply_to_status_id>1122783776</in_reply_to_status_id>
10
+ <in_reply_to_user_id>14090866</in_reply_to_user_id>
11
+ <favorited>false</favorited>
12
+ <user>
13
+ <id>2685941</id>
14
+ <name>Zafiro Hernández</name>
15
+ <screen_name>kethzy</screen_name>
16
+ <description>Escritora de la revista Niponia, turistologa y loca enamorada</description>
17
+ <location>Mexico</location>
18
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/57794212/candado_normal.jpg</profile_image_url>
19
+ <url>http://www.niponia.com.mx</url>
20
+ <protected>false</protected>
21
+ <followers_count>280</followers_count>
22
+ </user>
23
+ </status><status>
24
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
25
+ <id>1122786090</id>
26
+ <text>New blog post: Welcome to Life Sais http://lifesais.com/2009/01/life-sais/</text>
27
+ <source>&lt;a href=&quot;http://alexking.org/projects/wordpress&quot;&gt;Twitter Tools&lt;/a&gt;</source>
28
+ <truncated>false</truncated>
29
+ <in_reply_to_status_id />
30
+ <in_reply_to_user_id />
31
+ <favorited>false</favorited>
32
+ <user>
33
+ <id>16279065</id>
34
+ <name>Sais</name>
35
+ <screen_name>Sais</screen_name>
36
+ <description>I'm sort of a big deal hehehehe*</description>
37
+ <location>NY</location>
38
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/69122175/Picture_2_normal.png</profile_image_url>
39
+ <url>http://www.supersais.com/blog</url>
40
+ <protected>false</protected>
41
+ <followers_count>134</followers_count>
42
+ </user>
43
+ </status><status>
44
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
45
+ <id>1122786089</id>
46
+ <text>On Youtube. Youtube.com/TinyHustla</text>
47
+ <source>web</source>
48
+ <truncated>false</truncated>
49
+ <in_reply_to_status_id />
50
+ <in_reply_to_user_id />
51
+ <favorited>false</favorited>
52
+ <user>
53
+ <id>19052333</id>
54
+ <name>Alonzo Nuno</name>
55
+ <screen_name>SouljaSkoolSwag</screen_name>
56
+ <description />
57
+ <location />
58
+ <profile_image_url>http://static.twitter.com/images/default_profile_normal.png</profile_image_url>
59
+ <url />
60
+ <protected>false</protected>
61
+ <followers_count>0</followers_count>
62
+ </user>
63
+ </status><status>
64
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
65
+ <id>1122786088</id>
66
+ <text>@scanhead it will be a well deserved win if it walks away with Best Animated. I can't think of anything that comes close</text>
67
+ <source>&lt;a href=&quot;http://www.tweetdeck.com/&quot;&gt;TweetDeck&lt;/a&gt;</source>
68
+ <truncated>false</truncated>
69
+ <in_reply_to_status_id>1122156627</in_reply_to_status_id>
70
+ <in_reply_to_user_id>16721278</in_reply_to_user_id>
71
+ <favorited>false</favorited>
72
+ <user>
73
+ <id>14518496</id>
74
+ <name>David Chapman</name>
75
+ <screen_name>davechappers</screen_name>
76
+ <description></description>
77
+ <location>Cambridge</location>
78
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/70439325/Photo_3_normal.jpg</profile_image_url>
79
+ <url></url>
80
+ <protected>false</protected>
81
+ <followers_count>2</followers_count>
82
+ </user>
83
+ </status><status>
84
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
85
+ <id>1122786087</id>
86
+ <text>Craps is an interesting game.</text>
87
+ <source>&lt;a href=&quot;http://orangatame.com/products/twitterberry/&quot;&gt;TwitterBerry&lt;/a&gt;</source>
88
+ <truncated>false</truncated>
89
+ <in_reply_to_status_id />
90
+ <in_reply_to_user_id />
91
+ <favorited>false</favorited>
92
+ <user>
93
+ <id>16436531</id>
94
+ <name>chaser1975</name>
95
+ <screen_name>chaser1975</screen_name>
96
+ <description></description>
97
+ <location>Jacksonville</location>
98
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/63201969/July8_2008_047_normal.jpg</profile_image_url>
99
+ <url></url>
100
+ <protected>false</protected>
101
+ <followers_count>27</followers_count>
102
+ </user>
103
+ </status><status>
104
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
105
+ <id>1122786086</id>
106
+ <text>Intel's net profit drops 90 percent... ouch. http://tinyurl.com/8elfpl</text>
107
+ <source>&lt;a href=&quot;http://iconfactory.com/software/twitterrific&quot;&gt;twitterrific&lt;/a&gt;</source>
108
+ <truncated>false</truncated>
109
+ <in_reply_to_status_id />
110
+ <in_reply_to_user_id />
111
+ <favorited>false</favorited>
112
+ <user>
113
+ <id>14970813</id>
114
+ <name>blobinabottle</name>
115
+ <screen_name>blobinabottle</screen_name>
116
+ <description></description>
117
+ <location></location>
118
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/54912507/domo_normal.jpg</profile_image_url>
119
+ <url>http://blobinabottle.blogspot.com</url>
120
+ <protected>false</protected>
121
+ <followers_count>38</followers_count>
122
+ </user>
123
+ </status><status>
124
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
125
+ <id>1122786083</id>
126
+ <text>Re-pinging @Greed32: hahah I'm bored/curious and plus I only respond to good answers and normal people</text>
127
+ <source>&lt;a href=&quot;http://twitter.com/twinkleking&quot;&gt;Twinkle&lt;/a&gt;</source>
128
+ <truncated>false</truncated>
129
+ <in_reply_to_status_id />
130
+ <in_reply_to_user_id />
131
+ <favorited>false</favorited>
132
+ <user>
133
+ <id>18010200</id>
134
+ <name>lenalover</name>
135
+ <screen_name>lenalover</screen_name>
136
+ <description>escapism is key in this fantasy world </description>
137
+ <location>Pompton Lakes, New Jersey</location>
138
+ <profile_image_url>http://static.twitter.com/images/default_profile_normal.png</profile_image_url>
139
+ <url></url>
140
+ <protected>false</protected>
141
+ <followers_count>31</followers_count>
142
+ </user>
143
+ </status><status>
144
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
145
+ <id>1122786082</id>
146
+ <text>And what is the grocery store membership all about anyway?</text>
147
+ <source>&lt;a href=&quot;http://www.twittermail.com/&quot;&gt;TwitterMail&lt;/a&gt;</source>
148
+ <truncated>false</truncated>
149
+ <in_reply_to_status_id />
150
+ <in_reply_to_user_id />
151
+ <favorited>false</favorited>
152
+ <user>
153
+ <id>14221234</id>
154
+ <name>susbarefoot</name>
155
+ <screen_name>susbarefoot</screen_name>
156
+ <description>In life, we have poop.</description>
157
+ <location>Raleigh, NC</location>
158
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/54048743/avatar_normal.gif</profile_image_url>
159
+ <url></url>
160
+ <protected>false</protected>
161
+ <followers_count>49</followers_count>
162
+ </user>
163
+ </status><status>
164
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
165
+ <id>1122786081</id>
166
+ <text>@nfreader I...should be FLYING! NOT SWIMMING!!</text>
167
+ <source>&lt;a href=&quot;http://iconfactory.com/software/twitterrific&quot;&gt;twitterrific&lt;/a&gt;</source>
168
+ <truncated>false</truncated>
169
+ <in_reply_to_status_id>1122783193</in_reply_to_status_id>
170
+ <in_reply_to_user_id>10014522</in_reply_to_user_id>
171
+ <favorited>false</favorited>
172
+ <user>
173
+ <id>5723532</id>
174
+ <name>Bradley</name>
175
+ <screen_name>warbrain</screen_name>
176
+ <description></description>
177
+ <location>Des Plaines, IL (42.028351,-87</location>
178
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/69653184/Photo_112_normal.jpg</profile_image_url>
179
+ <url>http://bradleysays.com</url>
180
+ <protected>false</protected>
181
+ <followers_count>420</followers_count>
182
+ </user>
183
+ </status><status>
184
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
185
+ <id>1122786080</id>
186
+ <text>You guys are too funny, do you think we have worn out TWTTRSTRM yet? LOL I'm heading off for the night, not feeling too well * pout *</text>
187
+ <source>web</source>
188
+ <truncated>false</truncated>
189
+ <in_reply_to_status_id />
190
+ <in_reply_to_user_id />
191
+ <favorited>false</favorited>
192
+ <user>
193
+ <id>16618589</id>
194
+ <name>Pretty Bullet</name>
195
+ <screen_name>prettybullet</screen_name>
196
+ <description>The prettiest bullet on Squidoo!</description>
197
+ <location>Spanish, Ontario Canada</location>
198
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/67497171/1avatar-xmas-78_normal.jpg</profile_image_url>
199
+ <url>http://www.squidoo.com/lensmasters/awelldressedbullet</url>
200
+ <protected>false</protected>
201
+ <followers_count>109</followers_count>
202
+ </user>
203
+ </status><status>
204
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
205
+ <id>1122786079</id>
206
+ <text>Thinks her scones are good but a little well done...</text>
207
+ <source>&lt;a href=&quot;http://help.twitter.com/index.php?pg=kb.page&amp;id=75&quot;&gt;txt&lt;/a&gt;</source>
208
+ <truncated>false</truncated>
209
+ <in_reply_to_status_id />
210
+ <in_reply_to_user_id />
211
+ <favorited>false</favorited>
212
+ <user>
213
+ <id>15357848</id>
214
+ <name>brittymine</name>
215
+ <screen_name>brittymine</screen_name>
216
+ <description>i make your dreams come true!</description>
217
+ <location>at my house!</location>
218
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/56368682/543476751_70398214dc_t_normal.jpg</profile_image_url>
219
+ <url></url>
220
+ <protected>false</protected>
221
+ <followers_count>15</followers_count>
222
+ </user>
223
+ </status><status>
224
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
225
+ <id>1122786078</id>
226
+ <text>Mariam N’KASSAI : Togo:
227
+
228
+
229
+
230
+
231
+ $0 of $1,025 raised.
232
+
233
+ Started raising funds on Jan 1.. http://tinyurl.com/99bx65</text>
234
+ <source>&lt;a href=&quot;http://twitterfeed.com&quot;&gt;twitterfeed&lt;/a&gt;</source>
235
+ <truncated>false</truncated>
236
+ <in_reply_to_status_id />
237
+ <in_reply_to_user_id />
238
+ <favorited>false</favorited>
239
+ <user>
240
+ <id>18072695</id>
241
+ <name>Microfinance</name>
242
+ <screen_name>Microfinance</screen_name>
243
+ <description />
244
+ <location />
245
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/69655320/kiva_normal.jpg</profile_image_url>
246
+ <url />
247
+ <protected>false</protected>
248
+ <followers_count>12</followers_count>
249
+ </user>
250
+ </status><status>
251
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
252
+ <id>1122786077</id>
253
+ <text>@VibeMagazine ...jokin.. but nah fo' real i killed it, though!! lol</text>
254
+ <source>web</source>
255
+ <truncated>false</truncated>
256
+ <in_reply_to_status_id>1122779374</in_reply_to_status_id>
257
+ <in_reply_to_user_id>14691200</in_reply_to_user_id>
258
+ <favorited>false</favorited>
259
+ <user>
260
+ <id>16541773</id>
261
+ <name>Leroy Duncan Jr.</name>
262
+ <screen_name>gooduncan</screen_name>
263
+ <description>imma music lover, cool and funny in a nerdy way brother, spread peace not hate, get along with one another...</description>
264
+ <location>North Carolina</location>
265
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/69820903/my_stare_normal.jpg</profile_image_url>
266
+ <url></url>
267
+ <protected>false</protected>
268
+ <followers_count>15</followers_count>
269
+ </user>
270
+ </status><status>
271
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
272
+ <id>1122786076</id>
273
+ <text>tonight was great to be a part of. looking forward to sunday to see Gods work in action.</text>
274
+ <source>&lt;a href=&quot;http://help.twitter.com/index.php?pg=kb.page&amp;id=75&quot;&gt;txt&lt;/a&gt;</source>
275
+ <truncated>false</truncated>
276
+ <in_reply_to_status_id />
277
+ <in_reply_to_user_id />
278
+ <favorited>false</favorited>
279
+ <user>
280
+ <id>19048879</id>
281
+ <name>Erica Rupert</name>
282
+ <screen_name>ericarupert</screen_name>
283
+ <description>obsessed with Bryson ; )</description>
284
+ <location>Gville</location>
285
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/71370743/127_127_normal.JPG</profile_image_url>
286
+ <url></url>
287
+ <protected>false</protected>
288
+ <followers_count>2</followers_count>
289
+ </user>
290
+ </status><status>
291
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
292
+ <id>1122786075</id>
293
+ <text>@Crystal_clear I need to update my twitter</text>
294
+ <source>web</source>
295
+ <truncated>false</truncated>
296
+ <in_reply_to_status_id>1122782227</in_reply_to_status_id>
297
+ <in_reply_to_user_id>11832612</in_reply_to_user_id>
298
+ <favorited>false</favorited>
299
+ <user>
300
+ <id>16586561</id>
301
+ <name>KristinaLeigh</name>
302
+ <screen_name>KristinaLeigh</screen_name>
303
+ <description>A Momma with a six year old son with Bipolar and one girl on the way....</description>
304
+ <location>Mandeville</location>
305
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/61244564/Phillip_normal.jpg</profile_image_url>
306
+ <url>http://itrhymeswithbanana.blogspot.com</url>
307
+ <protected>false</protected>
308
+ <followers_count>42</followers_count>
309
+ </user>
310
+ </status><status>
311
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
312
+ <id>1122786074</id>
313
+ <text>RT @BreakingNewsOn: The Minnesota Star Tribune which was founded in 1867 says it has filed for Chapter 11 bankruptcy, according to its w ...</text>
314
+ <source>&lt;a href=&quot;http://socialscope.net&quot;&gt;SocialScope&lt;/a&gt;</source>
315
+ <truncated>false</truncated>
316
+ <in_reply_to_status_id />
317
+ <in_reply_to_user_id />
318
+ <favorited>false</favorited>
319
+ <user>
320
+ <id>12332112</id>
321
+ <name>Amit Kumar</name>
322
+ <screen_name>amitkumar01</screen_name>
323
+ <description>CEO Ubiquitous Systems </description>
324
+ <location>San Francisco, California 9410</location>
325
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/52548135/frameAndServeImage.pl_normal.jpeg</profile_image_url>
326
+ <url>http:///www.socialscope.net</url>
327
+ <protected>false</protected>
328
+ <followers_count>125</followers_count>
329
+ </user>
330
+ </status><status>
331
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
332
+ <id>1122786073</id>
333
+ <text>Annie made my birthday cake herself! She is sooooo proud.</text>
334
+ <source>&lt;a href=&quot;http://iconfactory.com/software/twitterrific&quot;&gt;twitterrific&lt;/a&gt;</source>
335
+ <truncated>false</truncated>
336
+ <in_reply_to_status_id />
337
+ <in_reply_to_user_id />
338
+ <favorited>false</favorited>
339
+ <user>
340
+ <id>17530527</id>
341
+ <name>TimRhodus</name>
342
+ <screen_name>TimRhodus</screen_name>
343
+ <description>Christ-follower, Husband of Kathi, Dad of Trevor &amp;amp; Annie, Pastor of 400-500 amazing people</description>
344
+ <location>Carlinville, IL</location>
345
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/65406330/Tim_2_normal.jpg</profile_image_url>
346
+ <url>http://www.timrhodus.com</url>
347
+ <protected>false</protected>
348
+ <followers_count>70</followers_count>
349
+ </user>
350
+ </status><status>
351
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
352
+ <id>1122786072</id>
353
+ <text>Demo de Skate 2 na PSN européia!</text>
354
+ <source>&lt;a href=&quot;http://twitterfox.net/&quot;&gt;TwitterFox&lt;/a&gt;</source>
355
+ <truncated>false</truncated>
356
+ <in_reply_to_status_id />
357
+ <in_reply_to_user_id />
358
+ <favorited>false</favorited>
359
+ <user>
360
+ <id>15067571</id>
361
+ <name>jcvasc</name>
362
+ <screen_name>jcvasc</screen_name>
363
+ <description>Um viciado em DVD e BD - DVDBDAddict</description>
364
+ <location>Porto Alegre - Brazil</location>
365
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/55257978/avatar_81190_f_normal.jpg</profile_image_url>
366
+ <url>http://jcvasc.wordpress.com</url>
367
+ <protected>false</protected>
368
+ <followers_count>84</followers_count>
369
+ </user>
370
+ </status><status>
371
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
372
+ <id>1122786064</id>
373
+ <text>@shortyawards I vote for @StockTwits in the Shorty Awards Finals for #finance because it's the best thing going on Twitter</text>
374
+ <source>web</source>
375
+ <truncated>false</truncated>
376
+ <in_reply_to_status_id>1122785132</in_reply_to_status_id>
377
+ <in_reply_to_user_id>17663756</in_reply_to_user_id>
378
+ <favorited>false</favorited>
379
+ <user>
380
+ <id>899941</id>
381
+ <name>Sam Huleatt</name>
382
+ <screen_name>squasher98</screen_name>
383
+ <description>I dream Workstreams and post two interesting links daily on the Twitter</description>
384
+ <location>New York, NY</location>
385
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/54138892/newyearsme_normal.jpg</profile_image_url>
386
+ <url>http://Leveragingideas.com</url>
387
+ <protected>false</protected>
388
+ <followers_count>506</followers_count>
389
+ </user>
390
+ </status><status>
391
+ <created_at>Fri Jan 16 03:13:39 +0000 2009</created_at>
392
+ <id>1122786062</id>
393
+ <text>Once again, I glance at The Super-Organism in a bookstore display and see the title as... erm... something else. It fools me every time.</text>
394
+ <source>web</source>
395
+ <truncated>false</truncated>
396
+ <in_reply_to_status_id />
397
+ <in_reply_to_user_id />
398
+ <favorited>false</favorited>
399
+ <user>
400
+ <id>17876737</id>
401
+ <name>Amanda</name>
402
+ <screen_name>irreverentmuse</screen_name>
403
+ <description></description>
404
+ <location>Boston, MA, USA</location>
405
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/66363500/amandaMA_normal.jpg</profile_image_url>
406
+ <url>http://www.irreverentmusings.com</url>
407
+ <protected>false</protected>
408
+ <followers_count>11</followers_count>
409
+ </user>
410
+ </status>
411
+ </statuses>