sporkmonger-sax-machine 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/LICENSE +20 -0
- data/README.md +56 -0
- data/Rakefile +53 -0
- data/lib/sax-machine.rb +17 -0
- data/lib/sax-machine/ns_stack.rb +41 -0
- data/lib/sax-machine/sax_collection_config.rb +56 -0
- data/lib/sax-machine/sax_config.rb +57 -0
- data/lib/sax-machine/sax_document.rb +107 -0
- data/lib/sax-machine/sax_element_config.rb +80 -0
- data/lib/sax-machine/sax_event_recorder.rb +35 -0
- data/lib/sax-machine/sax_handler.rb +118 -0
- data/lib/sax-machine/version.rb +33 -0
- data/spec/benchmarks/amazon.xml +40 -0
- data/spec/benchmarks/benchmark.rb +158 -0
- data/spec/benchmarks/public_timeline.xml +411 -0
- data/spec/sax-machine/atom.xml +165 -0
- data/spec/sax-machine/sax_document_spec.rb +667 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +7 -0
- data/tasks/clobber.rake +2 -0
- data/tasks/gem.rake +69 -0
- data/tasks/git.rake +40 -0
- data/tasks/metrics.rake +22 -0
- data/tasks/rdoc.rake +26 -0
- data/tasks/spec.rake +70 -0
- data/tasks/yard.rake +26 -0
- metadata +175 -0
@@ -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' => '&',
|
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><a href="http://alexking.org/projects/wordpress">Twitter Tools</a></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><a href="http://www.tweetdeck.com/">TweetDeck</a></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><a href="http://orangatame.com/products/twitterberry/">TwitterBerry</a></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><a href="http://iconfactory.com/software/twitterrific">twitterrific</a></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><a href="http://twitter.com/twinkleking">Twinkle</a></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><a href="http://www.twittermail.com/">TwitterMail</a></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><a href="http://iconfactory.com/software/twitterrific">twitterrific</a></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><a href="http://help.twitter.com/index.php?pg=kb.page&id=75">txt</a></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><a href="http://twitterfeed.com">twitterfeed</a></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><a href="http://help.twitter.com/index.php?pg=kb.page&id=75">txt</a></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><a href="http://socialscope.net">SocialScope</a></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><a href="http://iconfactory.com/software/twitterrific">twitterrific</a></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; 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><a href="http://twitterfox.net/">TwitterFox</a></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>
|