Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Parse review data. Can now embed in page.

  • Loading branch information...
commit 50c4aec615021ca9a3170b3ecaa963412e418fcf 1 parent cd89ae8
@beaucollins authored
View
4 Rakefile
@@ -12,13 +12,13 @@ begin
gemspec.email = "beaucollins@gmail.com"
gemspec.homepage = "http://github.com/beaucollins/power_reviews"
gemspec.authors = ["Beau Collins"]
- gemspec.add_runtime_dependency 'javan-whenever'
+ gemspec.add_runtime_dependency 'whenever'
gemspec.add_runtime_dependency 'fastercsv'
gemspec.add_development_dependency 'activesupport'
gemspec.add_development_dependency 'shoulda'
end
rescue LoadError
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
+ puts "Jeweler not available. Install it with: gem install jeweler"
end
View
1  lib/power_reviews.rb
@@ -1,4 +1,5 @@
require 'power_reviews/config'
+require 'power_reviews/review_data'
require 'power_reviews/feed_item'
require 'power_reviews/feed'
View
33 lib/power_reviews/config.rb
@@ -1,20 +1,31 @@
module PowerReviews
class Config
- def self.merchant_group_id
- @@merchant_group_id
- end
+ class << self
+ def merchant_group_id
+ @merchant_group_id
+ end
- def self.merchant_group_id=id
- @@merchant_group_id = id
- end
+ def merchant_group_id=id
+ @merchant_group_id = id
+ end
- def self.site_id
- @@site_id
- end
+ def site_id
+ @site_id
+ end
- def self.site_id=id
- @@site_id = id
+ def site_id=id
+ @site_id = id
+ end
+
+ def review_data_path
+ @review_data_path || 'public/system/pwr'
+ end
+
+ def review_data_path=path
+ @review_data_path = path
+ end
+
end
end
View
89 lib/power_reviews/review_data.rb
@@ -0,0 +1,89 @@
+require 'find'
+require 'rexml/document'
+
+module PowerReviews
+
+ class ReviewData
+
+ class << self
+
+ # retrieve the summary data for the given page_id
+ def summary(page_id)
+ document.summary(page_id)
+ end
+
+ protected
+
+ def document
+ @document ||= new
+ end
+
+ end
+
+
+ # initializes a new ReviewData document
+ def initialize(search_path=nil)
+ @search_path = search_path || PowerReviews::Config.review_data_path
+ end
+
+ def summary(page_id)
+ node = nil
+ summary_data.elements.each("//pageid") do |e|
+ node = e.parent if e.get_text == page_id
+ end
+ !node.nil? ? Summary.new(node) : nil
+ end
+
+ def summary_data
+ @summary_data ||= read_document('review_data_summary')
+ end
+
+ def product_data
+ @product_data ||= read_document('review_data_complete')
+ end
+
+ protected
+
+ def read_document(name)
+ REXML::Document.new(File.new(xml_documents[name]))
+ end
+
+ def xml_documents
+ return @files unless @files.nil?
+ files = {}
+
+ Find.find(@search_path) do |path|
+ bn = File.basename(path, '.xml')
+ files[bn] = path if ['review_data_complete', 'review_data_summary'].include?(bn)
+ end
+ @files = files
+ @files
+ end
+
+ class Summary
+
+ attr_reader :full_name, :average_rating, :reviews
+
+ def initialize(element)
+ @element = element
+ @full_name = text_for_element('name')
+ @average_rating = text_for_element('average_rating_decimal').to_s.to_f
+ @reviews = text_for_element('fullreviews').to_s.to_i
+ end
+
+ protected
+
+ def text_for_element(name)
+ element = nil
+ @element.each_element(name) { |e| element = e if element.nil? }
+ element.nil? ? '' : element.get_text
+ end
+
+
+ end
+
+
+ end
+
+
+end
View
56 lib/power_reviews/sync.rb
@@ -14,36 +14,44 @@ class Sync
:ftp => Protocols::Ftp
}
- # Execute the necessary actions
- def self.execute
- self.start do |client, config|
+ class << self
+
+ # Execute the necessary actions
+ def execute
+ self.start do |client, config|
- zip_path = "#{RAILS_ROOT}/public/system/reviews.zip"
+ zip_path = "#{Rails.root}/public/system/reviews.zip"
- unless client.done?
- FileUtils.mkdir_p(File.dirname(zip_path))
- # we need the correct path to be setup
- client.copy_zip(zip_path)
- `cd #{File.dirname(zip_path)} && unzip -o #{zip_path}`
- client.done!
- end
+ unless client.done?
+ FileUtils.mkdir_p(File.dirname(zip_path))
+ # we need the correct path to be setup
+ client.copy_zip(zip_path)
+ `cd #{File.dirname(zip_path)} && unzip -o #{zip_path}`
+ client.done!
+ end
- # zip up the powerreviews data tell the client to store it
- data_path = "#{RAILS_ROOT}/tmp/review_data.csv"
- File.open(data_path, 'w') do |f|
- f.puts PowerReviews::Feed.process
- end
- client.copy_data_feed(data_path)
+ # zip up the powerreviews data tell the client to store it
+ data_path = "#{RAILS_ROOT}/tmp/review_data.csv"
+ File.open(data_path, 'w') do |f|
+ f.puts PowerReviews::Feed.process
+ end
+ client.copy_data_feed(data_path)
+ end
end
- end
- # Given the environment loads up the yaml file and creates a new instance
- def self.start
- config = YAML::load(File.open("#{RAILS_ROOT}/config/power_reviews.yml"))[RAILS_ENV] || {}
- syncer = PROTOCOLS[config.delete('protocol').intern].new(config)
- yield syncer, config
- syncer.cleanup
+ # Given the environment loads up the yaml file and creates a new instance
+ def start
+ config = self.configure
+ syncer = PROTOCOLS[config.delete('protocol').intern].new(config)
+ yield syncer, config
+ syncer.cleanup
+ end
+
+ def configure
+ @config ||= YAML::load(File.open("#{RAILS_ROOT}/config/power_reviews.yml"))[Rails.environment] || {}
+ end
+
end
end
View
69 lib/power_reviews/view_helpers.rb
@@ -1,12 +1,50 @@
module PowerReviews
module ViewHelpers
+
+ # generates hReview compatible HTML for the given page_id
+ # renders the content as HTML at render time instead of relying
+ # on the Power Reviews javascript library to render the review content
+ def power_reviews_hreview(page_id, &blk)
+
+ summary = PowerReviews::ReviewData.summary(page_id)
+
+ if block_given?
+ yield summary unless summary.nil?
+ else summary.nil?
+ <<-review
+ <div class='hreview-aggregate'>
+ <span class="item">
+ <span class="fn">#{summary.full_name}</span>
+ </span>
+ <span class="rating">
+ <span class="average">#{summary.average_rating}</span>
+ </span>
+ based on
+ <span class="count">#{summary.reviews}</span> user reviews.
+ </div>
+ review
+
+ end
+ end
+
+ # Includes the power reviews javascript, optionally provide the path to
+ # the javascript file if not installed in the default location
def power_reviews_javascript_tag(path_to_file = '/system/pwr/engine/js/full')
unless @power_reviews_javascript_needed.nil?
javascript_include_tag(path_to_file)
end
end
+ # Generates the javascript variables for a page that will be rendering
+ # PowerReviews elements
+ #
+ # Options:
+ #
+ # +:locale+ - default: en_US
+ # +:zip_location+ - where Power Reviews data is stored default: /system/
+ # +:pr_style_sheet - Location of custom Power Reviews stylesheet default: "" (empty string)
+ #
def power_reviews_javascript_variables(options = {})
options = {
:locale => 'en_US',
@@ -17,7 +55,14 @@ def power_reviews_javascript_variables(options = {})
options.collect { |key, val| "var pr_#{key} = '#{val}';" unless val.blank? }.compact!.join("\n")
end
end
-
+
+ # Generates JavaScript to display the Power Reviews "snippet" element. Will show a summary
+ # of the reviews for the given +page_id+.
+ #
+ # Arguments:
+ # +page_id+ - the identifier for the product
+ # +write_review_url+ - the url to link to a page where the user can author a review
+ # +review_ancor+ - the url or anchor that links to the full reviews. Default: "#ReviewHeader"
def power_reviews_snippet(page_id, write_review_url, review_anchor = '#ReviewHeader')
@power_reviews_javascript_needed = true
javascript_tag do
@@ -32,7 +77,12 @@ def power_reviews_snippet(page_id, write_review_url, review_anchor = '#ReviewHea
eos
end
end
-
+
+ # Displays the full reviews for the given +page_id+
+ #
+ # Arguments:
+ # +page_id+ - The identifier for the item to show reviews for
+ # +write_review_url+ - A url for a page where the user can write a review for the given product
def power_reviews_display(page_id, write_review_url)
@power_reviews_javascript_needed = true
javascript_tag do
@@ -47,6 +97,21 @@ def power_reviews_display(page_id, write_review_url)
end
end
+ # Generates the javascript that renders the PowerReviews authoring form.
+ #
+ # Arguments:
+ # +page_id+ - The id of the item being reviewd
+ #
+ # Options:
+ # +:locale+ default ""
+ # +:site_id+ default: PowerReviews::Config.site_id
+ # +:merchant_group_id+ default: PowerReviews::Config.merchant_group_id
+ # +:source+ default: 'web'
+ # +:merchant_user_id+ default: ''
+ # +:merchant_user_email+ default: ''
+ # +:promo_code+ default: ''
+ # +:style_sheet+ default: ''
+
def power_reviews_form(page_id, options = {})
@power_reviews_javascript_needed = true
options = {
View
9,299 test/fixtures/rawdata/review_data_complete.xml
9,299 additions, 0 deletions not shown
View
344 test/fixtures/rawdata/review_data_complete.xsd
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="default">
+ <xsd:element name="products">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="product" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="product" type="ProductType" />
+
+ <xsd:complexType name="ProductType" abstract="true">
+ <xsd:sequence>
+ <xsd:element name="pageid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute name="locale" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="ProductWithReviewsAndQuestions">
+ <xsd:complexContent>
+ <xsd:extension base="ProductType">
+ <xsd:sequence>
+ <xsd:element name="smallstarimagelocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="largestarimagelocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="newestreviewdate" type="xsd:date" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="oldestreviewdate" type="xsd:date" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="averageoverallrating" type="xsd:float" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="average_rating_decimal" type="xsd:float" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="fullreviews" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="confirmstatusgroup" type="ConfirmStatusGroupType" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="taggroup" type="TagGroupType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="bottom_line_yes_votes" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="bottom_line_no_votes" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="customerimages" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="customervideos" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="total_questions" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="total_answers" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="inlinefiles" type="InlineFilesType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="inlinequestionfiles" type="InlineQuestionFilesType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="deleted_reviews" type="DeletedReviewsType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="reviews" type="ReviewListType" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="questions" type="QuestionsType" minOccurs="1" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="ProductWithReviews">
+ <xsd:complexContent>
+ <xsd:extension base="ProductType">
+ <xsd:sequence>
+ <xsd:element name="smallstarimagelocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="largestarimagelocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="newestreviewdate" type="xsd:date" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="oldestreviewdate" type="xsd:date" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="averageoverallrating" type="xsd:float" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="average_rating_decimal" type="xsd:float" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="fullreviews" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="confirmstatusgroup" type="ConfirmStatusGroupType" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="taggroup" type="TagGroupType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="bottom_line_yes_votes" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="bottom_line_no_votes" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="customerimages" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="customervideos" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="inlinefiles" type="InlineFilesType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="deleted_reviews" type="DeletedReviewsType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="reviews" type="ReviewListType" minOccurs="1" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="ProductWithQuestions">
+ <xsd:complexContent>
+ <xsd:extension base="ProductType">
+ <xsd:sequence>
+ <xsd:element name="total_questions" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="total_answers" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="inlinequestionfiles" type="InlineQuestionFilesType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="deleted_reviews" type="DeletedReviewsType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="questions" type="QuestionsType" minOccurs="1" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:simpleType name="ReviewStatusType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Approved"/>
+ <xsd:enumeration value="Rejected"/>
+ <xsd:enumeration value="Pending"/>
+ <xsd:enumeration value="Escalate"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="ConfirmStatusGroupType">
+ <xsd:sequence>
+ <xsd:element ref="confirmstatus" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="confirmstatus" type="ConfirmStatusType" />
+
+ <xsd:simpleType name="ConfirmStatusType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Verified Reviewer"/>
+ <xsd:enumeration value="Verified Purchaser"/>
+ <xsd:enumeration value="Unverified"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="tag" type="TagType" />
+
+ <xsd:complexType name="TagType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="isuseradded" type="xsd:boolean" use="required"/>
+ <xsd:attribute name="count" type="xsd:integer" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TagListType">
+ <xsd:sequence>
+ <xsd:element ref="tag" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="TagGroupType">
+ <xsd:sequence>
+ <xsd:element name="tag" type="TagType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="key" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="ReviewListType">
+ <xsd:sequence>
+ <xsd:element name="fullreview" type="FullReviewType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="FullReviewType">
+ <xsd:sequence>
+ <xsd:element name="id" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="merchant_review_id" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="merchantuserid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="status" type="ReviewStatusType" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="createddate" type="xsd:date" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="helpfulvotes" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="nothelpfulvotes" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="source" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="confirmstatusgroup" type="ConfirmStatusGroupType" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="headline" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="overallrating" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="taggroup" type="TagGroupType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="textboxgroup" type="TextboxGroupType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="bottom_line" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="comments" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="nickname" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="location" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="customerimage" type="ReviewImageType" minOccurs="0" maxOccurs="2" />
+ <xsd:element name="customervideo" type="ReviewVideoType" minOccurs="0" maxOccurs="2" />
+ <xsd:element name="email_address_from_merchant" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="email_address_from_user" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="campaign_id" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="service_comments" type="ServiceCommentsType" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="merchant_response" type="MerchantResponseType" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="associated_product_list" type="AssociatedProductListType" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="page_id_variant" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="extra_info_list" type="ExtraInfoListType" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="questionGroups" type="QuestionGroupsType" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="site_id" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="modified_date" type="xsd:date" minOccurs="0" maxOccurs="1" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ReviewImageType">
+ <xsd:sequence>
+ <xsd:element name="fullimagelocation" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="thumbnailimagelocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="caption" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="taggroup" type="TagGroupType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ReviewVideoType">
+ <xsd:sequence>
+ <xsd:element name="videolocation" type="xsd:string" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="thumbnaillocation" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="caption" type="xsd:string" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="taggroup" type="TagGroupType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ServiceCommentsType">
+ <xsd:sequence>
+ <xsd:element name="status" type="xsd:string" />
+ <xsd:element name="comments" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="MerchantResponseType">
+ <xsd:sequence>
+ <xsd:element name="response" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AssociatedProductListType">
+ <xsd:sequence>
+ <xsd:element name="associated_product" type="AssociatedProductType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AssociatedProductType">
+ <xsd:sequence>
+ <xsd:element name="type" type="xsd:string" />
+ <xsd:element name="product_name" type="xsd:string" />
+ <xsd:element name="product_url" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ExtraInfoListType">
+ <xsd:sequence>
+ <xsd:element name="extra_info" type="ExtraInfoType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ExtraInfoType">
+ <xsd:sequence>
+ <xsd:element name="key" type="xsd:string" />
+ <xsd:element name="value" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="TextboxGroupType">
+ <xsd:sequence>
+ <xsd:element name="textbox" type="TextboxType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="TextboxType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string" >
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="key" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="InlineFilesType">
+ <xsd:sequence>
+ <xsd:element name="inlinefile" type="InlineFileType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="InlineFileType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string" >
+ <xsd:attribute name="reviewpage" type="xsd:integer" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="InlineQuestionFilesType">
+ <xsd:sequence>
+ <xsd:element name="inlinefile" type="InlineQuestionFileType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="InlineQuestionFileType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string" >
+ <xsd:attribute name="questionpage" type="xsd:integer" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="QuestionGroupsType">
+ <xsd:sequence>
+ <xsd:element name="questionGroup" type="QuestionGroupType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="QuestionGroupType">
+ <xsd:choice minOccurs="1" maxOccurs="unbounded" >
+ <xsd:element name="taggroup" type="TagGroupType"/>
+ <xsd:element name="textbox" type="TextboxType"/>
+ </xsd:choice>
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="DeletedReviewsType">
+ <xsd:sequence>
+ <xsd:element name="deleted_review" type="DeletedReviewType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="DeletedReviewType">
+ <xsd:sequence>
+ <xsd:element name="id" type="xsd:long" />
+ <xsd:element name="merchant_review_id" type="xsd:long" />
+ <xsd:element name="deleted_date" type="xsd:date" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="QuestionsType">
+ <xsd:sequence>
+ <xsd:element name="question" type="QuestionType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="QuestionType">
+ <xsd:sequence>
+ <xsd:element name="id" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="date" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="nickname" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="location" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="answers" type="AnswersType" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AnswersType">
+ <xsd:sequence>
+ <xsd:element name="answer" type="AnswerType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AnswerType">
+ <xsd:sequence>
+ <xsd:element name="id" type="xsd:long" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="date" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="authored_by_expert" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="authored_by_verified_purchaser" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="nickname" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="location" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema>
View
1,967 test/fixtures/rawdata/review_data_summary.xml
@@ -0,0 +1,1967 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid id="shadow">shadow</pageid>
+<name>Shadow</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-01-28</newestreviewdate>
+<oldestreviewdate>2010-01-28</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Purchaser</confirmstatus>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Snowboarding</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Beginner</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Comfortable</tag>
+<tag isuseradded="false" count="1">Easily adjustable</tag>
+<tag isuseradded="false" count="1">Great peripheral vision</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Protective</tag>
+<tag isuseradded="false" count="1">Stylish</tag>
+<tag isuseradded="false" count="1">Well ventilated</tag>
+</taggroup>
+<taggroup key="sizing" name="Sizing">
+<tag isuseradded="false" count="1">Feels true to size</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>clutch</pageid>
+<name>Clutch</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-01-22</newestreviewdate>
+<oldestreviewdate>2009-12-23</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Purchaser</confirmstatus>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Half pipe</tag>
+<tag isuseradded="false" count="1">Park</tag>
+<tag isuseradded="false" count="1">Skiing</tag>
+<tag isuseradded="false" count="2">Snowboarding</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Audio wiring</tag>
+<tag isuseradded="true" count="1">Ear covers not snug</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Comfortable</tag>
+<tag isuseradded="false" count="1">Easily adjustable</tag>
+<tag isuseradded="false" count="1">Great peripheral vision</tag>
+<tag isuseradded="false" count="2">Headphone compatible</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Protective</tag>
+<tag isuseradded="false" count="1">Stylish</tag>
+<tag isuseradded="false" count="2">Well ventilated</tag>
+</taggroup>
+<taggroup key="sizing" name="Sizing">
+<tag isuseradded="false" count="2">Feels true to size</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>indy</pageid>
+<name>Indy</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-06-29</newestreviewdate>
+<oldestreviewdate>2010-01-17</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.7</average_rating_decimal>
+<fullreviews>3</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="3">Downhill</tag>
+<tag isuseradded="false" count="2">Icy conditions</tag>
+<tag isuseradded="false" count="2">Moguls</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+<tag isuseradded="false" count="1">Racing</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Durable</tag>
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="2">Great traction</tag>
+<tag isuseradded="false" count="2">Lightweight</tag>
+<tag isuseradded="false" count="2">Scratch resistant</tag>
+<tag isuseradded="false" count="2">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>3</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>burnin-luv</pageid>
+<name>Burnin' Luv</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-08-23</newestreviewdate>
+<oldestreviewdate>2009-11-04</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>6</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="4">Downhill</tag>
+<tag isuseradded="false" count="4">Icy conditions</tag>
+<tag isuseradded="false" count="5">Moguls</tag>
+<tag isuseradded="false" count="3">Powder</tag>
+<tag isuseradded="false" count="2">Racing</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="1">Heavy</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="3">Advanced</tag>
+<tag isuseradded="false" count="2">Competitive athlete</tag>
+<tag isuseradded="false" count="1">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Durable</tag>
+<tag isuseradded="false" count="4">Good carving ability</tag>
+<tag isuseradded="false" count="3">Great flotation</tag>
+<tag isuseradded="false" count="5">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="true" count="1">Make you ski better</tag>
+<tag isuseradded="false" count="3">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>6</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>force</pageid>
+<name>Force</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-01-16</newestreviewdate>
+<oldestreviewdate>2010-01-16</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+<tag isuseradded="false" count="1">Racing</tag>
+<tag isuseradded="false" count="1">Telemarking</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Competitive athlete</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>vintage-logo-ls-tee</pageid>
+<name/>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-08-22</newestreviewdate>
+<oldestreviewdate>2010-08-22</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="true" count="1">Great old school logo</tag>
+<tag isuseradded="true" count="1">Quality material</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>interceptor</pageid>
+<name>Interceptor</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-02-28</newestreviewdate>
+<oldestreviewdate>2010-01-26</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="2">Downhill</tag>
+<tag isuseradded="true" count="1">Groomed and ungroomed</tag>
+<tag isuseradded="false" count="2">Moguls</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>hardside</pageid>
+<name>HardSide</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2009-12-29</newestreviewdate>
+<oldestreviewdate>2009-12-29</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">CRUD</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+<tag isuseradded="true" count="1">Quick turns</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>first-luv</pageid>
+<name>First Luv</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-04-04</newestreviewdate>
+<oldestreviewdate>2010-02-03</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Beginner</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="2">Great flotation</tag>
+<tag isuseradded="false" count="2">Great traction</tag>
+<tag isuseradded="false" count="2">Lightweight</tag>
+<tag isuseradded="false" count="1">Scratch resistant</tag>
+<tag isuseradded="false" count="2">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>stinger</pageid>
+<name>Stinger</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-04-12</newestreviewdate>
+<oldestreviewdate>2010-01-11</oldestreviewdate>
+<averageoverallrating>2.5</averageoverallrating>
+<average_rating_decimal>2.5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="2">Heavy</tag>
+<tag isuseradded="false" count="1">Poor flotation</tag>
+<tag isuseradded="false" count="1">Poor grip</tag>
+<tag isuseradded="false" count="1">Poor ride</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>1</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>wayback</pageid>
+<name>WayBack</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-05-23</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Cross-country / ski touring</tag>
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="false" count="2">Powder</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="2">Great flotation</tag>
+<tag isuseradded="false" count="2">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>free-luv</pageid>
+<name>Free Luv</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-08-20</newestreviewdate>
+<oldestreviewdate>2009-12-25</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>6</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Any time</tag>
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="false" count="2">Moguls</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+<tag isuseradded="false" count="1">Racing</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="5">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="true" count="1">Confidence booster</tag>
+<tag isuseradded="false" count="2">Durable</tag>
+<tag isuseradded="true" count="1">Excellent turn initiation</tag>
+<tag isuseradded="false" count="5">Good carving ability</tag>
+<tag isuseradded="true" count="1">Good flotation</tag>
+<tag isuseradded="true" count="1">Great design</tag>
+<tag isuseradded="false" count="3">Great flotation</tag>
+<tag isuseradded="false" count="4">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="1">Scratch resistant</tag>
+<tag isuseradded="false" count="4">Smooth ride</tag>
+<tag isuseradded="true" count="1">Wonderfull feel</tag>
+</taggroup>
+<bottom_line_yes_votes>6</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>recon</pageid>
+<name>Recon</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-23</newestreviewdate>
+<oldestreviewdate>2009-11-02</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>11</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">ALL MOUNTAIN</tag>
+<tag isuseradded="true" count="1">Any terrain</tag>
+<tag isuseradded="true" count="1">Bowls and chutes</tag>
+<tag isuseradded="false" count="11">Downhill</tag>
+<tag isuseradded="true" count="1">Fall line</tag>
+<tag isuseradded="true" count="1">Great in crud</tag>
+<tag isuseradded="true" count="1">Groomed</tag>
+<tag isuseradded="false" count="9">Icy conditions</tag>
+<tag isuseradded="false" count="5">Moguls</tag>
+<tag isuseradded="false" count="3">Powder</tag>
+<tag isuseradded="true" count="1">Variable conditions</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Almost too damp</tag>
+<tag isuseradded="true" count="1">Er can't think of any</tag>
+<tag isuseradded="false" count="3">Heavy</tag>
+<tag isuseradded="false" count="1">Poor flotation</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+<tag isuseradded="false" count="4">Advanced skier</tag>
+<tag isuseradded="false" count="3">Intermediate</tag>
+<tag isuseradded="false" count="2">Intermediate skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="true" count="1">Consistancy</tag>
+<tag isuseradded="true" count="1">Decent grip</tag>
+<tag isuseradded="false" count="6">Durable</tag>
+<tag isuseradded="false" count="10">Good carving ability</tag>
+<tag isuseradded="false" count="8">Great flotation</tag>
+<tag isuseradded="false" count="9">Great traction</tag>
+<tag isuseradded="true" count="1">Highly predictable</tag>
+<tag isuseradded="false" count="9">Smooth ride</tag>
+<tag isuseradded="true" count="1">Stable</tag>
+<tag isuseradded="true" count="1">Versatile</tag>
+</taggroup>
+<bottom_line_yes_votes>11</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>xplorer</pageid>
+<name>Xplorer</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-04-17</newestreviewdate>
+<oldestreviewdate>2009-11-13</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>13</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Carving</tag>
+<tag isuseradded="true" count="1">Deep crud</tag>
+<tag isuseradded="false" count="10">Downhill</tag>
+<tag isuseradded="true" count="1">Good all rounder</tag>
+<tag isuseradded="false" count="7">Icy conditions</tag>
+<tag isuseradded="false" count="8">Moguls</tag>
+<tag isuseradded="true" count="1">Off piste</tag>
+<tag isuseradded="false" count="10">Powder</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="3">Heavy</tag>
+<tag isuseradded="true" count="1">Not very lively</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="8">Advanced</tag>
+<tag isuseradded="false" count="3">Advanced skier</tag>
+<tag isuseradded="false" count="1">Intermediate skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="3">Durable</tag>
+<tag isuseradded="false" count="13">Good carving ability</tag>
+<tag isuseradded="false" count="10">Great flotation</tag>
+<tag isuseradded="false" count="12">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="true" count="1">Predictable</tag>
+<tag isuseradded="false" count="9">Smooth ride</tag>
+<tag isuseradded="true" count="1">Smooth stable at speed</tag>
+<tag isuseradded="true" count="1">Stable at speed</tag>
+</taggroup>
+<bottom_line_yes_votes>13</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>gotback</pageid>
+<name>GotBack</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-04-15</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>4</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="4">Powder</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="3">Advanced</tag>
+<tag isuseradded="false" count="1">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="3">Durable</tag>
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="4">Great flotation</tag>
+<tag isuseradded="false" count="3">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="2">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>4</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>true</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>true-luv</pageid>
+<name>True Luv</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-09</newestreviewdate>
+<oldestreviewdate>2010-03-09</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>obsethed</pageid>
+<name>ObSETHed</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-08-30</newestreviewdate>
+<oldestreviewdate>2009-11-10</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>10</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Crud bustin</tag>
+<tag isuseradded="false" count="5">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="true" count="1">Looking cool</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="false" count="10">Powder</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="4">Scratches easily</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="4">Advanced</tag>
+<tag isuseradded="false" count="2">Advanced skier</tag>
+<tag isuseradded="false" count="2">Collegiate/pro</tag>
+<tag isuseradded="false" count="1">Competitive athlete</tag>
+<tag isuseradded="false" count="1">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="5">Durable</tag>
+<tag isuseradded="false" count="6">Good carving ability</tag>
+<tag isuseradded="false" count="10">Great flotation</tag>
+<tag isuseradded="false" count="6">Great traction</tag>
+<tag isuseradded="false" count="5">Lightweight</tag>
+<tag isuseradded="false" count="2">Scratch resistant</tag>
+<tag isuseradded="true" count="1">Sexy</tag>
+<tag isuseradded="false" count="8">Smooth ride</tag>
+</taggroup>
+<taggroup key="wasthisagift" name="Was this a gift?">
+<tag isuseradded="false" count="1">No</tag>
+</taggroup>
+<bottom_line_yes_votes>10</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>kung-fujas</pageid>
+<name>Kung Fujas</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-19</newestreviewdate>
+<oldestreviewdate>2009-11-09</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.7</average_rating_decimal>
+<fullreviews>9</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Charging</tag>
+<tag isuseradded="true" count="1">CLIFFS</tag>
+<tag isuseradded="false" count="5">Downhill</tag>
+<tag isuseradded="false" count="5">Icy conditions</tag>
+<tag isuseradded="false" count="5">Moguls</tag>
+<tag isuseradded="true" count="2">Park</tag>
+<tag isuseradded="true" count="1">Pow</tag>
+<tag isuseradded="false" count="8">Powder</tag>
+<tag isuseradded="false" count="4">Racing</tag>
+<tag isuseradded="true" count="1">Switch</tag>
+<tag isuseradded="false" count="2">Telemarking</tag>
+<tag isuseradded="true" count="1">Trick</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Not durable</tag>
+<tag isuseradded="true" count="1">Pipes chip sidewalls</tag>
+<tag isuseradded="false" count="1">Poor ride</tag>
+<tag isuseradded="true" count="1">Tough in switch powder</tag>
+<tag isuseradded="true" count="1">Wobbly at high speeds</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="3">Advanced</tag>
+<tag isuseradded="false" count="4">Advanced skier</tag>
+<tag isuseradded="false" count="2">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="5">Durable</tag>
+<tag isuseradded="false" count="8">Good carving ability</tag>
+<tag isuseradded="true" count="1">Good flotation</tag>
+<tag isuseradded="false" count="8">Great flotation</tag>
+<tag isuseradded="true" count="1">Great pop</tag>
+<tag isuseradded="false" count="8">Great traction</tag>
+<tag isuseradded="false" count="6">Lightweight</tag>
+<tag isuseradded="true" count="1">Lord of ALL</tag>
+<tag isuseradded="true" count="1">Quick edge to edge</tag>
+<tag isuseradded="true" count="1">Ready for powder</tag>
+<tag isuseradded="false" count="6">Scratch resistant</tag>
+<tag isuseradded="false" count="7">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>8</bottom_line_yes_votes>
+<bottom_line_no_votes>1</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>rant</pageid>
+<name>Rant</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-03</newestreviewdate>
+<oldestreviewdate>2010-01-24</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.3</average_rating_decimal>
+<fullreviews>4</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Awesome</tag>
+<tag isuseradded="false" count="4">Downhill</tag>
+<tag isuseradded="true" count="1">Everything</tag>
+<tag isuseradded="true" count="1">Gnar-shredding</tag>
+<tag isuseradded="false" count="4">Half pipe</tag>
+<tag isuseradded="false" count="4">Park</tag>
+<tag isuseradded="false" count="2">Racing</tag>
+<tag isuseradded="false" count="4">Skiing</tag>
+<tag isuseradded="false" count="2">Snowboarding</tag>
+<tag isuseradded="true" count="1">You're cool</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Goggle clip design</tag>
+<tag isuseradded="true" count="1">Heavy</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+<tag isuseradded="false" count="1">Collegiate/pro</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="true" count="1">Awesome</tag>
+<tag isuseradded="true" count="1">Best thing ever</tag>
+<tag isuseradded="false" count="4">Comfortable</tag>
+<tag isuseradded="false" count="2">Easily adjustable</tag>
+<tag isuseradded="false" count="4">Great peripheral vision</tag>
+<tag isuseradded="false" count="3">Headphone compatible</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="4">Protective</tag>
+<tag isuseradded="false" count="4">Stylish</tag>
+<tag isuseradded="true" count="1">Super cool</tag>
+<tag isuseradded="false" count="4">Well ventilated</tag>
+</taggroup>
+<taggroup key="sizing" name="Sizing">
+<tag isuseradded="false" count="4">Feels true to size</tag>
+</taggroup>
+<bottom_line_yes_votes>4</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>backup</pageid>
+<name>BackUp</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2009-11-17</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="2">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="false" count="2">Powder</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Durable</tag>
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="2">Great flotation</tag>
+<tag isuseradded="false" count="2">Great traction</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>disorderly</pageid>
+<name>Disorderly</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-06-14</newestreviewdate>
+<oldestreviewdate>2010-02-08</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>4</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="2">Downhill</tag>
+<tag isuseradded="true" count="1">Everywhere</tag>
+<tag isuseradded="true" count="1">Freestyle</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="true" count="2">Jibbing</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="true" count="3">Park and pipe</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+<tag isuseradded="false" count="1">Racing</tag>
+<tag isuseradded="false" count="1">Telemarking</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="1">Heavy</tag>
+<tag isuseradded="true" count="1">Heavy to carry only then</tag>
+<tag isuseradded="false" count="1">Scratches easily</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+<tag isuseradded="false" count="2">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="3">Durable</tag>
+<tag isuseradded="true" count="1">Fast at spinning</tag>
+<tag isuseradded="false" count="4">Good carving ability</tag>
+<tag isuseradded="false" count="3">Great flotation</tag>
+<tag isuseradded="false" count="4">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="3">Scratch resistant</tag>
+<tag isuseradded="false" count="4">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>3</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>sidestash</pageid>
+<name>SideStash</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-05-06</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.9</average_rating_decimal>
+<fullreviews>11</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="9">Downhill</tag>
+<tag isuseradded="false" count="5">Icy conditions</tag>
+<tag isuseradded="false" count="4">Moguls</tag>
+<tag isuseradded="true" count="1">On piste</tag>
+<tag isuseradded="true" count="1">Pillows</tag>
+<tag isuseradded="false" count="11">Powder</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="1">Heavy</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+<tag isuseradded="false" count="1">Beginner</tag>
+<tag isuseradded="false" count="2">Competitive athlete</tag>
+<tag isuseradded="false" count="5">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="true" count="1">Best powder ski ever</tag>
+<tag isuseradded="true" count="1">Built in auto-pilot</tag>
+<tag isuseradded="false" count="9">Durable</tag>
+<tag isuseradded="true" count="1">Easy to maneuver</tag>
+<tag isuseradded="true" count="1">Energetic</tag>
+<tag isuseradded="false" count="9">Good carving ability</tag>
+<tag isuseradded="true" count="1">Good glide</tag>
+<tag isuseradded="false" count="11">Great flotation</tag>
+<tag isuseradded="false" count="10">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="2">Scratch resistant</tag>
+<tag isuseradded="false" count="4">Smooth ride</tag>
+<tag isuseradded="true" count="1">Stable</tag>
+</taggroup>
+<bottom_line_yes_votes>11</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>ranger</pageid>
+<name>Ranger</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-01</newestreviewdate>
+<oldestreviewdate>2009-11-04</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>3</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="2">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="false" count="2">Moguls</tag>
+<tag isuseradded="false" count="2">Powder</tag>
+<tag isuseradded="false" count="1">Racing</tag>
+<tag isuseradded="false" count="1">Telemarking</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+<tag isuseradded="false" count="1">Advanced skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Durable</tag>
+<tag isuseradded="false" count="3">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="3">Great traction</tag>
+<tag isuseradded="false" count="3">Lightweight</tag>
+<tag isuseradded="false" count="1">Scratch resistant</tag>
+<tag isuseradded="false" count="3">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>3</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>sweet-luv</pageid>
+<name>Sweet Luv</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-02-14</newestreviewdate>
+<oldestreviewdate>2010-01-09</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>4</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="4">Downhill</tag>
+<tag isuseradded="false" count="2">Icy conditions</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Scratch easily</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="3">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="4">Durable</tag>
+<tag isuseradded="false" count="4">Good carving ability</tag>
+<tag isuseradded="false" count="2">Great flotation</tag>
+<tag isuseradded="false" count="3">Great traction</tag>
+<tag isuseradded="false" count="4">Lightweight</tag>
+<tag isuseradded="true" count="1">Responsive</tag>
+<tag isuseradded="false" count="2">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>4</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>coomback</pageid>
+<name>COOMBAck</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-07-09</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>4.8</average_rating_decimal>
+<fullreviews>10</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="true" count="1">Alpine touring</tag>
+<tag isuseradded="false" count="9">Downhill</tag>
+<tag isuseradded="false" count="2">Icy conditions</tag>
+<tag isuseradded="false" count="3">Moguls</tag>
+<tag isuseradded="false" count="10">Powder</tag>
+<tag isuseradded="true" count="1">Ski mountaineering</tag>
+<tag isuseradded="false" count="2">Telemarking</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Unstable at speed</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="4">Advanced</tag>
+<tag isuseradded="false" count="1">Advanced skier</tag>
+<tag isuseradded="false" count="1">Competitive athlete</tag>
+<tag isuseradded="false" count="4">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="6">Durable</tag>
+<tag isuseradded="false" count="5">Good carving ability</tag>
+<tag isuseradded="false" count="10">Great flotation</tag>
+<tag isuseradded="false" count="8">Great traction</tag>
+<tag isuseradded="false" count="8">Lightweight</tag>
+<tag isuseradded="false" count="5">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>10</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>true</customerimages>
+<customervideos>true</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>missconduct</pageid>
+<name>MissConduct</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2009-11-17</newestreviewdate>
+<oldestreviewdate>2009-11-17</oldestreviewdate>
+<averageoverallrating>5</averageoverallrating>
+<average_rating_decimal>5</average_rating_decimal>
+<fullreviews>1</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Verified Reviewer</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Competitive skier</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Durable</tag>
+<tag isuseradded="false" count="1">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great traction</tag>
+<tag isuseradded="false" count="1">Lightweight</tag>
+</taggroup>
+<bottom_line_yes_votes>1</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>ext</pageid>
+<name>EXT</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-04-04</newestreviewdate>
+<oldestreviewdate>2010-02-16</oldestreviewdate>
+<averageoverallrating>4.5</averageoverallrating>
+<average_rating_decimal>4.5</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="2">Downhill</tag>
+<tag isuseradded="false" count="1">Icy conditions</tag>
+<tag isuseradded="false" count="1">Moguls</tag>
+<tag isuseradded="true" count="1">Park and pipe</tag>
+<tag isuseradded="false" count="1">Powder</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="true" count="1">Chips very easily</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="1">Advanced</tag>
+<tag isuseradded="false" count="1">Intermediate</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="2">Good carving ability</tag>
+<tag isuseradded="false" count="1">Great flotation</tag>
+<tag isuseradded="false" count="2">Great traction</tag>
+<tag isuseradded="true" count="1">Pretty good in pow</tag>
+<tag isuseradded="false" count="1">Smooth ride</tag>
+</taggroup>
+<bottom_line_yes_votes>2</bottom_line_yes_votes>
+<bottom_line_no_votes>0</bottom_line_no_votes>
+<customerimages>false</customerimages>
+<customervideos>false</customervideos>
+</product>
+
+<product xsi:type="ProductWithReviews" locale="en_US">
+<pageid>edge</pageid>
+<name>Edge</name>
+<smallstarimagelocation>pwr/engine/images/stars_small.gif</smallstarimagelocation>
+<largestarimagelocation>pwr/engine/images/stars.gif</largestarimagelocation>
+<newestreviewdate>2010-03-03</newestreviewdate>
+<oldestreviewdate>2010-02-14</oldestreviewdate>
+<averageoverallrating>3</averageoverallrating>
+<average_rating_decimal>3</average_rating_decimal>
+<fullreviews>2</fullreviews>
+<confirmstatusgroup>
+<confirmstatus>Unverified</confirmstatus>
+</confirmstatusgroup>
+<taggroup key="bestuses" name="Best Uses">
+<tag isuseradded="false" count="1">Skiing</tag>
+</taggroup>
+<taggroup key="cons" name="Cons">
+<tag isuseradded="false" count="1">Difficult to adjust</tag>
+<tag isuseradded="false" count="1">Lacks protection</tag>
+<tag isuseradded="false" count="1">Poor fit</tag>
+<tag isuseradded="true" count="1">Too much chin strap</tag>
+</taggroup>
+<taggroup key="describeyourself" name="Describe Yourself">
+<tag isuseradded="false" count="2">Advanced</tag>
+</taggroup>
+<taggroup key="pros" name="Pros">
+<tag isuseradded="false" count="1">Comfortable</tag>
+<tag isuseradded="false"