kdonovan-happymapper 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History +77 -0
- data/License +20 -0
- data/Manifest +40 -0
- data/README +10 -0
- data/Rakefile +43 -0
- data/TODO +0 -0
- data/examples/amazon.rb +34 -0
- data/examples/current_weather.rb +21 -0
- data/examples/dashed_elements.rb +20 -0
- data/examples/family_tree.rb +55 -0
- data/examples/post.rb +19 -0
- data/examples/twitter.rb +37 -0
- data/happymapper.gemspec +35 -0
- data/lib/happymapper/attribute.rb +3 -0
- data/lib/happymapper/element.rb +3 -0
- data/lib/happymapper/item.rb +175 -0
- data/lib/happymapper/version.rb +3 -0
- data/lib/happymapper.rb +220 -0
- data/spec/fixtures/address.xml +8 -0
- data/spec/fixtures/commit.xml +52 -0
- data/spec/fixtures/current_weather.xml +89 -0
- data/spec/fixtures/family_tree.xml +23 -0
- data/spec/fixtures/multiple_namespaces.xml +170 -0
- data/spec/fixtures/partial_posts.xml +5 -0
- data/spec/fixtures/pita.xml +133 -0
- data/spec/fixtures/posts.xml +23 -0
- data/spec/fixtures/product_default_namespace.xml +17 -0
- data/spec/fixtures/product_no_namespace.xml +10 -0
- data/spec/fixtures/product_single_namespace.xml +10 -0
- data/spec/fixtures/radar.xml +21 -0
- data/spec/fixtures/statuses.xml +422 -0
- data/spec/happymapper_attribute_spec.rb +17 -0
- data/spec/happymapper_element_spec.rb +17 -0
- data/spec/happymapper_item_spec.rb +94 -0
- data/spec/happymapper_spec.rb +694 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/xml_helper.rb +115 -0
- data/website/css/common.css +47 -0
- data/website/index.html +98 -0
- metadata +113 -0
data/lib/happymapper.rb
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
$:.unshift(dir) unless $:.include?(dir) || $:.include?(File.expand_path(dir))
|
3
|
+
|
4
|
+
require 'date'
|
5
|
+
require 'time'
|
6
|
+
require 'rubygems'
|
7
|
+
gem 'libxml-ruby', '= 0.9.8'
|
8
|
+
require 'xml'
|
9
|
+
|
10
|
+
class Boolean; end
|
11
|
+
|
12
|
+
module HappyMapper
|
13
|
+
|
14
|
+
DEFAULT_NS = "happymapper"
|
15
|
+
|
16
|
+
def self.included(base)
|
17
|
+
base.instance_variable_set("@attributes", {})
|
18
|
+
base.instance_variable_set("@elements", {})
|
19
|
+
base.send :attr_accessor, :raw_xml
|
20
|
+
base.extend ClassMethods
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_xml
|
24
|
+
doc = LibXML::XML::Document.new
|
25
|
+
doc.root = to_xml_node
|
26
|
+
doc.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_xml_node(root_node = nil)
|
30
|
+
node = XML::Node.new(self.class.tag_name)
|
31
|
+
root_node ||= node
|
32
|
+
# add namespace to node and to root_element if not already set
|
33
|
+
if self.class.namespace_url
|
34
|
+
if root_node
|
35
|
+
namespace_object = root_node.namespaces.find_by_href(self.class.namespace_url)
|
36
|
+
namespace_object ||= XML::Namespace.new root_node, self.class.namespace, self.class.namespace_url
|
37
|
+
node.namespaces.namespace = namespace_object
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# serialize elements
|
41
|
+
self.class.elements.each do |e|
|
42
|
+
if e.options[:single] == false
|
43
|
+
self.send("#{e.method_name}").each do |array_element|
|
44
|
+
node << e.to_xml_node(array_element,root_node)
|
45
|
+
end
|
46
|
+
else
|
47
|
+
element_value = self.send("#{e.method_name}")
|
48
|
+
node << e.to_xml_node(element_value,root_node) unless element_value.nil?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
# serialize attributes
|
52
|
+
self.class.attributes.each do |a|
|
53
|
+
attribute_value = self.send("#{a.method_name}")
|
54
|
+
node.attributes[a.tag] = attribute_value.to_s unless attribute_value.nil?
|
55
|
+
end
|
56
|
+
node
|
57
|
+
end
|
58
|
+
|
59
|
+
module ClassMethods
|
60
|
+
# Control storing of raw XML data (off by default, but can be useful in certain situations)
|
61
|
+
@store_raw_xml = false
|
62
|
+
|
63
|
+
# Tell HappyMapper to store the raw XML in the appropriately-named raw_xml instance variable when parsing
|
64
|
+
def archive_raw_xml
|
65
|
+
@store_raw_xml = true
|
66
|
+
end
|
67
|
+
|
68
|
+
def store_raw_xml?
|
69
|
+
@store_raw_xml
|
70
|
+
end
|
71
|
+
|
72
|
+
def attribute(name, type, options={})
|
73
|
+
attribute = Attribute.new(name, type, options)
|
74
|
+
@attributes[to_s] ||= []
|
75
|
+
@attributes[to_s] << attribute
|
76
|
+
attr_accessor attribute.method_name.intern
|
77
|
+
end
|
78
|
+
|
79
|
+
def attributes
|
80
|
+
@attributes[to_s] || []
|
81
|
+
end
|
82
|
+
|
83
|
+
def element(name, type, options={})
|
84
|
+
options = {:namespace => @namespace}.merge(options)
|
85
|
+
element = Element.new(name, type, options)
|
86
|
+
@elements[to_s] ||= []
|
87
|
+
@elements[to_s] << element
|
88
|
+
attr_accessor element.method_name.intern
|
89
|
+
|
90
|
+
# set the default value of a collection instance variable to [] instead of nil
|
91
|
+
if options[:single] == false
|
92
|
+
module_eval <<-eof
|
93
|
+
def #{element.method_name}
|
94
|
+
@#{element.method_name} ||= []
|
95
|
+
end
|
96
|
+
eof
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def elements
|
101
|
+
@elements[to_s] || []
|
102
|
+
end
|
103
|
+
|
104
|
+
def has_one(name, type, options={})
|
105
|
+
element name, type, {:single => true}.merge(options)
|
106
|
+
end
|
107
|
+
|
108
|
+
def has_many(name, type, options={})
|
109
|
+
element name, type, {:single => false}.merge(options)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Specify a namespace if a node and all its children are all namespaced
|
113
|
+
# elements. This is simpler than passing the :namespace option to each
|
114
|
+
# defined element.
|
115
|
+
#
|
116
|
+
# namespace can either be a string for the prefix or a hash with 'prefix' => 'url'
|
117
|
+
def namespace(namespace = nil)
|
118
|
+
if namespace
|
119
|
+
if namespace.is_a? Hash
|
120
|
+
namespace.each_pair do |k,v|
|
121
|
+
@namespace = k.to_s
|
122
|
+
@namespace_url = v
|
123
|
+
end
|
124
|
+
else
|
125
|
+
@namespace = namespace
|
126
|
+
end
|
127
|
+
end
|
128
|
+
@namespace
|
129
|
+
end
|
130
|
+
|
131
|
+
def namespace_url(url = nil)
|
132
|
+
@namespace_url = url if url
|
133
|
+
@namespace_url
|
134
|
+
end
|
135
|
+
|
136
|
+
def tag(new_tag_name)
|
137
|
+
@tag_name = new_tag_name.to_s
|
138
|
+
end
|
139
|
+
|
140
|
+
def tag_name
|
141
|
+
@tag_name ||= to_s.split('::')[-1].downcase
|
142
|
+
end
|
143
|
+
|
144
|
+
def parse(xml, options = {})
|
145
|
+
# locally scoped copy of namespace for this parse run
|
146
|
+
namespace = @namespace
|
147
|
+
|
148
|
+
if xml.is_a?(XML::Node)
|
149
|
+
node = xml
|
150
|
+
else
|
151
|
+
if xml.is_a?(XML::Document)
|
152
|
+
node = xml.root
|
153
|
+
else
|
154
|
+
node = XML::Parser.string(xml).parse.root
|
155
|
+
end
|
156
|
+
|
157
|
+
root = node.name == tag_name
|
158
|
+
end
|
159
|
+
|
160
|
+
# This is the entry point into the parsing pipeline, so the default
|
161
|
+
# namespace prefix registered here will propagate down
|
162
|
+
namespaces = node.namespaces
|
163
|
+
if @namespace_url && namespaces.default.href != @namespace_url
|
164
|
+
namespace = namespaces.find_by_href(@namespace_url).prefix
|
165
|
+
elsif namespaces && namespaces.default
|
166
|
+
# don't assign the default_prefix if it has already been assigned
|
167
|
+
namespaces.default_prefix = DEFAULT_NS unless namespaces.find_by_prefix(DEFAULT_NS)
|
168
|
+
namespace ||= DEFAULT_NS
|
169
|
+
end
|
170
|
+
|
171
|
+
xpath = root ? '/' : (options[:deep]) ? './/' : './'
|
172
|
+
xpath += "#{namespace}:" if namespace
|
173
|
+
xpath += tag_name
|
174
|
+
# puts "parse: #{xpath}"
|
175
|
+
|
176
|
+
nodes = node.find(xpath)
|
177
|
+
collection = nodes.collect do |n|
|
178
|
+
obj = new
|
179
|
+
obj.raw_xml = n.to_s if obj.class.store_raw_xml?
|
180
|
+
|
181
|
+
attributes.each do |attr|
|
182
|
+
obj.send("#{attr.method_name}=",
|
183
|
+
attr.from_xml_node(n, namespace))
|
184
|
+
end
|
185
|
+
|
186
|
+
elements.each do |elem|
|
187
|
+
obj.send("#{elem.method_name}=",
|
188
|
+
elem.from_xml_node(n, namespace))
|
189
|
+
end
|
190
|
+
|
191
|
+
obj
|
192
|
+
end
|
193
|
+
|
194
|
+
# per http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Document.html#M000354
|
195
|
+
nodes = nil
|
196
|
+
|
197
|
+
if options[:single] || root
|
198
|
+
collection.first
|
199
|
+
else
|
200
|
+
collection
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# Load for custom Marshaling
|
205
|
+
def _load(xml_str)
|
206
|
+
self.parse(xml_str)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# Define _load and _dump to allow Marshaling of HappyMapper objects. Note that this isn't as efficient as a
|
211
|
+
# binary data store could be, but such is the nature of XML.
|
212
|
+
def _dump(depth)
|
213
|
+
@raw_xml || self.to_xml
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
require 'happymapper/item'
|
219
|
+
require 'happymapper/attribute'
|
220
|
+
require 'happymapper/element'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<commit>
|
3
|
+
<removed type="array">
|
4
|
+
<removed>
|
5
|
+
<filename>commands.rb</filename>
|
6
|
+
</removed>
|
7
|
+
<removed>
|
8
|
+
<filename>helpers.rb</filename>
|
9
|
+
</removed>
|
10
|
+
</removed>
|
11
|
+
<added type="array">
|
12
|
+
<added>
|
13
|
+
<filename>commands/commands.rb</filename>
|
14
|
+
</added>
|
15
|
+
<added>
|
16
|
+
<filename>commands/helpers.rb</filename>
|
17
|
+
</added>
|
18
|
+
</added>
|
19
|
+
<message>move commands.rb and helpers.rb into commands/ dir</message>
|
20
|
+
<modified type="array">
|
21
|
+
<modified>
|
22
|
+
<diff>@@ -56,7 +56,7 @@ module GitHub
|
23
|
+
end
|
24
|
+
|
25
|
+
def load(file)
|
26
|
+
- file[0] == ?/ ? super : super(BasePath + "/#{file}")
|
27
|
+
+ file[0] == ?/ ? super : super(BasePath + "/commands/#{file}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def debug(*messages)</diff>
|
31
|
+
<filename>lib/github.rb</filename>
|
32
|
+
</modified>
|
33
|
+
</modified>
|
34
|
+
<parents type="array">
|
35
|
+
<parent>
|
36
|
+
<id>d462d2a2e60438ded3dd9e8e6593ca4146c5a0ba</id>
|
37
|
+
</parent>
|
38
|
+
</parents>
|
39
|
+
<url>http://github.com/defunkt/github-gem/commit/c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b</url>
|
40
|
+
<author>
|
41
|
+
<name>Chris Wanstrath</name>
|
42
|
+
<email>chris@ozmm.org</email>
|
43
|
+
</author>
|
44
|
+
<id>c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b</id>
|
45
|
+
<committed-date>2008-03-02T16:45:41-08:00</committed-date>
|
46
|
+
<authored-date>2008-03-02T16:45:41-08:00</authored-date>
|
47
|
+
<tree>28a1a1ca3e663d35ba8bf07d3f1781af71359b76</tree>
|
48
|
+
<committer>
|
49
|
+
<name>Chris Wanstrath</name>
|
50
|
+
<email>chris@ozmm.org</email>
|
51
|
+
</committer>
|
52
|
+
</commit>
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<aws:weather xmlns:aws="http://www.aws.com/aws">
|
2
|
+
<aws:api version="2.0"/>
|
3
|
+
<aws:WebURL>http://weather.weatherbug.com/IN/Carmel-weather.html?ZCode=Z5546&Units=0&stat=MOCAR</aws:WebURL>
|
4
|
+
<aws:ob>
|
5
|
+
<aws:ob-date>
|
6
|
+
<aws:year number="2008"/>
|
7
|
+
<aws:month number="12" text="December" abbrv="Dec"/>
|
8
|
+
<aws:day number="30" text="Tuesday" abbrv="Tue"/>
|
9
|
+
<aws:hour number="4" hour-24="16"/>
|
10
|
+
<aws:minute number="18"/>
|
11
|
+
<aws:second number="01"/>
|
12
|
+
<aws:am-pm abbrv="PM"/>
|
13
|
+
<aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
|
14
|
+
</aws:ob-date>
|
15
|
+
<aws:requested-station-id>mocar</aws:requested-station-id>
|
16
|
+
<aws:station-id>MOCAR</aws:station-id>
|
17
|
+
<aws:station>Mohawk Trail ES</aws:station>
|
18
|
+
<aws:city-state zipcode="46033">Carmel, IN</aws:city-state>
|
19
|
+
<aws:country>USA</aws:country>
|
20
|
+
<aws:latitude>39.9711111111111</aws:latitude>
|
21
|
+
<aws:longitude>-86.0938888888889</aws:longitude>
|
22
|
+
<aws:site-url>http://www1.ccs.k12.in.us/mte/home</aws:site-url>
|
23
|
+
<aws:aux-temp units="&deg;F">74</aws:aux-temp>
|
24
|
+
<aws:aux-temp-rate units="&deg;F">+0.0</aws:aux-temp-rate>
|
25
|
+
<aws:current-condition icon="http://deskwx.weatherbug.com/images/Forecast/icons/cond007.gif">Sunny</aws:current-condition>
|
26
|
+
<aws:dew-point units="&deg;F">35</aws:dew-point>
|
27
|
+
<aws:elevation units="ft">817</aws:elevation>
|
28
|
+
<aws:feels-like units="&deg;F">51</aws:feels-like>
|
29
|
+
<aws:gust-time>
|
30
|
+
<aws:year number="0001"/>
|
31
|
+
<aws:month number="1" text="January" abbrv="Jan"/>
|
32
|
+
<aws:day number="1" text="Monday" abbrv="Mon"/>
|
33
|
+
<aws:hour number="12" hour-24="00"/>
|
34
|
+
<aws:minute number="00"/>
|
35
|
+
<aws:second number="00"/>
|
36
|
+
<aws:am-pm abbrv="AM"/>
|
37
|
+
<aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
|
38
|
+
</aws:gust-time>
|
39
|
+
<aws:gust-direction>W</aws:gust-direction>
|
40
|
+
<aws:gust-speed units="mph">25</aws:gust-speed>
|
41
|
+
<aws:humidity units="%">53</aws:humidity>
|
42
|
+
<aws:humidity-high units="%">100.0</aws:humidity-high>
|
43
|
+
<aws:humidity-low units="%">42.5</aws:humidity-low>
|
44
|
+
<aws:humidity-rate>-5.0</aws:humidity-rate>
|
45
|
+
<aws:indoor-temp units="&deg;F">75</aws:indoor-temp>
|
46
|
+
<aws:indoor-temp-rate units="&deg;F">+0.0</aws:indoor-temp-rate>
|
47
|
+
<aws:light>28</aws:light>
|
48
|
+
<aws:light-rate>-1.5</aws:light-rate>
|
49
|
+
<aws:moon-phase moon-phase-img="http://api.wxbug.net/images/moonphase/mphase02.gif">-10</aws:moon-phase>
|
50
|
+
<aws:pressure units=""">29.71</aws:pressure>
|
51
|
+
<aws:pressure-high units=""">30.18</aws:pressure-high>
|
52
|
+
<aws:pressure-low units=""">29.71</aws:pressure-low>
|
53
|
+
<aws:pressure-rate units=""/h">-0.04</aws:pressure-rate>
|
54
|
+
<aws:rain-month units=""">6.64</aws:rain-month>
|
55
|
+
<aws:rain-rate units=""/h">0.00</aws:rain-rate>
|
56
|
+
<aws:rain-rate-max units=""/h">0.00</aws:rain-rate-max>
|
57
|
+
<aws:rain-today units=""">0.00</aws:rain-today>
|
58
|
+
<aws:rain-year units=""">53.83</aws:rain-year>
|
59
|
+
<aws:temp units="&deg;F">51.8</aws:temp>
|
60
|
+
<aws:temp-high units="&deg;F">52</aws:temp-high>
|
61
|
+
<aws:temp-low units="&deg;F">29</aws:temp-low>
|
62
|
+
<aws:temp-rate units="&deg;F/h">+2.5</aws:temp-rate>
|
63
|
+
<aws:sunrise>
|
64
|
+
<aws:year number="2008"/>
|
65
|
+
<aws:month number="12" text="December" abbrv="Dec"/>
|
66
|
+
<aws:day number="30" text="Tuesday" abbrv="Tue"/>
|
67
|
+
<aws:hour number="8" hour-24="08"/>
|
68
|
+
<aws:minute number="06"/>
|
69
|
+
<aws:second number="02"/>
|
70
|
+
<aws:am-pm abbrv="AM"/>
|
71
|
+
<aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
|
72
|
+
</aws:sunrise>
|
73
|
+
<aws:sunset>
|
74
|
+
<aws:year number="2008"/>
|
75
|
+
<aws:month number="12" text="December" abbrv="Dec"/>
|
76
|
+
<aws:day number="30" text="Tuesday" abbrv="Tue"/>
|
77
|
+
<aws:hour number="5" hour-24="17"/>
|
78
|
+
<aws:minute number="28"/>
|
79
|
+
<aws:second number="53"/>
|
80
|
+
<aws:am-pm abbrv="PM"/>
|
81
|
+
<aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
|
82
|
+
</aws:sunset>
|
83
|
+
<aws:wet-bulb units="&deg;F">44.24</aws:wet-bulb>
|
84
|
+
<aws:wind-speed units="mph">4</aws:wind-speed>
|
85
|
+
<aws:wind-speed-avg units="mph">7</aws:wind-speed-avg>
|
86
|
+
<aws:wind-direction>SSW</aws:wind-direction>
|
87
|
+
<aws:wind-direction-avg>SW</aws:wind-direction-avg>
|
88
|
+
</aws:ob>
|
89
|
+
</aws:weather>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<familytree xmlns="http://api.familysearch.org/familytree/v1" xmlns:fsapi-v1="http://api.familysearch.org/v1" version="1.0.20071213.942" statusMessage="OK" statusCode="200">
|
3
|
+
<persons>
|
4
|
+
<person version="1199378491000" modified="2008-01-03T09:41:31-07:00" id="KWQS-BBQ">
|
5
|
+
<fsapi-v1:information>
|
6
|
+
<fsapi-v1:alternateIds>
|
7
|
+
<fsapi-v1:id>gedcom.1B5E3087E36D814FA9CBE0BE5B3721EA</fsapi-v1:id>
|
8
|
+
<fsapi-v1:id>KWQS-BB3</fsapi-v1:id>
|
9
|
+
<fsapi-v1:id>KWQS-W23</fsapi-v1:id>
|
10
|
+
<fsapi-v1:id>KWQS-W2S</fsapi-v1:id>
|
11
|
+
<fsapi-v1:id>KWQS-W29</fsapi-v1:id>
|
12
|
+
<fsapi-v1:id>KWQM-MMM</fsapi-v1:id>
|
13
|
+
<fsapi-v1:id>KWQS-W2Q</fsapi-v1:id>
|
14
|
+
<fsapi-v1:id>KWQS-BBQ</fsapi-v1:id>
|
15
|
+
</fsapi-v1:alternateIds>
|
16
|
+
<fsapi-v1:gender>Male</fsapi-v1:gender>
|
17
|
+
<fsapi-v1:living>false</fsapi-v1:living>
|
18
|
+
</fsapi-v1:information>
|
19
|
+
<!-- element to make sure that we're not parsing deep when not supposed to -->
|
20
|
+
<person id="KWQS-BBR" />
|
21
|
+
</person>
|
22
|
+
</persons>
|
23
|
+
</familytree>
|
@@ -0,0 +1,170 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
2
|
+
<v2:TrackReply xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:v2='http://fedex.com/ws/track/v2'>
|
3
|
+
<v2:HighestSeverity>SUCCESS</v2:HighestSeverity>
|
4
|
+
<v2:Notifications>
|
5
|
+
<v2:Severity>SUCCESS</v2:Severity>
|
6
|
+
<v2:Source>trck</v2:Source>
|
7
|
+
<v2:Code>0</v2:Code>
|
8
|
+
<v2:Message>Request was successfully processed.</v2:Message>
|
9
|
+
<v2:LocalizedMessage>Request was successfully processed.</v2:LocalizedMessage>
|
10
|
+
</v2:Notifications>
|
11
|
+
<ns:TransactionDetail xmlns:ns='http://fedex.com/ws/track/v2'>
|
12
|
+
<ns:CustomerTransactionId>20090102-111321</ns:CustomerTransactionId>
|
13
|
+
</ns:TransactionDetail>
|
14
|
+
<ns:Version xmlns:ns='http://fedex.com/ws/track/v2'>
|
15
|
+
<ns:ServiceId>trck</ns:ServiceId>
|
16
|
+
<ns:Major>2</ns:Major>
|
17
|
+
<ns:Intermediate>0</ns:Intermediate>
|
18
|
+
<ns:Minor>0</ns:Minor>
|
19
|
+
</ns:Version>
|
20
|
+
<v2:DuplicateWaybill>false</v2:DuplicateWaybill>
|
21
|
+
<v2:MoreData>false</v2:MoreData>
|
22
|
+
<v2:TrackDetails>
|
23
|
+
<v2:TrackingNumber>9611018034267800045212</v2:TrackingNumber>
|
24
|
+
<v2:TrackingNumberUniqueIdentifier>120081227094248461000~034267800045212</v2:TrackingNumberUniqueIdentifier>
|
25
|
+
<v2:StatusCode>OD</v2:StatusCode>
|
26
|
+
<v2:StatusDescription>On FedEx vehicle for delivery</v2:StatusDescription>
|
27
|
+
<v2:CarrierCode>FDXG</v2:CarrierCode>
|
28
|
+
<v2:ServiceInfo>Ground-Package Returns Program-Domestic</v2:ServiceInfo>
|
29
|
+
<v2:PackageWeight>
|
30
|
+
<v2:Units>LB</v2:Units>
|
31
|
+
<v2:Value>2.6</v2:Value>
|
32
|
+
</v2:PackageWeight>
|
33
|
+
<v2:Packaging>Package</v2:Packaging>
|
34
|
+
<v2:PackageSequenceNumber>1</v2:PackageSequenceNumber>
|
35
|
+
<v2:PackageCount>1</v2:PackageCount>
|
36
|
+
<v2:OriginLocationAddress>
|
37
|
+
<v2:City>SANFORD</v2:City>
|
38
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
39
|
+
<v2:CountryCode>US</v2:CountryCode>
|
40
|
+
<v2:Residential>false</v2:Residential>
|
41
|
+
</v2:OriginLocationAddress>
|
42
|
+
<v2:ShipTimestamp>2008-12-29T00:00:00</v2:ShipTimestamp>
|
43
|
+
<v2:EstimatedDeliveryTimestamp>2009-01-02T00:00:00</v2:EstimatedDeliveryTimestamp>
|
44
|
+
<v2:SignatureProofOfDeliveryAvailable>false</v2:SignatureProofOfDeliveryAvailable>
|
45
|
+
<v2:ProofOfDeliveryNotificationsAvailable>true</v2:ProofOfDeliveryNotificationsAvailable>
|
46
|
+
<v2:ExceptionNotificationsAvailable>true</v2:ExceptionNotificationsAvailable>
|
47
|
+
<v2:Events>
|
48
|
+
<v2:Timestamp>2009-01-02T06:00:00</v2:Timestamp>
|
49
|
+
<v2:EventType>OD</v2:EventType>
|
50
|
+
<v2:EventDescription>On FedEx vehicle for delivery</v2:EventDescription>
|
51
|
+
<v2:Address>
|
52
|
+
<v2:City>WICHITA</v2:City>
|
53
|
+
<v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
|
54
|
+
<v2:PostalCode>67226</v2:PostalCode>
|
55
|
+
<v2:CountryCode>US</v2:CountryCode>
|
56
|
+
<v2:Residential>false</v2:Residential>
|
57
|
+
</v2:Address>
|
58
|
+
</v2:Events>
|
59
|
+
<v2:Events>
|
60
|
+
<v2:Timestamp>2009-01-02T01:17:32</v2:Timestamp>
|
61
|
+
<v2:EventType>AR</v2:EventType>
|
62
|
+
<v2:EventDescription>At local FedEx facility</v2:EventDescription>
|
63
|
+
<v2:Address>
|
64
|
+
<v2:City>WICHITA</v2:City>
|
65
|
+
<v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
|
66
|
+
<v2:PostalCode>67226</v2:PostalCode>
|
67
|
+
<v2:CountryCode>US</v2:CountryCode>
|
68
|
+
<v2:Residential>false</v2:Residential>
|
69
|
+
</v2:Address>
|
70
|
+
</v2:Events>
|
71
|
+
<v2:Events>
|
72
|
+
<v2:Timestamp>2009-01-01T21:49:49</v2:Timestamp>
|
73
|
+
<v2:EventType>DP</v2:EventType>
|
74
|
+
<v2:EventDescription>Departed FedEx location</v2:EventDescription>
|
75
|
+
<v2:Address>
|
76
|
+
<v2:City>LENEXA</v2:City>
|
77
|
+
<v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
|
78
|
+
<v2:PostalCode>66227</v2:PostalCode>
|
79
|
+
<v2:CountryCode>US</v2:CountryCode>
|
80
|
+
<v2:Residential>false</v2:Residential>
|
81
|
+
</v2:Address>
|
82
|
+
</v2:Events>
|
83
|
+
<v2:Events>
|
84
|
+
<v2:Timestamp>2008-12-31T16:19:00</v2:Timestamp>
|
85
|
+
<v2:EventType>AR</v2:EventType>
|
86
|
+
<v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
|
87
|
+
<v2:Address>
|
88
|
+
<v2:City>LENEXA</v2:City>
|
89
|
+
<v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
|
90
|
+
<v2:PostalCode>66227</v2:PostalCode>
|
91
|
+
<v2:CountryCode>US</v2:CountryCode>
|
92
|
+
<v2:Residential>false</v2:Residential>
|
93
|
+
</v2:Address>
|
94
|
+
</v2:Events>
|
95
|
+
<v2:Events>
|
96
|
+
<v2:Timestamp>2008-12-30T11:01:23</v2:Timestamp>
|
97
|
+
<v2:EventType>DP</v2:EventType>
|
98
|
+
<v2:EventDescription>Departed FedEx location</v2:EventDescription>
|
99
|
+
<v2:Address>
|
100
|
+
<v2:City>ORLANDO</v2:City>
|
101
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
102
|
+
<v2:PostalCode>32809</v2:PostalCode>
|
103
|
+
<v2:CountryCode>US</v2:CountryCode>
|
104
|
+
<v2:Residential>false</v2:Residential>
|
105
|
+
</v2:Address>
|
106
|
+
</v2:Events>
|
107
|
+
<v2:Events>
|
108
|
+
<v2:Timestamp>2008-12-30T05:00:00</v2:Timestamp>
|
109
|
+
<v2:EventType>AR</v2:EventType>
|
110
|
+
<v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
|
111
|
+
<v2:Address>
|
112
|
+
<v2:City>ORLANDO</v2:City>
|
113
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
114
|
+
<v2:PostalCode>32809</v2:PostalCode>
|
115
|
+
<v2:CountryCode>US</v2:CountryCode>
|
116
|
+
<v2:Residential>false</v2:Residential>
|
117
|
+
</v2:Address>
|
118
|
+
</v2:Events>
|
119
|
+
<v2:Events>
|
120
|
+
<v2:Timestamp>2008-12-30T03:16:33</v2:Timestamp>
|
121
|
+
<v2:EventType>DP</v2:EventType>
|
122
|
+
<v2:EventDescription>Left FedEx origin facility</v2:EventDescription>
|
123
|
+
<v2:Address>
|
124
|
+
<v2:City>SANFORD</v2:City>
|
125
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
126
|
+
<v2:PostalCode>32771</v2:PostalCode>
|
127
|
+
<v2:CountryCode>US</v2:CountryCode>
|
128
|
+
<v2:Residential>false</v2:Residential>
|
129
|
+
</v2:Address>
|
130
|
+
</v2:Events>
|
131
|
+
<v2:Events>
|
132
|
+
<v2:Timestamp>2008-12-29T22:46:00</v2:Timestamp>
|
133
|
+
<v2:EventType>AR</v2:EventType>
|
134
|
+
<v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
|
135
|
+
<v2:Address>
|
136
|
+
<v2:City>SANFORD</v2:City>
|
137
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
138
|
+
<v2:PostalCode>32771</v2:PostalCode>
|
139
|
+
<v2:CountryCode>US</v2:CountryCode>
|
140
|
+
<v2:Residential>false</v2:Residential>
|
141
|
+
</v2:Address>
|
142
|
+
</v2:Events>
|
143
|
+
<v2:Events>
|
144
|
+
<v2:Timestamp>2008-12-29T17:12:00</v2:Timestamp>
|
145
|
+
<v2:EventType>PU</v2:EventType>
|
146
|
+
<v2:EventDescription>Picked up</v2:EventDescription>
|
147
|
+
<v2:Address>
|
148
|
+
<v2:City>SANFORD</v2:City>
|
149
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
150
|
+
<v2:PostalCode>32771</v2:PostalCode>
|
151
|
+
<v2:CountryCode>US</v2:CountryCode>
|
152
|
+
<v2:Residential>false</v2:Residential>
|
153
|
+
</v2:Address>
|
154
|
+
</v2:Events>
|
155
|
+
<v2:Events>
|
156
|
+
<v2:Timestamp>2008-12-27T09:40:00</v2:Timestamp>
|
157
|
+
<v2:EventType>IP</v2:EventType>
|
158
|
+
<v2:EventDescription>In FedEx possession</v2:EventDescription>
|
159
|
+
<v2:StatusExceptionCode>084</v2:StatusExceptionCode>
|
160
|
+
<v2:StatusExceptionDescription>Tendered at FedEx location</v2:StatusExceptionDescription>
|
161
|
+
<v2:Address>
|
162
|
+
<v2:City>LONGWOOD</v2:City>
|
163
|
+
<v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
|
164
|
+
<v2:PostalCode>327506398</v2:PostalCode>
|
165
|
+
<v2:CountryCode>US</v2:CountryCode>
|
166
|
+
<v2:Residential>false</v2:Residential>
|
167
|
+
</v2:Address>
|
168
|
+
</v2:Events>
|
169
|
+
</v2:TrackDetails>
|
170
|
+
</v2:TrackReply>
|