packages feed

htsn-import 0.0.2 → 0.0.4

raw patch · 31 files changed

+1448/−39 lines, 31 filesdep ~tastydep ~tasty-hunitbinary-added

Dependency ranges changed: tasty, tasty-hunit

Files

doc/TODO view
@@ -5,3 +5,15 @@    longer takes 10 minutes to import (Postgres only?).  3. Add support the the second type of weatherxml (see man page).++4. There are a few remaining document types that we need to parse+   before "version one point oh." This list refers to an+   old proprietary implementation, sorry:++     * AutoRaceResultsXML+     * jfilexml+     * Schedule_Changes_XML+     * GameInfoXML+     * SportInfoListing++5. Try mass import of Auto_Racing_Schedule_XML.
+ doc/dbschema/Auto_Racing_Schedule_XML.png view

binary file changed (absent → 102970 bytes)

+ doc/dbschema/scoresxml.png view

binary file changed (absent → 130738 bytes)

doc/htsn-importrc.example view
@@ -41,9 +41,10 @@  # How verbose should the logs be? Valid levels are, #-#   "INFO", "WARNING", "ERROR"+#   "DEBUG", "INFO", "WARNING", "ERROR" #-# (there are others, but we don't emit them.)+# (there are others, but we don't emit them.) The debug output is+# extremely verbose and will not be written to syslog even if you try. # # Default: "INFO" #
doc/man1/htsn-import.1 view
@@ -48,16 +48,20 @@ The XML document types obtained from the feed are uniquely identified by their DTDs. We currently support documents with the following DTDs: .IP \[bu] 2-Heartbeat.dtd+Auto_Racing_Schedule_XML.dtd .IP \[bu]-newsxml.dtd+Heartbeat.dtd .IP \[bu] Injuries_Detail_XML.dtd .IP \[bu] injuriesxml.dtd .IP \[bu]+newsxml.dtd+.IP \[bu] Odds_XML.dtd .IP \[bu]+scoresxml.dtd+.IP \[bu] weatherxml.dtd  .SH DATABASE SCHEMA@@ -152,10 +156,11 @@ Default: none  .IP \fB\-\-log-level\fR-How verbose should the logs be? We log notifications at three levels:-INFO, WARN, and ERROR. Specify the \(dqmost boring\(dq level of+How verbose should the logs be? We log notifications at four levels:+DEBUG, INFO, WARN, and ERROR. Specify the \(dqmost boring\(dq level of notifications you would like to receive (in all-caps); more-interesting notifications will be logged as well.+interesting notifications will be logged as well. The debug output is+extremely verbose and will not be written to syslog even if you try.  Default: INFO 
htsn-import.cabal view
@@ -1,5 +1,5 @@ name:           htsn-import-version:        0.0.2+version:        0.0.4 cabal-version:  >= 1.8 author:         Michael Orlitzky maintainer:	Michael Orlitzky <michael@orlitzky.com>@@ -16,11 +16,13 @@   doc/TODO   makefile   schema/*.dtd+  schemagen/Auto_Racing_Schedule_XML/*.xml   schemagen/Heartbeat/*.xml   schemagen/injuriesxml/*.xml   schemagen/Injuries_Detail_XML/*.xml   schemagen/newsxml/*.xml   schemagen/Odds_XML/*.xml+  schemagen/scoresxml/*.xml   schemagen/weatherxml/*.xml   test/shell/*.test   test/xml/*.xml@@ -85,8 +87,8 @@     groundhog-th                == 0.4.*,     MissingH                    == 1.2.*,     old-locale                  == 1.0.*,-    tasty                       == 0.7.*,-    tasty-hunit                 == 0.4.*,+    tasty                       == 0.8.*,+    tasty-hunit                 == 0.8.*,     time                        == 1.4.*,     transformers                == 0.3.*,     tuple                       == 0.2.*@@ -109,11 +111,13 @@     TSN.DbImport     TSN.Picklers     TSN.XmlImport+    TSN.XML.AutoRacingSchedule     TSN.XML.Heartbeat     TSN.XML.Injuries     TSN.XML.InjuriesDetail     TSN.XML.News     TSN.XML.Odds+    TSN.XML.Scores     TSN.XML.Weather     Xml @@ -160,8 +164,8 @@     groundhog-th                == 0.4.*,     MissingH                    == 1.2.*,     old-locale                  == 1.0.*,-    tasty                       == 0.7.*,-    tasty-hunit                 == 0.4.*,+    tasty                       == 0.8.*,+    tasty-hunit                 == 0.8.*,     time                        == 1.4.*,     transformers                == 0.3.*,     tuple                       == 0.2.*@@ -232,8 +236,8 @@     MissingH                    == 1.2.*,     old-locale                  == 1.0.*,     process                     == 1.1.*,-    tasty                       == 0.7.*,-    tasty-hunit                 == 0.4.*,+    tasty                       == 0.8.*,+    tasty-hunit                 == 0.8.*,     time                        == 1.4.*,     transformers                == 0.3.*,     tuple                       == 0.2.*
makefile view
@@ -43,7 +43,7 @@ # dist: 	runghc Setup.hs configure --prefix=/-	runghc Setup.hs sdist+	TAR_OPTIONS="--format=ustar" runghc Setup.hs sdist  hlint: 	hlint --ignore="Use camelCase"     \
+ schema/Auto_Racing_Schedule_XML.dtd view
@@ -0,0 +1,26 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT Title (#PCDATA)>+<!ELEMENT Complete_Through (#PCDATA)>+<!ELEMENT RaceID (#PCDATA)>+<!ELEMENT Race_Date (#PCDATA)>+<!ELEMENT Race_Time (#PCDATA)>+<!ELEMENT RaceName (#PCDATA)>+<!ELEMENT TrackName (#PCDATA)>+<!ELEMENT Location (#PCDATA)>+<!ELEMENT TV_Listing (#PCDATA)>+<!ELEMENT Laps (#PCDATA)>+<!ELEMENT TrackLength (#PCDATA)>+<!ELEMENT FinishPosition (#PCDATA)>+<!ELEMENT DriverID (#PCDATA)>+<!ELEMENT Name (#PCDATA)>+<!ELEMENT LeadingLaps (#PCDATA)>+<!ELEMENT Earnings (#PCDATA)>+<!ELEMENT Status (#PCDATA)>+<!ELEMENT RaceResultsListing ( ( FinishPosition, DriverID, Name, LeadingLaps, Laps, Earnings, Status ) )>+<!ELEMENT RaceResults ( RaceResultsListing* )>+<!ELEMENT Listing ( ( RaceID, Race_Date, Race_Time, RaceName, TrackName, Location, TV_Listing, Laps, TrackLength, RaceResults ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, category, sport, Title, Complete_Through, Listing*, time_stamp ) )>
+ schema/scoresxml.dtd view
@@ -0,0 +1,27 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT game_id (#PCDATA)>+<!ELEMENT schedule_id (#PCDATA)>+<!ELEMENT tsnupdate (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT seasontype (#PCDATA)>+<!ELEMENT vteam (#PCDATA)>+<!ELEMENT hteam (#PCDATA)>+<!ELEMENT vscore (#PCDATA)>+<!ELEMENT hscore (#PCDATA)>+<!ELEMENT time_r (#PCDATA)>+<!ELEMENT status (#PCDATA)>+<!ELEMENT game ( ( vteam, hteam, vscore, hscore, time_r?, status, notes? ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, game_id, schedule_id, tsnupdate?, category, sport, location*, seasontype, game, time_stamp ) )>+<!ELEMENT city (#PCDATA)>+<!ELEMENT state (#PCDATA)>+<!ELEMENT country (#PCDATA)>+<!ELEMENT location ( ( city, state, country ) )>+<!ELEMENT notes (#PCDATA)>++<!ATTLIST vteam id CDATA #REQUIRED>+<!ATTLIST hteam id CDATA #REQUIRED>+<!ATTLIST status numeral CDATA #REQUIRED>+<!ATTLIST status type CDATA #REQUIRED>
+ schemagen/Auto_Racing_Schedule_XML/20136714.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd">
<message>
<XML_File_ID>20136714</XML_File_ID>
<heading>BFX%SCHEDULE</heading>
<category>Statistics</category>
<sport>NASCAR</sport>
<Title>2013 NASCAR Sprint Cup Schedule</Title>
<Complete_Through>Complete through </Complete_Through>
<Listing>
<RaceID>1492</RaceID>
<Race_Date>02/16/2013</Race_Date>
<Race_Time>08:10 PM</Race_Time>
<RaceName>Sprint Unlimited at Daytona</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>75</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>75</Laps>
<Earnings>205,075</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>75</Laps>
<Earnings>101,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>75</Laps>
<Earnings>61,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>5</LeadingLaps>
<Laps>75</Laps>
<Earnings>52,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>26</LeadingLaps>
<Laps>75</Laps>
<Earnings>51,300</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1493</RaceID>
<Race_Date>02/21/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Budweiser Duel 1</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>60</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>23</LeadingLaps>
<Laps>60</Laps>
<Earnings>57,792</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>42,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>37,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>23,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>30,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1494</RaceID>
<Race_Date>02/21/2013</Race_Date>
<Race_Time>04:00 PM</Race_Time>
<RaceName>Budweiser Duel 2</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>60</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>60</Laps>
<Earnings>58,977</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>43,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1321</DriverID>
<Name>Austin Dillon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>38,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>60</Laps>
<Earnings>33,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>31,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1495</RaceID>
<Race_Date>02/24/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Daytona 500</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>17</LeadingLaps>
<Laps>200</Laps>
<Earnings>1,525,275</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>1,104,814</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>32</DriverID>
<Name>Mark Martin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>817,013</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>13</LeadingLaps>
<Laps>200</Laps>
<Earnings>707,855</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>200</Laps>
<Earnings>578,471</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1496</RaceID>
<Race_Date>03/03/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Subway Fresh Fit 500</RaceName>
<TrackName>Phoenix International Raceway</TrackName>
<Location>Avondale, AZ</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>316</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>122</LeadingLaps>
<Laps>316</Laps>
<Earnings>298,875</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>316</Laps>
<Earnings>209,686</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>316</Laps>
<Earnings>157,575</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>316</Laps>
<Earnings>168,076</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>47</LeadingLaps>
<Laps>316</Laps>
<Earnings>130,750</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1497</RaceID>
<Race_Date>03/10/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Kobalt Tools 400</RaceName>
<TrackName>Las Vegas Motor Speedway</TrackName>
<Location>Las Vegas, NV</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>42</LeadingLaps>
<Laps>267</Laps>
<Earnings>408,666</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>114</LeadingLaps>
<Laps>267</Laps>
<Earnings>284,340</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>12</LeadingLaps>
<Laps>267</Laps>
<Earnings>248,956</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>27</LeadingLaps>
<Laps>267</Laps>
<Earnings>208,698</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>180,590</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1498</RaceID>
<Race_Date>03/17/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Food City 500</RaceName>
<TrackName>Bristol Motor Speedway</TrackName>
<Location>Bristol, TN</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.533</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>109</LeadingLaps>
<Laps>500</Laps>
<Earnings>176,760</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>56</LeadingLaps>
<Laps>500</Laps>
<Earnings>188,893</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>62</LeadingLaps>
<Laps>500</Laps>
<Earnings>168,651</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>500</Laps>
<Earnings>134,255</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>144,543</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1499</RaceID>
<Race_Date>03/24/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Auto Club 400</RaceName>
<TrackName>Auto Club Speedway</TrackName>
<Location>Fontana, CA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>125</LeadingLaps>
<Laps>200</Laps>
<Earnings>334,233</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>212,340</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>41</LeadingLaps>
<Laps>200</Laps>
<Earnings>193,673</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>181,815</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>146,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1500</RaceID>
<Race_Date>04/07/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>STP Gas Booster 500</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Martinsville, VA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>346</LeadingLaps>
<Laps>500</Laps>
<Earnings>214,471</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>164,893</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>146,446</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>112,385</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>56</LeadingLaps>
<Laps>500</Laps>
<Earnings>145,278</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1501</RaceID>
<Race_Date>04/13/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>NRA 500</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>171</LeadingLaps>
<Laps>334</Laps>
<Earnings>550,858</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>142</LeadingLaps>
<Laps>334</Laps>
<Earnings>346,555</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>268,605</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>214,855</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>209,913</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1502</RaceID>
<Race_Date>04/21/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>STP 400</RaceName>
<TrackName>Kansas Speedway</TrackName>
<Location>Kansas City, KS</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>163</LeadingLaps>
<Laps>267</Laps>
<Earnings>263,816</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>182,085</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>267</Laps>
<Earnings>185,021</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>46</LeadingLaps>
<Laps>267</Laps>
<Earnings>155,985</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>156,218</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1503</RaceID>
<Race_Date>04/27/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Toyota Owners 400</RaceName>
<TrackName>Richmond International Raceway</TrackName>
<Location>Richmond, VA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>406</Laps>
<TrackLength>0.75</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>406</Laps>
<Earnings>242,511</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>113</LeadingLaps>
<Laps>406</Laps>
<Earnings>196,668</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>406</Laps>
<Earnings>161,618</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>67</LeadingLaps>
<Laps>406</Laps>
<Earnings>147,474</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>7</LeadingLaps>
<Laps>406</Laps>
<Earnings>118,435</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1504</RaceID>
<Race_Date>05/05/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Aaron's 499</RaceName>
<TrackName>Talladega Superspeedway</TrackName>
<Location>Talladega, AL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>192</Laps>
<TrackLength>2.66</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>455</DriverID>
<Name>David Ragan</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>192</Laps>
<Earnings>373,108</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>399</DriverID>
<Name>David Gilliland</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>192</Laps>
<Earnings>235,153</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>5</LeadingLaps>
<Laps>192</Laps>
<Earnings>207,720</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>46</DriverID>
<Name>Michael Waltrip</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>192</Laps>
<Earnings>155,620</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>192</Laps>
<Earnings>181,426</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1505</RaceID>
<Race_Date>05/11/2013</Race_Date>
<Race_Time>07:00 PM</Race_Time>
<RaceName>Bojangles Southern 500</RaceName>
<TrackName>Darlington Raceway</TrackName>
<Location>Darlington, SC</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>367</Laps>
<TrackLength>1.366</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>17</LeadingLaps>
<Laps>367</Laps>
<Earnings>314,866</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>211,465</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>367</Laps>
<Earnings>200,026</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>178,876</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>165,976</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1506</RaceID>
<Race_Date>05/18/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Sprint Showdown</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>40</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>40</Laps>
<Earnings>50,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1341</DriverID>
<Name>Ricky Stenhouse Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>40,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>36,640</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>34,540</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>33,540</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1507</RaceID>
<Race_Date>05/18/2013</Race_Date>
<Race_Time>09:00 PM</Race_Time>
<RaceName>NASCAR Sprint All-Star Race</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>90</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>10</LeadingLaps>
<Laps>90</Laps>
<Earnings>1,039,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>244,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>144,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>11</LeadingLaps>
<Laps>90</Laps>
<Earnings>114,150</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>109,150</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1508</RaceID>
<Race_Date>05/26/2013</Race_Date>
<Race_Time>06:00 PM</Race_Time>
<RaceName>Coca-Cola 600</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>28</LeadingLaps>
<Laps>400</Laps>
<Earnings>407,011</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>161</LeadingLaps>
<Laps>400</Laps>
<Earnings>291,615</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>8</LeadingLaps>
<Laps>400</Laps>
<Earnings>218,560</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>400</Laps>
<Earnings>220,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>174,823</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1509</RaceID>
<Race_Date>06/02/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>FedEx 400</RaceName>
<TrackName>Dover International Speedway</TrackName>
<Location>Dover, DE</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>139</LeadingLaps>
<Laps>400</Laps>
<Earnings>318,100</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>400</Laps>
<Earnings>226,504</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>203,051</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>150</LeadingLaps>
<Laps>400</Laps>
<Earnings>196,198</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>400</Laps>
<Earnings>177,431</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1510</RaceID>
<Race_Date>06/09/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Party in the Poconos 400</RaceName>
<TrackName>Pocono Raceway</TrackName>
<Location>Long Pond, PA</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>128</LeadingLaps>
<Laps>160</Laps>
<Earnings>244,436</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>179,185</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>143,060</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>165,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>160</Laps>
<Earnings>144,343</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1511</RaceID>
<Race_Date>06/16/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Quicken Loans 400</RaceName>
<TrackName>Michigan International Speedway</TrackName>
<Location>Brooklyn, MI</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>48</LeadingLaps>
<Laps>200</Laps>
<Earnings>240,460</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>173,781</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>145,670</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>148,803</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>142,085</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1513</RaceID>
<Race_Date>06/23/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Toyota/Save Mart 350</RaceName>
<TrackName>Sonoma Raceway</TrackName>
<Location>Sonoma, CA</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>110</Laps>
<TrackLength>1.99</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>51</LeadingLaps>
<Laps>110</Laps>
<Earnings>309,250</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>110</Laps>
<Earnings>240,451</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>110</Laps>
<Earnings>198,140</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>15</LeadingLaps>
<Laps>110</Laps>
<Earnings>154,860</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>110</Laps>
<Earnings>157,548</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1514</RaceID>
<Race_Date>06/30/2013</Race_Date>
<Race_Time>12:00 PM</Race_Time>
<RaceName>Quaker State 400</RaceName>
<TrackName>Kentucky Speedway</TrackName>
<Location>Sparta, KY</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>38</LeadingLaps>
<Laps>267</Laps>
<Earnings>200,451</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>159,115</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>146,078</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>130,338</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>139,743</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1515</RaceID>
<Race_Date>07/06/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Coke Zero 400</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>161</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>94</LeadingLaps>
<Laps>161</Laps>
<Earnings>327,961</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>254,490</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>224,301</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>182,073</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>46</DriverID>
<Name>Michael Waltrip</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>141,365</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1516</RaceID>
<Race_Date>07/14/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Camping World RV Sales 301</RaceName>
<TrackName>New Hampshire Motor Speedway</TrackName>
<Location>Loudon, NH</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>302</Laps>
<TrackLength>1.058</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>118</DriverID>
<Name>Brian Vickers</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>302</Laps>
<Earnings>214,075</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>53</LeadingLaps>
<Laps>302</Laps>
<Earnings>228,043</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>302</Laps>
<Earnings>147,135</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>14</LeadingLaps>
<Laps>302</Laps>
<Earnings>179,076</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>580</DriverID>
<Name>Aric Almirola</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>302</Laps>
<Earnings>152,496</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1517</RaceID>
<Race_Date>07/28/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Crown Royal 400 at the Brickyard</RaceName>
<TrackName>Indianapolis Motor Speedway</TrackName>
<Location>Indianapolis, IN</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>45</LeadingLaps>
<Laps>160</Laps>
<Earnings>423,033</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>73</LeadingLaps>
<Laps>160</Laps>
<Earnings>379,736</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>299,500</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>300,650</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>273,266</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1518</RaceID>
<Race_Date>08/04/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>GoBowling.com 400</RaceName>
<TrackName>Pocono Raceway</TrackName>
<Location>Long Pond, PA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>66</LeadingLaps>
<Laps>160</Laps>
<Earnings>208,500</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>7</LeadingLaps>
<Laps>160</Laps>
<Earnings>199,221</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>160</Laps>
<Earnings>153,930</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>160</Laps>
<Earnings>161,343</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>160</Laps>
<Earnings>130,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1519</RaceID>
<Race_Date>08/11/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Cheez-It 355 at the Glen</RaceName>
<TrackName>Watkins Glen International</TrackName>
<Location>Watkins Glen, NY</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>90</Laps>
<TrackLength>2.45</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>236,658</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>204,876</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>161,735</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>149,360</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>90</Laps>
<Earnings>137,524</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1520</RaceID>
<Race_Date>08/18/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Pure Michigan 400</RaceName>
<TrackName>Michigan International Speedway</TrackName>
<Location>Brooklyn, MI</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>51</LeadingLaps>
<Laps>200</Laps>
<Earnings>252,393</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>180,731</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>43</LeadingLaps>
<Laps>200</Laps>
<Earnings>136,315</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>143,486</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>145,493</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1521</RaceID>
<Race_Date>08/24/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>IRWIN Tools Night Race</RaceName>
<TrackName>Bristol Motor Speedway</TrackName>
<Location>Bristol, TN</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.533</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>149</LeadingLaps>
<Laps>500</Laps>
<Earnings>328,466</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>214,815</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>200,529</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>118</DriverID>
<Name>Brian Vickers</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>150,315</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>155,973</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1522</RaceID>
<Race_Date>09/01/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>AdvoCare 500</RaceName>
<TrackName>Atlanta Motor Speedway</TrackName>
<Location>Hampton, GA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>325</Laps>
<TrackLength>1.54</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>36</LeadingLaps>
<Laps>325</Laps>
<Earnings>338,058</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>78</LeadingLaps>
<Laps>325</Laps>
<Earnings>244,473</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>325</Laps>
<Earnings>207,065</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>325</Laps>
<Earnings>165,235</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>325</Laps>
<Earnings>167,848</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1523</RaceID>
<Race_Date>09/07/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Federated Auto Parts 400</RaceName>
<TrackName>Richmond International Raceway</TrackName>
<Location>Richmond, VA</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>400</Laps>
<TrackLength>0.75</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>46</LeadingLaps>
<Laps>400</Laps>
<Earnings>286,475</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>73</LeadingLaps>
<Laps>400</Laps>
<Earnings>185,355</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>400</Laps>
<Earnings>181,443</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>400</Laps>
<Earnings>151,805</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>400</Laps>
<Earnings>140,701</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1524</RaceID>
<Race_Date>09/15/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>GEICO 400</RaceName>
<TrackName>Chicagoland Speedway</TrackName>
<Location>Joliet, IL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>89</LeadingLaps>
<Laps>267</Laps>
<Earnings>334,891</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>67</LeadingLaps>
<Laps>267</Laps>
<Earnings>261,048</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>267</Laps>
<Earnings>221,326</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>169,960</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>267</Laps>
<Earnings>176,926</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1525</RaceID>
<Race_Date>09/22/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Sylvania 300</RaceName>
<TrackName>New Hampshire Motor Speedway</TrackName>
<Location>Loudon, NH</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>300</Laps>
<TrackLength>1.058</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>106</LeadingLaps>
<Laps>300</Laps>
<Earnings>262,066</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>210,143</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>151,785</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>300</Laps>
<Earnings>160,796</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>142,005</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1526</RaceID>
<Race_Date>09/29/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>AAA 400</RaceName>
<TrackName>Dover International Speedway</TrackName>
<Location>Dover, DE</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>243</LeadingLaps>
<Laps>400</Laps>
<Earnings>243,836</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>80</LeadingLaps>
<Laps>400</Laps>
<Earnings>197,210</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>166,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>400</Laps>
<Earnings>168,296</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>30</LeadingLaps>
<Laps>400</Laps>
<Earnings>162,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1527</RaceID>
<Race_Date>10/06/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Hollywood Casino 400</RaceName>
<TrackName>Kansas Speedway</TrackName>
<Location>Kansas City, KS</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>138</LeadingLaps>
<Laps>267</Laps>
<Earnings>364,636</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>229,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>216,776</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>33</LeadingLaps>
<Laps>267</Laps>
<Earnings>176,473</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>169,965</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1528</RaceID>
<Race_Date>10/12/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Bank of America 500</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>11</LeadingLaps>
<Laps>334</Laps>
<Earnings>314,441</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>138</LeadingLaps>
<Laps>334</Laps>
<Earnings>224,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>199,426</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>130</LeadingLaps>
<Laps>334</Laps>
<Earnings>192,721</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>334</Laps>
<Earnings>163,568</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1529</RaceID>
<Race_Date>10/20/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Camping World RV Sales 500</RaceName>
<TrackName>Talladega Superspeedway</TrackName>
<Location>Talladega, AL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>188</Laps>
<TrackLength>2.66</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>188</Laps>
<Earnings>236,345</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>38</LeadingLaps>
<Laps>188</Laps>
<Earnings>185,410</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1341</DriverID>
<Name>Ricky Stenhouse Jr.</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>188</Laps>
<Earnings>187,596</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>188</Laps>
<Earnings>154,726</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>188</Laps>
<Earnings>162,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1530</RaceID>
<Race_Date>10/27/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Goody's Headache Relief Shot 500</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Ridgeway, VA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>78</LeadingLaps>
<Laps>500</Laps>
<Earnings>188,796</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>202</LeadingLaps>
<Laps>500</Laps>
<Earnings>177,736</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>60</LeadingLaps>
<Laps>500</Laps>
<Earnings>141,478</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>153,436</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>123</LeadingLaps>
<Laps>500</Laps>
<Earnings>144,046</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1531</RaceID>
<Race_Date>11/03/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>AAA Texas 500</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>255</LeadingLaps>
<Laps>334</Laps>
<Earnings>484,211</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>337,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>256,393</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>334</Laps>
<Earnings>238,776</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>180,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1532</RaceID>
<Race_Date>11/10/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>AdvoCare 500</RaceName>
<TrackName>Phoenix International Raceway</TrackName>
<Location>Avondale, AZ</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>312</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>70</LeadingLaps>
<Laps>312</Laps>
<Earnings>263,386</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>41</LeadingLaps>
<Laps>312</Laps>
<Earnings>171,715</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>312</Laps>
<Earnings>182,326</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>312</Laps>
<Earnings>131,135</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>312</Laps>
<Earnings>137,630</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1533</RaceID>
<Race_Date>11/17/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Ford EcoBoost 400</RaceName>
<TrackName>Homestead-Miami Speedway</TrackName>
<Location>Homestead, FL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>72</LeadingLaps>
<Laps>267</Laps>
<Earnings>322,350</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>144</LeadingLaps>
<Laps>267</Laps>
<Earnings>293,251</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>28</LeadingLaps>
<Laps>267</Laps>
<Earnings>203,860</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>179,435</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>167,968</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<time_stamp> January 13, 2014, at 11:34 AM ET </time_stamp>
</message>
+ schemagen/scoresxml/20160114.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd">
<message>
<XML_File_ID>20160114</XML_File_ID>
<heading>BC-ADi+129:143*  0  0 0</heading>
<game_id>18166</game_id>
<schedule_id>18166</schedule_id>
<category>Scores</category>
<sport>NHL</sport>
<location>
<city>Montreal</city>
<state>QUEBEC</state>
<country>CANADA</country>
</location>
<location>
<city>Ottawa</city>
<state>ONTARIO</state>
<country>CANADA</country>
</location>
<seasontype>Regular</seasontype>
<game>
<vteam id="129">Montreal</vteam>
<hteam id="143">Ottawa</hteam>
<vscore>0</vscore>
<hscore>0</hscore>
<status numeral="0" type="i">0 Period</status>
<notes>Ottawa - Right Wing Chris Neil (1/16, lower body) is probable for Thursday's 
  game against Montreal.</notes>
</game>
<time_stamp> January 16, 2014, at 10:39 AM ET </time_stamp>
</message>
+ schemagen/scoresxml/20160285.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd">
<message>
<XML_File_ID>20160285</XML_File_ID>
<heading>BC-BLP+P26:P56*  7  7 1R14:56</heading>
<game_id>50719</game_id>
<schedule_id>50719</schedule_id>
<category>Scores</category>
<sport>CBASK-W</sport>
<seasontype>Regular</seasontype>
<game>
<vteam id="P26">Campbell</vteam>
<hteam id="P56">Gardner-Webb</hteam>
<vscore>7</vscore>
<hscore>7</hscore>
<time_r>14:56</time_r>
<status numeral="1" type="P">1 Half</status>
</game>
<time_stamp> January 16, 2014, at 11:17 AM ET </time_stamp>
</message>
+ schemagen/scoresxml/20187479.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd">
<message>
<XML_File_ID>20187479</XML_File_ID>
<heading>BC-AFP+YX9:YX8*  7  0 1R 4:40</heading>
<game_id>42485</game_id>
<schedule_id>42485</schedule_id>
<tsnupdate>True</tsnupdate>
<category>Scores</category>
<sport>CFOOT</sport>
<seasontype>Regular</seasontype>
<game>
<vteam id="YX9">American</vteam>
<hteam id="YX8">National</hteam>
<vscore>7</vscore>
<hscore>0</hscore>
<time_r>4:40</time_r>
<status numeral="1" type="P">1 Qtr</status>
</game>
<time_stamp> January 18, 2014, at 06:37 PM ET </time_stamp>
</message>
src/Main.hs view
@@ -45,12 +45,18 @@   report_info,   report_error ) import TSN.DbImport ( DbImport(..), ImportResult(..) )-import qualified TSN.XML.Heartbeat as Heartbeat ( verify )-import qualified TSN.XML.Injuries as Injuries ( pickle_message )-import qualified TSN.XML.InjuriesDetail as InjuriesDetail ( pickle_message )-import qualified TSN.XML.News as News ( pickle_message )-import qualified TSN.XML.Odds as Odds ( pickle_message )-import qualified TSN.XML.Weather as Weather ( pickle_message )+import qualified TSN.XML.AutoRacingSchedule as AutoRacingSchedule (+  dtd,+  pickle_message )+import qualified TSN.XML.Heartbeat as Heartbeat ( dtd, verify )+import qualified TSN.XML.Injuries as Injuries ( dtd, pickle_message )+import qualified TSN.XML.InjuriesDetail as InjuriesDetail (+  dtd,+  pickle_message )+import qualified TSN.XML.News as News ( dtd, pickle_message )+import qualified TSN.XML.Odds as Odds ( dtd, pickle_message )+import qualified TSN.XML.Scores as Scores ( dtd, pickle_message )+import qualified TSN.XML.Weather as Weather ( dtd, pickle_message ) import Xml ( DtdName(..), parse_opts )  @@ -136,7 +142,7 @@     import_with_dtd (DtdName dtd,xml)         -- We special-case the heartbeat so it doesn't have to run in         -- the database monad.-      | dtd == "Heartbeat.dtd" = Heartbeat.verify xml+      | dtd == Heartbeat.dtd = Heartbeat.verify xml       | otherwise =         -- We need NoMonomorphismRestriction here.         if backend cfg == Postgres@@ -144,43 +150,51 @@         else withSqliteConn cs $ runDbConn importer         where           -- | Pull the real connection String out  of the configuration.+          --           cs :: String           cs = get_connection_string $ connection_string cfg            -- | Convenience; we use this everywhere below in 'importer'.+          --           migrate_and_import m = dbmigrate m >> dbimport m            importer-            | dtd == "injuriesxml.dtd" = do+            | dtd == AutoRacingSchedule.dtd = do+               let m = unpickleDoc AutoRacingSchedule.pickle_message xml+               maybe (return $ ImportFailed errmsg) migrate_and_import m++            | dtd == Injuries.dtd = do                let m = unpickleDoc Injuries.pickle_message xml-               let errmsg = "Could not unpickle injuriesxml."                maybe (return $ ImportFailed errmsg) migrate_and_import m -            | dtd == "Injuries_Detail_XML.dtd" = do+            | dtd == InjuriesDetail.dtd = do                 let m = unpickleDoc InjuriesDetail.pickle_message xml-                let errmsg = "Could not unpickle Injuries_Detail_XML."                 maybe (return $ ImportFailed errmsg) migrate_and_import m  -            | dtd == "newsxml.dtd" = do+            | dtd == News.dtd = do                 let m = unpickleDoc News.pickle_message xml-                let errmsg = "Could not unpickle newsxml."                 maybe (return $ ImportFailed errmsg) migrate_and_import m -            | dtd == "Odds_XML.dtd" = do+            | dtd == Odds.dtd = do                 let m = unpickleDoc Odds.pickle_message xml-                let errmsg = "Could not unpickle Odds_XML."                 maybe (return $ ImportFailed errmsg) migrate_and_import m -            | dtd == "weatherxml.dtd" = do+            | dtd == Scores.dtd = do+                let m = unpickleDoc Scores.pickle_message xml+                maybe (return $ ImportFailed errmsg) migrate_and_import m++            | dtd == Weather.dtd = do                 let m = unpickleDoc Weather.pickle_message xml-                let errmsg = "Could not unpickle weatherxml."                 maybe (return $ ImportFailed errmsg) migrate_and_import m              | otherwise = do               let infomsg =                     "Unrecognized DTD in " ++ path ++ ": " ++ dtd ++ "."               return $ ImportUnsupported infomsg++            where+              errmsg = "Could not unpickle " ++ dtd ++ "."   -- | Entry point of the program. It twiddles some knobs for
src/TSN/Picklers.hs view
@@ -4,6 +4,7 @@ module TSN.Picklers (   xp_date,   xp_gamedate,+  xp_tba_time,   xp_time,   xp_time_stamp ) where@@ -14,6 +15,7 @@ import System.Locale ( defaultTimeLocale ) import Text.XML.HXT.Arrow.Pickle (   xpText,+  xpWrap,   xpWrapMaybe ) import Text.XML.HXT.Arrow.Pickle.Xml ( PU ) @@ -99,6 +101,22 @@     from_time :: UTCTime -> String     from_time = formatTime defaultTimeLocale xp_time_format ++-- | (Un)pickle a UTCTime without the date portion, allowing for a+--   value of \"TBA\" (which gets translated to 'Nothing').+--+xp_tba_time :: PU (Maybe UTCTime)+xp_tba_time =+  (to_time, from_time) `xpWrap` xpText+  where+    to_time :: String -> Maybe UTCTime+    to_time s+      | s == "TBA" = Nothing+      | otherwise = parseTime defaultTimeLocale xp_time_format s++    from_time :: Maybe UTCTime -> String+    from_time Nothing = ""+    from_time (Just t) = formatTime defaultTimeLocale xp_time_format t   -- | (Un)pickle the \<time_stamp\> element format to/from a 'UTCTime'.
+ src/TSN/XML/AutoRacingSchedule.hs view
@@ -0,0 +1,565 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- | Parse TSN XML for the DTD+--   \"Auto_Racing_Schedule_XML.dtd\". There's a top-level+--   \<message\>, containing \<Listing\>s, containing \<RaceResults\>,+--   containing \<RaceResultsListing\>s.+--+module TSN.XML.AutoRacingSchedule (+  dtd,+  pickle_message,+  -- * Tests+  auto_racing_schedule_tests,+  -- * WARNING: these are private but exported to silence warnings+  AutoRacingScheduleConstructor(..),+  AutoRacingScheduleListingConstructor(..),+  AutoRacingScheduleListingRaceResultRaceResultListingConstructor(..) )+where++-- System imports.+import Control.Monad ( forM_ )+import Data.Time ( UTCTime(..) )+import Data.Tuple.Curry ( uncurryN )+import Database.Groundhog (+  countAll,+  executeRaw,+  migrate,+  runMigration,+  silentMigrationLogger )+import Database.Groundhog.Core ( DefaultKey )+import Database.Groundhog.Generic ( runDbConn )+import Database.Groundhog.Sqlite ( withSqliteConn )+import Database.Groundhog.TH (+  groundhog,+  mkPersist )+import Test.Tasty ( TestTree, testGroup )+import Test.Tasty.HUnit ( (@?=), testCase )+import Text.XML.HXT.Core (+  PU,+  xp7Tuple,+  xp8Tuple,+  xp10Tuple,+  xpElem,+  xpInt,+  xpList,+  xpOption,+  xpText,+  xpWrap )++-- Local imports.+import TSN.Codegen (+  tsn_codegen_config )+import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )+import TSN.Picklers ( xp_date, xp_tba_time, xp_time_stamp )+import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )+import Xml (+  FromXml(..),+  FromXmlFk(..),+  ToDb(..),+  pickle_unpickle,+  unpickleable,+  unsafe_unpickle )+++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "Auto_Racing_Schedule_XML.dtd"++--+-- DB/XML data types+--++-- * AutoRacingSchedule/Message++-- | Database representation of a 'Message'.+--+data AutoRacingSchedule =+  AutoRacingSchedule {+    db_xml_file_id :: Int,+    db_heading :: String,+    db_category :: String,+    db_sport :: String,+    db_title :: String,+    db_complete_through :: String,+    db_time_stamp :: UTCTime }+  deriving (Eq, Show)+++-- | XML Representation of an 'AutoRacingSchedule'.+--+data Message =+  Message {+    xml_xml_file_id :: Int,+    xml_heading :: String,+    xml_category :: String,+    xml_sport :: String,+    xml_title :: String,+    xml_complete_through :: String,+    xml_listings :: [AutoRacingScheduleListingXml],+    xml_time_stamp :: UTCTime }+  deriving (Eq, Show)+++instance ToDb Message where+  -- | The database analogue of a 'Message' is a 'AutoRacingSchedule'.+  --+  type Db Message = AutoRacingSchedule+++-- | The 'FromXml' instance for 'Message' is required for the+--   'XmlImport' instance.+--+instance FromXml Message where+  -- | To convert a 'Message' to an 'AutoRacingSchedule', we just drop+  --   the 'xml_listings'.+  --+  from_xml Message{..} =+    AutoRacingSchedule {+      db_xml_file_id = xml_xml_file_id,+      db_heading = xml_heading,+      db_category = xml_category,+      db_sport = xml_sport,+      db_title = xml_title,+      db_complete_through = xml_complete_through,+      db_time_stamp = xml_time_stamp }+++-- | This allows us to insert the XML representation 'Message'+--   directly.+--+instance XmlImport Message+++-- * AutoRacingScheduleListing/AutoRacingScheduleListingXml++-- | Database representation of a \<Listing\> contained within a+--   \<Message\>. We combine the race date/time into a single+--   race_time, drop the race results list, and add a foreign key to+--   our parent.+--+data AutoRacingScheduleListing =+  AutoRacingScheduleListing {+    db_auto_racing_schedules_id :: DefaultKey AutoRacingSchedule,+    db_race_id :: Int,+    db_race_time :: UTCTime,+    db_race_name :: String,+    db_track_name :: String,+    db_location :: String,+    db_tv_listing :: Maybe String,+    db_laps :: Int,+    db_track_length :: String -- ^ Sometimes the word "miles" shows up.+  }+++-- | XML representation of a \<Listing\> contained within a+--   \<message\>.+--+data AutoRacingScheduleListingXml =+  AutoRacingScheduleListingXml {+    xml_race_id :: Int,+    xml_race_date :: UTCTime,+    xml_race_time :: Maybe UTCTime,+    xml_race_name :: String,+    xml_track_name :: String,+    xml_location :: String,+    xml_tv_listing :: Maybe String,+    xml_laps :: Int,+    xml_track_length :: String, -- ^ Sometimes the word \"miles\" shows up,+                                --   so we can't do the right thing and use+                                --   a 'Double'.+    xml_race_results :: [AutoRacingScheduleListingRaceResult] }+  deriving (Eq, Show)+++-- | Pseudo-accessor to get the race result listings out of a+--   'AutoRacingScheduleListingXml'. A poor man's lens.+--+result_listings :: AutoRacingScheduleListingXml+                -> [AutoRacingScheduleListingRaceResultRaceResultListingXml]+result_listings = (concatMap xml_race_result_listing) . xml_race_results+++instance ToDb AutoRacingScheduleListingXml where+  -- | The database analogue of an 'AutoRacingScheduleListingXml' is+  --   an 'AutoRacingScheduleListing'.+  --+  type Db AutoRacingScheduleListingXml = AutoRacingScheduleListing++instance FromXmlFk AutoRacingScheduleListingXml where+  -- | Each 'AutoRacingScheduleListingXml' is contained in (i.e. has a+  --   foreign key to) a 'AutoRacingSchedule'.+  --+  type Parent AutoRacingScheduleListingXml = AutoRacingSchedule++  -- | To convert an 'AutoRacingScheduleListingXml' to an+  --   'AutoRacingScheduleListing', we add the foreign key and drop+  --   the 'xml_race_results'. We also mash the date/time together+  --   into one field.+  --+  from_xml_fk fk AutoRacingScheduleListingXml{..} =+    AutoRacingScheduleListing {+      db_auto_racing_schedules_id = fk,+      db_race_id = xml_race_id,+      db_race_time = make_race_time xml_race_date xml_race_time,+      db_race_name = xml_race_name,+      db_track_name = xml_track_name,+      db_location = xml_location,+      db_tv_listing = xml_tv_listing,+      db_laps = xml_laps,+      db_track_length = xml_track_length }+    where+      -- | Make the database \"race time\" from the XML+      --   date/time. Simply take the day part from one and the time+      --   from the other.+      --+      make_race_time d Nothing = d+      make_race_time d (Just t) = UTCTime (utctDay d) (utctDayTime t)+++-- | This allows us to insert the XML representation+--   'AutoRacingScheduleListingXml' directly.+--+instance XmlImportFk AutoRacingScheduleListingXml++++-- * AutoRacingScheduleListingRaceResult++-- | The XML representation of \<message\> -> \<Listing\> ->+--   \<RaceResults\>. This element serves only to contain+--   \<RaceResultsListing\>s, so we don't store the intermediate table+--   in the database.+--+newtype AutoRacingScheduleListingRaceResult =+  AutoRacingScheduleListingRaceResult {+    xml_race_result_listing ::+      [AutoRacingScheduleListingRaceResultRaceResultListingXml] }+  deriving (Eq, Show)+++-- * AutoRacingScheduleListingRaceResultRaceResultListing /+--   AutoRacingScheduleListingRaceResultRaceResultListingXml+--+--   Sorry about the names yo.+--++-- | Database representation of \<RaceResultListing\> within+--   \<RaceResults\> within \<Listing\> within... \<message\>!+--+data AutoRacingScheduleListingRaceResultRaceResultListing =+  AutoRacingScheduleListingRaceResultRaceResultListing {+    db_auto_racing_schedules_listings_id ::+      DefaultKey AutoRacingScheduleListing,+    db_finish_position :: Int,+    db_driver_id :: Int,+    db_name :: String,+    db_leading_laps :: Int,+    db_listing_laps :: Int, -- ^ Avoid clash with race's \"laps\" field.+    db_earnings :: String,  -- ^ This should be an Int, but can have commas.+    db_status :: String }+++-- | XML Representation of an+--   'AutoRacingScheduleListingRaceResultRaceResultListing'.+--+data AutoRacingScheduleListingRaceResultRaceResultListingXml =+  AutoRacingScheduleListingRaceResultRaceResultListingXml {+    xml_finish_position :: Int,+    xml_driver_id :: Int,+    xml_name :: String,+    xml_leading_laps :: Int,+    xml_listing_laps :: Int, -- ^ Avoid clash with race's \"laps\" field.+    xml_earnings :: String,  -- ^ Should be an 'Int', but can have commas.+    xml_status :: String }+  deriving (Eq, Show)+++instance ToDb AutoRacingScheduleListingRaceResultRaceResultListingXml where+  -- | The database representation of an+  --   'AutoRacingScheduleListingRaceResultRaceResultListingXml' is an+  --   'AutoRacingScheduleListingRaceResultRaceResultListing'.+  --+  type Db AutoRacingScheduleListingRaceResultRaceResultListingXml =+    AutoRacingScheduleListingRaceResultRaceResultListing+++instance FromXmlFk AutoRacingScheduleListingRaceResultRaceResultListingXml where+  -- | Each 'AutoRacingScheduleListingRaceResultRaceResultListingXml'+  --   is contained in (i.e. has a foreign key to) an+  --   'AutoRacingScheduleListing'. We skip the intermediate+  --   \<RaceResults\>.+  --+  type Parent AutoRacingScheduleListingRaceResultRaceResultListingXml =+    AutoRacingScheduleListing++  -- | To convert an+  --   'AutoRacingScheduleListingRaceResultRaceResultListingXml' to an+  --   'AutoRacingScheduleListingRaceResultRaceResultListing', we just+  --   add the foreign key to the parent 'AutoRacingScheduleListing'.+  --+  from_xml_fk fk AutoRacingScheduleListingRaceResultRaceResultListingXml{..} =+    AutoRacingScheduleListingRaceResultRaceResultListing {+      db_auto_racing_schedules_listings_id = fk,+      db_finish_position = xml_finish_position,+      db_driver_id = xml_driver_id,+      db_name = xml_name,+      db_leading_laps = xml_leading_laps,+      db_listing_laps = xml_listing_laps,+      db_earnings = xml_earnings,+      db_status = xml_earnings }+++-- | This allows us to insert the XML representation+--   'AutoRacingScheduleListingRaceResultRaceResultListingXml'+--   directly.+--+instance XmlImportFk AutoRacingScheduleListingRaceResultRaceResultListingXml+++---+--- Database stuff.+---++instance DbImport Message where+  dbmigrate _ =+    run_dbmigrate $ do+      migrate (undefined :: AutoRacingSchedule)+      migrate (undefined :: AutoRacingScheduleListing)+      migrate (undefined+                 :: AutoRacingScheduleListingRaceResultRaceResultListing)+++  -- | We insert the message, then use its ID to insert the listings,+  --   using their IDs to insert the race result listings.+  --+  dbimport m = do+    msg_id <- insert_xml m++    forM_ (xml_listings m) $ \listing -> do+      listing_id <- insert_xml_fk msg_id listing++      mapM_ (insert_xml_fk_ listing_id) (result_listings listing)++    return ImportSucceeded+++mkPersist tsn_codegen_config [groundhog|+- entity: AutoRacingSchedule+  dbName: auto_racing_schedules+  constructors:+    - name: AutoRacingSchedule+      uniques:+        - name: unique_auto_racing_schedule+          type: constraint+          # Prevent multiple imports of the same message.+          fields: [db_xml_file_id]++- entity: AutoRacingScheduleListing+  dbName: auto_racing_schedules_listings+  constructors:+    - name: AutoRacingScheduleListing+      fields:+        - name: db_auto_racing_schedules_id+          reference:+            onDelete: cascade++- entity: AutoRacingScheduleListingRaceResultRaceResultListing+  dbName: auto_racing_schedules_listings_race_result_listings+  constructors:+    - name: AutoRacingScheduleListingRaceResultRaceResultListing+      fields:+        - name: db_auto_racing_schedules_listings_id+          reference:+            onDelete: cascade+|]++++---+--- Pickling+---++-- | Pickler for the top-level 'Message'.+--+pickle_message :: PU Message+pickle_message =+  xpElem "message" $+    xpWrap (from_tuple, to_tuple) $+    xp8Tuple (xpElem "XML_File_ID" xpInt)+             (xpElem "heading" xpText)+             (xpElem "category" xpText)+             (xpElem "sport" xpText)+             (xpElem "Title" xpText)+             (xpElem "Complete_Through" xpText)+             (xpList pickle_listing)+             (xpElem "time_stamp" xp_time_stamp)+  where+    from_tuple = uncurryN Message+    to_tuple m = (xml_xml_file_id m,+                  xml_heading m,+                  xml_category m,+                  xml_sport m,+                  xml_title m,+                  xml_complete_through m,+                  xml_listings m,+                  xml_time_stamp m)+++-- | Convert an 'AutoRacingScheduleListingXml' to/from XML.+--+pickle_listing :: PU AutoRacingScheduleListingXml+pickle_listing =+  xpElem "Listing" $+    xpWrap (from_tuple, to_tuple) $+      xp10Tuple (xpElem "RaceID" xpInt)+                (xpElem "Race_Date" xp_date)+                (xpElem "Race_Time" xp_tba_time)+                (xpElem "RaceName" xpText)+                (xpElem "TrackName" xpText)+                (xpElem "Location" xpText)+                (xpElem "TV_Listing" $ xpOption xpText)+                (xpElem "Laps" xpInt)+                (xpElem "TrackLength" xpText)+                (xpList pickle_race_results)+  where+    from_tuple = uncurryN AutoRacingScheduleListingXml+    to_tuple m = (xml_race_id m,+                  xml_race_date m,+                  xml_race_time m,+                  xml_race_name m,+                  xml_track_name m,+                  xml_location m,+                  xml_tv_listing m,+                  xml_laps m,+                  xml_track_length m,+                  xml_race_results m)+++-- | Convert an 'AutoRacingScheduleListingRaceResult' to/from XML.+--+pickle_race_results :: PU AutoRacingScheduleListingRaceResult+pickle_race_results =+  xpElem "RaceResults" $+    xpWrap (to_result, from_result) $+      xpList pickle_race_results_listing+  where+    to_result = AutoRacingScheduleListingRaceResult+    from_result = xml_race_result_listing+++-- | Convert an+--   'AutoRacingScheduleListingRaceResultRaceResultListingXml' to/from+--   XML.+--+pickle_race_results_listing ::+  PU AutoRacingScheduleListingRaceResultRaceResultListingXml+pickle_race_results_listing =+  xpElem "RaceResultsListing" $+    xpWrap (from_tuple, to_tuple) $+      xp7Tuple (xpElem "FinishPosition" xpInt)+               (xpElem "DriverID" xpInt)+               (xpElem "Name" xpText)+               (xpElem "LeadingLaps" xpInt)+               (xpElem "Laps" xpInt)+               (xpElem "Earnings" xpText)+               (xpElem "Status" xpText)+  where+    from_tuple =+      uncurryN AutoRacingScheduleListingRaceResultRaceResultListingXml++    to_tuple m = (xml_finish_position m,+                  xml_driver_id m,+                  xml_name m,+                  xml_leading_laps m,+                  xml_listing_laps m,+                  xml_earnings m,+                  xml_status m)+++--+-- Tasty Tests+--++-- | A list of all tests for this module.+--+auto_racing_schedule_tests :: TestTree+auto_racing_schedule_tests =+  testGroup+    "AutoRacingSchedule tests"+    [ test_on_delete_cascade,+      test_pickle_of_unpickle_is_identity,+      test_unpickle_succeeds ]++-- | If we unpickle something and then pickle it, we should wind up+--   with the same thing we started with. WARNING: success of this+--   test does not mean that unpickling succeeded.+--+test_pickle_of_unpickle_is_identity :: TestTree+test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests"+  [ check "pickle composed with unpickle is the identity"+          "test/xml/Auto_Racing_Schedule_XML.xml",++    check "pickle composed with unpickle is the identity (miles track length)"+          "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+  where+    check desc path = testCase desc $ do+      (expected, actual) <- pickle_unpickle pickle_message path+      actual @?= expected+++-- | Make sure we can actually unpickle these things.+--+test_unpickle_succeeds :: TestTree+test_unpickle_succeeds = testGroup "unpickle tests"+  [ check "unpickling succeeds"+          "test/xml/Auto_Racing_Schedule_XML.xml",++    check "unpickling succeeds (non-int team_id)"+          "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+  where+    check desc path = testCase desc $ do+      actual <- unpickleable path pickle_message+      let expected = True+      actual @?= expected+++-- | Make sure everything gets deleted when we delete the top-level+--   record.+--+test_on_delete_cascade :: TestTree+test_on_delete_cascade = testGroup "cascading delete tests"+    [ check "deleting auto_racing_schedules deletes its children"+          "test/xml/Auto_Racing_Schedule_XML.xml" ,++    check ("deleting auto_racing_schedules deletes its children " +++            "(miles track length)")+          "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+  where+    check desc path = testCase desc $ do+      sched <- unsafe_unpickle path pickle_message+      let a = undefined :: AutoRacingSchedule+      let b = undefined :: AutoRacingScheduleListing+      let c = undefined :: AutoRacingScheduleListingRaceResultRaceResultListing++      actual <- withSqliteConn ":memory:" $ runDbConn $ do+                  runMigration silentMigrationLogger $ do+                    migrate a+                    migrate b+                    migrate c+                  _ <- dbimport sched+                  -- No idea how 'delete' works, so do this instead.+                  executeRaw False "DELETE FROM auto_racing_schedules;" []+                  count_a <- countAll a+                  count_b <- countAll b+                  count_c <- countAll c+                  return $ sum [count_a, count_b, count_c]+      let expected = 0+      actual @?= expected
src/TSN/XML/Heartbeat.hs view
@@ -3,6 +3,7 @@ -- | Handle documents defined by Heartbeat.dtd. -- module TSN.XML.Heartbeat (+  dtd,   verify,   -- * Tests   heartbeat_tests )@@ -26,6 +27,11 @@ import TSN.DbImport ( ImportResult(..) ) import Xml ( pickle_unpickle, unpickleable ) ++-- | The DTD to which this module corresponds.+--+dtd :: String+dtd = "Heartbeat.dtd"  -- | The data structure that holds the XML representation of a --   Heartbeat message.
src/TSN/XML/Injuries.hs view
@@ -17,6 +17,7 @@ --   time_stamp. -- module TSN.XML.Injuries (+  dtd,   pickle_message,   -- * Tests   injuries_tests,@@ -71,6 +72,12 @@   unpickleable,   unsafe_unpickle ) +++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "injuriesxml.dtd"  -- -- DB/XML Data types
src/TSN/XML/InjuriesDetail.hs view
@@ -13,6 +13,7 @@ --   real meat. -- module TSN.XML.InjuriesDetail (+  dtd,   pickle_message,   -- * Tests   injuries_detail_tests,@@ -65,6 +66,13 @@   pickle_unpickle,   unpickleable,   unsafe_unpickle )++++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "Injuries_Detail_XML.dtd"   --
src/TSN/XML/News.hs view
@@ -11,6 +11,7 @@ --   a root element \<message\> that contains an entire news item. -- module TSN.XML.News (+  dtd,   pickle_message,   -- * Tests   news_tests,@@ -73,7 +74,13 @@   unsafe_unpickle )  +-- | The DTD to which this module corresponds. Used to invoke dbimport. --+dtd :: String+dtd = "newsxml.dtd"+++-- -- DB/XML Data types -- @@ -272,7 +279,6 @@ -- use our own codegen to peel those off before naming the columns. mkPersist tsn_codegen_config [groundhog| - entity: News-  dbName: news   constructors:     - name: News       uniques:
src/TSN/XML/Odds.hs view
@@ -12,6 +12,7 @@ --   other... disorganized... information. -- module TSN.XML.Odds (+  dtd,   pickle_message,   -- * Tests   odds_tests,@@ -77,7 +78,13 @@   unsafe_unpickle )  +-- | The DTD to which this module corresponds. Used to invoke dbimport. --+dtd :: String+dtd = "Odds_XML.dtd"+++-- -- DB/XML data types -- @@ -793,12 +800,12 @@ -- test_on_delete_cascade :: TestTree test_on_delete_cascade = testGroup "cascading delete tests"-    [ check "deleting odds deleted its children"+    [ check "deleting odds deletes its children"           "test/xml/Odds_XML.xml"           13 -- 5 casinos, 8 teams     , -    check "deleting odds deleted its children (non-int team_id)"+    check "deleting odds deletes its children (non-int team_id)"           "test/xml/Odds_XML-noninteger-team-id.xml"           51 -- 5 casinos, 46 teams     ,
+ src/TSN/XML/Scores.hs view
@@ -0,0 +1,630 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- | Parse TSN XML for the DTD \"scoresxml.dtd\". Each document+--   contains a single \<game\> and some \<location\>s.+--+module TSN.XML.Scores (+  dtd,+  pickle_message,+  -- * Tests+  scores_tests,+  -- * WARNING: these are private but exported to silence warnings+  Score_ScoreLocationConstructor(..),+  ScoreConstructor(..),+  ScoreGameConstructor(..),+  ScoreGameTeamConstructor(..),+  ScoreLocationConstructor(..),+  ScoreGame_ScoreGameTeamConstructor(..) )+where++-- System imports.+import Data.Data ( Data )+import Data.Time ( UTCTime )+import Data.Tuple.Curry ( uncurryN )+import Data.Typeable ( Typeable )+import Database.Groundhog (+  countAll,+  executeRaw,+  insert,+  insert_,+  migrate,+  runMigration,+  silentMigrationLogger )+import Database.Groundhog.Core ( DefaultKey )+import Database.Groundhog.Generic ( runDbConn )+import Database.Groundhog.Sqlite ( withSqliteConn )+import Database.Groundhog.TH (+  defaultCodegenConfig,+  groundhog,+  mkPersist )+import Test.Tasty ( TestTree, testGroup )+import Test.Tasty.HUnit ( (@?=), testCase )+import Text.XML.HXT.Core (+  PU,+  xp7Tuple,+  xp11Tuple,+  xpAttr,+  xpElem,+  xpInt,+  xpList,+  xpOption,+  xpPair,+  xpPrim,+  xpText,+  xpTriple,+  xpWrap )++-- Local imports.+import TSN.Codegen (+  tsn_codegen_config )+import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )+import TSN.Picklers ( xp_time_stamp )+import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )+import Xml (+  FromXml(..),+  FromXmlFk(..),+  ToDb(..),+  pickle_unpickle,+  unpickleable,+  unsafe_unpickle )+++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "scoresxml.dtd"+++---+--- DB/XML Data types+---+++-- * Score / Message++-- | Database representation of a 'Message'. It lacks the+--   'xml_locations' and 'xml_game' which are related via foreign keys+--   instead.+--+data Score =+  Score {+    db_xml_file_id :: Int,+    db_heading :: String,+    db_game_id :: Int,+    db_schedule_id :: Int,+    db_tsnupdate :: Maybe Bool,+    db_category :: String,+    db_sport :: String,+    db_season_type :: String,+    db_time_stamp :: UTCTime }+++-- | XML representation of the top level \<message\> element (i.e. a+--   'Score').+--+data Message =+  Message {+    xml_xml_file_id :: Int,+    xml_heading :: String,+    xml_game_id :: Int,+    xml_schedule_id :: Int,+    xml_tsnupdate :: Maybe Bool,+    xml_category :: String,+    xml_sport :: String,+    xml_locations :: [ScoreLocation],+    xml_season_type :: String,+    xml_game :: ScoreGameXml,+    xml_time_stamp :: UTCTime }+  deriving (Eq, Show)++instance ToDb Message where+  -- | The database representation of a 'Message' is a 'Score'.+  type Db Message = Score++instance FromXml Message where+  from_xml Message{..} =+    Score {+      db_xml_file_id = xml_xml_file_id,+      db_heading = xml_heading,+      db_game_id = xml_game_id,+      db_schedule_id = xml_schedule_id,+      db_tsnupdate = xml_tsnupdate,+      db_category = xml_category,+      db_sport = xml_sport,+      db_season_type = xml_season_type,+      db_time_stamp = xml_time_stamp }+++-- | This lets us insert the XML representation 'Message' directly.+--+instance XmlImport Message+++-- * ScoreGame / ScoreGameXml++-- | This is an embedded field within 'SportsGame'. Each \<status\>+--   element has two attributes, a numeral and a type. It also+--   contains some text. Rather than put these in their own table, we+--   include them in the parent 'SportsGame'.+--+data ScoreGameStatus =+  ScoreGameStatus {+    db_status_numeral :: Int,+    db_status_type :: String, -- ^ These are probably only one-character long,+                              --   but they all take the same amount of space+                              --   in Postgres.+    db_status_text :: String }+  deriving (Data, Eq, Show, Typeable)+++-- | Database representation of a game.+--+data ScoreGame =+  ScoreGame {+    db_scores_id :: DefaultKey Score,+    db_vscore :: Int,+    db_hscore :: Int,+    db_time_r :: Maybe String, -- ^ Time remaining, the format is uncertain.+    db_status :: ScoreGameStatus,+    db_notes  :: Maybe String }+++-- | XML representation of a \<game\> element (i.e. a 'ScoreGame').+--+data ScoreGameXml =+  ScoreGameXml {+    xml_vteam  :: ScoreGameVTeam,+    xml_hteam  :: ScoreGameHTeam,+    xml_vscore :: Int,+    xml_hscore :: Int,+    xml_time_r :: Maybe String, -- ^ Time remaining, the format is uncertain.+    xml_status :: ScoreGameStatus,+    xml_notes  :: Maybe String }+  deriving (Eq, Show)++-- | Pseudo-accessor to get the 'ScoreGameTeam' out of 'xml_vteam'.+vteam :: ScoreGameXml -> ScoreGameTeam+vteam g = let (ScoreGameVTeam t) = xml_vteam g in t++-- | Pseudo-accessor to get the 'ScoreGameTeam' out of 'xml_hteam'.+hteam :: ScoreGameXml -> ScoreGameTeam+hteam g = let (ScoreGameHTeam t) = xml_hteam g in t++instance ToDb ScoreGameXml where+  -- | The database representation of a 'ScoreGameXml' is a+  --   'ScoreGame'.+  --+  type Db ScoreGameXml = ScoreGame++instance FromXmlFk ScoreGameXml where+  -- | Each 'ScoreGameXml' is contained in (i.e. has a foreign key to)+  --   a 'Score'.+  --+  type Parent ScoreGameXml = Score++  from_xml_fk fk ScoreGameXml{..} =+    ScoreGame {+      db_scores_id = fk,+      db_vscore = xml_vscore,+      db_hscore = xml_hscore,+      db_time_r = xml_time_r,+      db_status = xml_status,+      db_notes = xml_notes }++-- | This lets us import the database representation 'ScoreGameXml'+--   directly.+--+instance XmlImportFk ScoreGameXml+++-- * ScoreGameTeam++-- | A team that appears in a 'ScoreGame'. This is meant to represent+--   both home and away teams.+--+data ScoreGameTeam =+  ScoreGameTeam {+    team_id :: String,+    team_name :: String }+  deriving (Eq, Show)++-- | A wrapper around 'ScoreGameTeam' that lets us distinguish between+--   home and away teams. See also 'ScoreGameHTeam'.+--+newtype ScoreGameVTeam =+  ScoreGameVTeam ScoreGameTeam+  deriving (Eq, Show)+++-- | A wrapper around 'ScoreGameTeam' that lets us distinguish between+--   home and away teams. See also 'ScoreGameVTeam'.+--+newtype ScoreGameHTeam =+  ScoreGameHTeam ScoreGameTeam+  deriving (Eq, Show)+++-- * ScoreGame_ScoreGameTeam++-- | Join a 'ScoreGame' with its home/away teams. Database-only. We+--   use a join table because the teams are kept unique.+--+data ScoreGame_ScoreGameTeam =+  ScoreGame_ScoreGameTeam+    (DefaultKey ScoreGame) -- ^ game id+    (DefaultKey ScoreGameTeam) -- ^ vteam id+    (DefaultKey ScoreGameTeam) -- ^ hteam id+++-- * ScoreLocation++-- | Database and XML representation of a \<location\>. This is almost+--   identical to 'TSN.XML.NewsLocation', but the city/state have not+--   appeared optional here so far.+--+data ScoreLocation =+  ScoreLocation {+    city :: String,+    state :: String,+    country :: String }+  deriving (Eq, Show)+++-- * Score_ScoreLocation++-- | Join each 'Score' with its 'ScoreLocation's. Database-only. We+--   use a join table because the locations are kept unique.+--+data Score_ScoreLocation =+  Score_ScoreLocation+    (DefaultKey Score)+    (DefaultKey ScoreLocation)++++instance DbImport Message where+  dbmigrate _ =+    run_dbmigrate $ do+      migrate (undefined :: Score)+      migrate (undefined :: ScoreGame)+      migrate (undefined :: ScoreGameTeam)+      migrate (undefined :: ScoreGame_ScoreGameTeam)+      migrate (undefined :: ScoreLocation)+      migrate (undefined :: Score_ScoreLocation)++  dbimport m = do+    -- Insert the message and get its ID.+    msg_id <- insert_xml m++    -- Insert all of the locations contained within this message and+    -- collect their IDs in a list.+    location_ids <- mapM insert (xml_locations m)++    -- Now use that list to construct 'Score_ScoreLocation' objects,+    -- and insert them.+    mapM_ (insert_ . Score_ScoreLocation msg_id) location_ids++    -- Insert the game and its hteam/vteam, noting the IDs.+    game_id <- insert_xml_fk msg_id (xml_game m)+    vteam_id <- insert (vteam $ xml_game m)+    hteam_id <- insert (hteam $ xml_game m)++    -- Finally add a 'ScoreGame_ScoreGameTeam' mapping the+    -- aforementioned game to its hteam/vteam.+    insert_ $ ScoreGame_ScoreGameTeam game_id vteam_id hteam_id++    return ImportSucceeded+++-- These types don't have special XML representations or field name+-- collisions so we use the defaultCodegenConfig and give their+-- fields nice simple names.+mkPersist defaultCodegenConfig [groundhog|+- entity: ScoreGameTeam+  dbName: scores_games_teams+  constructors:+    - name: ScoreGameTeam+      uniques:+        - name: unique_scores_games_team+          type: constraint+          fields: [team_id]++- entity: ScoreLocation+  dbName: scores_locations+  constructors:+    - name: ScoreLocation+      uniques:+        - name: unique_scores_location+          type: constraint+          fields: [city, state, country]++|]++++-- These types have fields with e.g. db_ and xml_ prefixes, so we+-- use our own codegen to peel those off before naming the columns.+mkPersist tsn_codegen_config [groundhog|+- entity: Score+  dbName: scores+  constructors:+    - name: Score+      uniques:+        - name: unique_scores+          type: constraint+          # Prevent multiple imports of the same message.+          fields: [db_xml_file_id]++- embedded: ScoreGameStatus+  fields:+    - name: db_status_numeral+      dbName: status_numeral+    - name: db_status_type+      dbName: status_type+    - name: db_status_text+      dbName: status_text++- entity: ScoreGame+  dbName: scores_games+  constructors:+    - name: ScoreGame+      fields:+        - name: db_scores_id+          reference:+            onDelete: cascade+        - name: db_status+          embeddedType:+            - { name: status_numeral, dbName: status_numeral }+            - { name: status_type, dbName: status_type }+            - { name: status_text, dbName: status_text }++- entity: ScoreGame_ScoreGameTeam+  dbName: scores_games__scores_games_teams+  constructors:+    - name: ScoreGame_ScoreGameTeam+      fields:+        - name: scoreGame_ScoreGameTeam0 # Default created by mkNormalFieldName+          dbName: scores_games_id+          reference:+            onDelete: cascade+        - name: scoreGame_ScoreGameTeam1 # Default created by mkNormalFieldName+          dbName: scores_games_teams_vteam_id+          reference:+            onDelete: cascade+        - name: scoreGame_ScoreGameTeam2 # Default created by mkNormalFieldName+          dbName: scores_games_teams_hteam_id+          reference:+            onDelete: cascade++- entity: Score_ScoreLocation+  dbName: scores__scores_locations+  constructors:+    - name: Score_ScoreLocation+      fields:+        - name: score_ScoreLocation0 # Default created by mkNormalFieldName+          dbName: scores_id+          reference:+            onDelete: cascade+        - name: score_ScoreLocation1 # Default created by mkNormalFieldName+          dbName: scores_locations_id+          reference:+            onDelete: cascade+|]+++--+-- Pickling+--++-- | Convert a 'Message' to/from \<message\>.+--+pickle_message :: PU Message+pickle_message =+  xpElem "message" $+    xpWrap (from_tuple, to_tuple) $+    xp11Tuple (xpElem "XML_File_ID" xpInt)+              (xpElem "heading" xpText)+              (xpElem "game_id" xpInt)+              (xpElem "schedule_id" xpInt)+              (xpOption $ xpElem "tsnupdate" xpPrim)+              (xpElem "category" xpText)+              (xpElem "sport" xpText)+              (xpList pickle_location)+              (xpElem "seasontype" xpText)+              pickle_game+              (xpElem "time_stamp" xp_time_stamp)+  where+    from_tuple = uncurryN Message+    to_tuple m = (xml_xml_file_id m,+                  xml_heading m,+                  xml_game_id m,+                  xml_schedule_id m,+                  xml_tsnupdate m,+                  xml_category m,+                  xml_sport m,+                  xml_locations m,+                  xml_season_type m,+                  xml_game m,+                  xml_time_stamp m)++++-- | Convert a 'ScoreLocation' to/from \<location\>.+--+pickle_location :: PU ScoreLocation+pickle_location =+  xpElem "location" $+    xpWrap (from_tuple, to_tuple) $+    xpTriple (xpElem "city" xpText)+             (xpElem "state" xpText)+             (xpElem "country" xpText)+  where+    from_tuple =+      uncurryN ScoreLocation+    to_tuple l = (city l, state l, country l)+++-- | Convert a 'ScoreGameStatus' to/from \<status\>.+--+pickle_status :: PU ScoreGameStatus+pickle_status =+  xpElem "status" $+    xpWrap (from_tuple, to_tuple) $+      xpTriple (xpAttr "numeral" xpInt)+               (xpAttr "type" xpText)+               xpText+  where+    from_tuple = uncurryN ScoreGameStatus+    to_tuple ScoreGameStatus{..} = (db_status_numeral,+                                    db_status_type,+                                    db_status_text)+++-- | Convert a 'ScoreGameXml' to/from \<game\>.+--+pickle_game :: PU ScoreGameXml+pickle_game =+  xpElem "game" $+    xpWrap (from_tuple, to_tuple) $+      xp7Tuple pickle_vteam+               pickle_hteam+               (xpElem "vscore" xpInt)+               (xpElem "hscore" xpInt)+               (xpOption $ xpElem "time_r" xpText)+               pickle_status+               (xpOption $ xpElem "notes" xpText)+  where+    from_tuple = uncurryN ScoreGameXml+    to_tuple ScoreGameXml{..} = (xml_vteam,+                                 xml_hteam,+                                 xml_vscore,+                                 xml_hscore,+                                 xml_time_r,+                                 xml_status,+                                 xml_notes)+++-- | Convert a 'ScoreGameVTeam' to/from \<vteam\>.+--+pickle_vteam :: PU ScoreGameVTeam+pickle_vteam =+  xpElem "vteam" $+    xpWrap (from_tuple, to_tuple) $+      xpPair (xpAttr "id" xpText)+             xpText+  where+    from_tuple = ScoreGameVTeam . uncurry ScoreGameTeam+    to_tuple (ScoreGameVTeam ScoreGameTeam{..}) = (team_id, team_name)+++-- | Convert a 'ScoreGameVTeam' to/from \<hteam\>. Identical to+--   'pickle_vteam' modulo the \"h\" and \"v\".+--+pickle_hteam :: PU ScoreGameHTeam+pickle_hteam =+  xpElem "hteam" $+    xpWrap (from_tuple, to_tuple) $+      xpPair (xpAttr "id" xpText)+             xpText+  where+    from_tuple = ScoreGameHTeam  . uncurry ScoreGameTeam+    to_tuple (ScoreGameHTeam ScoreGameTeam{..}) = (team_id, team_name)++++---+--- Tasty tests+---++-- | A list of all tests for this module.+--+scores_tests :: TestTree+scores_tests =+  testGroup+    "Scores tests"+    [ test_on_delete_cascade,+      test_pickle_of_unpickle_is_identity,+      test_unpickle_succeeds ]+++-- | If we unpickle something and then pickle it, we should wind up+--   with the same thing we started with. WARNING: success of this+--   test does not mean that unpickling succeeded.+--+test_pickle_of_unpickle_is_identity :: TestTree+test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests"+  [ check "pickle composed with unpickle is the identity"+          "test/xml/scoresxml.xml",++    check "pickle composed with unpickle is the identity (no locations)"+          "test/xml/scoresxml-no-locations.xml" ]+  where+    check desc path = testCase desc $ do+      (expected, actual) <- pickle_unpickle pickle_message path+      actual @?= expected+++-- | Make sure we can actually unpickle these things.+--+test_unpickle_succeeds :: TestTree+test_unpickle_succeeds = testGroup "unpickle tests"+  [ check "unpickling succeeds"+          "test/xml/scoresxml.xml",++    check "unpickling succeeds (no locations)"+          "test/xml/scoresxml-no-locations.xml" ]+  where+    check desc path = testCase desc $ do+      actual <- unpickleable path pickle_message+      let expected = True+      actual @?= expected+++-- | Make sure everything gets deleted when we delete the top-level+--   record.+--+test_on_delete_cascade :: TestTree+test_on_delete_cascade = testGroup "cascading delete tests"+  [ check "unpickling succeeds"+          "test/xml/scoresxml.xml"+          4, -- 2 teams, 2 locations++    check "unpickling succeeds (no locations)"+          "test/xml/scoresxml-no-locations.xml"+          2 -- 2 teams, 0 locations+  ]+  where+    check desc path expected = testCase desc $ do+      score <- unsafe_unpickle path pickle_message+      let a = undefined :: Score+      let b = undefined :: ScoreGame+      let c = undefined :: ScoreGameTeam+      let d = undefined :: ScoreGame_ScoreGameTeam+      let e = undefined :: ScoreLocation+      let f = undefined :: Score_ScoreLocation+      actual <- withSqliteConn ":memory:" $ runDbConn $ do+                  runMigration silentMigrationLogger $ do+                    migrate a+                    migrate b+                    migrate c+                    migrate d+                    migrate e+                    migrate f+                  _ <- dbimport score+                  -- No idea how 'delete' works, so do this instead.+                  executeRaw False "DELETE FROM scores;" []+                  count_a <- countAll a+                  count_b <- countAll b+                  count_c <- countAll c+                  count_d <- countAll d+                  count_e <- countAll e+                  count_f <- countAll f+                  return $ sum [count_a, count_b, count_c,+                                count_d, count_e, count_f ]+      actual @?= expected
src/TSN/XML/Weather.hs view
@@ -10,6 +10,7 @@ --   that league contains a bunch of listings. -- module TSN.XML.Weather (+  dtd,   pickle_message,   -- * Tests   weather_tests,@@ -62,6 +63,13 @@   pickle_unpickle,   unpickleable,   unsafe_unpickle )++++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "weatherxml.dtd"   --
test/TestSuite.hs view
@@ -1,20 +1,24 @@ import Test.Tasty ( TestTree, defaultMain, testGroup ) +import TSN.XML.AutoRacingSchedule ( auto_racing_schedule_tests ) import TSN.XML.Heartbeat ( heartbeat_tests ) import TSN.XML.Injuries ( injuries_tests ) import TSN.XML.InjuriesDetail ( injuries_detail_tests ) import TSN.XML.News ( news_tests ) import TSN.XML.Odds ( odds_tests )+import TSN.XML.Scores ( scores_tests ) import TSN.XML.Weather ( weather_tests )  tests :: TestTree tests = testGroup           "All tests"-          [ heartbeat_tests,+          [ auto_racing_schedule_tests,+            heartbeat_tests,             injuries_tests,             injuries_detail_tests,             news_tests,             odds_tests,+            scores_tests,             weather_tests ]  main :: IO ()
test/shell/import-duplicates.test view
@@ -15,15 +15,15 @@ # Heartbeat.xml that doesn't really count. find ./test/xml -name '*.xml' | wc -l >>>-12+16 >>>= 0  # Run the imports again; we should get complaints about the duplicate-# xml_file_ids. There are 2 errors for each violation, so we expect 2*11+# xml_file_ids. There are 2 errors for each violation, so we expect 2*15 # occurrences of the string 'ERROR'. ./dist/build/htsn-import/htsn-import -c 'shelltest.sqlite3' test/xml/*.xml 2>&1 | grep ERROR | wc -l >>>-22+30 >>>= 0  # Finally, clean up after ourselves.
+ test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd">
<message>
<XML_File_ID>20136765</XML_File_ID>
<heading>ATX%SCHEDULE</heading>
<category>Statistics</category>
<sport>NASCAR-T</sport>
<Title>2014 Camping World Series Schedule</Title>
<Complete_Through>Complete through </Complete_Through>
<Listing>
<RaceID>1739</RaceID>
<Race_Date>02/21/2014</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>NextEra Energy Resources 250</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>100</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1740</RaceID>
<Race_Date>03/29/2014</Race_Date>
<Race_Time>01:30 PM</Race_Time>
<RaceName>Kroger 250</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Martinsville, VA</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>250</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1741</RaceID>
<Race_Date>05/09/2014</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>SFP 250</RaceName>
<TrackName>Kansas Speedway</TrackName>
<Location>Kansas City, KS</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>167</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1742</RaceID>
<Race_Date>05/16/2014</Race_Date>
<Race_Time>08:00 PM</Race_Time>
<RaceName>North Carolina Education Lottery 200</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>134</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1743</RaceID>
<Race_Date>05/30/2014</Race_Date>
<Race_Time>05:00 PM</Race_Time>
<RaceName>Lucas Oil 200</RaceName>
<TrackName>Dover International Speedway</TrackName>
<Location>Dover, DE</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>200</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1744</RaceID>
<Race_Date>06/06/2014</Race_Date>
<Race_Time>09:00 PM</Race_Time>
<RaceName>WinStar World Casino 400</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>167</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1759</RaceID>
<Race_Date>06/14/2014</Race_Date>
<Race_Time>09:00 PM</Race_Time>
<RaceName>Gateway 200</RaceName>
<TrackName>Gateway Motorsports Park</TrackName>
<Location>Madison, IL</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>160</Laps>
<TrackLength>1.25 miles</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1745</RaceID>
<Race_Date>06/26/2014</Race_Date>
<Race_Time>08:00 PM</Race_Time>
<RaceName>UNOH 225</RaceName>
<TrackName>Kentucky Speedway</TrackName>
<Location>Sparta, KY</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>150</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1746</RaceID>
<Race_Date>07/11/2014</Race_Date>
<Race_Time>08:30 PM</Race_Time>
<RaceName>American Ethanol 200</RaceName>
<TrackName>Iowa Speedway</TrackName>
<Location>Newton, IA</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>200</Laps>
<TrackLength>0.875</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1747</RaceID>
<Race_Date>07/23/2014</Race_Date>
<Race_Time>09:35 PM</Race_Time>
<RaceName>Mudsummer Classic</RaceName>
<TrackName>Eldora Speedway</TrackName>
<Location>Rossburg, OH</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>153</Laps>
<TrackLength>0.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1748</RaceID>
<Race_Date>08/02/2014</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Pocono Mountains 125</RaceName>
<TrackName>Pocono Raceway</TrackName>
<Location>Long Pond, PA</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>54</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1749</RaceID>
<Race_Date>08/16/2014</Race_Date>
<Race_Time>12:30 PM</Race_Time>
<RaceName>Michigan National Guard 200</RaceName>
<TrackName>Michigan International Speedway</TrackName>
<Location>Brooklyn, MI</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>100</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1750</RaceID>
<Race_Date>08/20/2014</Race_Date>
<Race_Time>08:00 PM</Race_Time>
<RaceName>UNOH 200</RaceName>
<TrackName>Bristol Motor Speedway</TrackName>
<Location>Bristol, TN</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>200</Laps>
<TrackLength>0.533</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1751</RaceID>
<Race_Date>08/31/2014</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Chevrolet Silverado 250</RaceName>
<TrackName>Canadian Tire Motorsport Park</TrackName>
<Location>Bowmanville, ON, Canada</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>64</Laps>
<TrackLength>2.459</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1752</RaceID>
<Race_Date>09/12/2014</Race_Date>
<Race_Time>08:30 PM</Race_Time>
<RaceName>EnjoyIllinois.com 225</RaceName>
<TrackName>Chicagoland Speedway</TrackName>
<Location>Joliet, IL</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>150</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1760</RaceID>
<Race_Date>09/20/2014</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Camping World Truck Series 200</RaceName>
<TrackName>New Hampshire Motor Speedway</TrackName>
<Location>Loudon, NH</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>175</Laps>
<TrackLength>1.058</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1753</RaceID>
<Race_Date>09/27/2014</Race_Date>
<Race_Time>08:30 PM</Race_Time>
<RaceName>Smith's 350</RaceName>
<TrackName>Las Vegas Motor Speedway</TrackName>
<Location>Las Vegas, NV</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>146</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1754</RaceID>
<Race_Date>10/18/2014</Race_Date>
<Race_Time>04:00 PM</Race_Time>
<RaceName>Fred's 250</RaceName>
<TrackName>Talladega Superspeedway</TrackName>
<Location>Talladega, AL</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>94</Laps>
<TrackLength>2.66</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1755</RaceID>
<Race_Date>10/25/2014</Race_Date>
<Race_Time>01:30 PM</Race_Time>
<RaceName>Kroger 200</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Martinsville, VA</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>200</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1756</RaceID>
<Race_Date>10/31/2014</Race_Date>
<Race_Time>08:30 PM</Race_Time>
<RaceName>WinStar World Casino 350</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>147</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1757</RaceID>
<Race_Date>11/07/2014</Race_Date>
<Race_Time>08:00 PM</Race_Time>
<RaceName>Lucas Oil 150</RaceName>
<TrackName>Phoenix International Raceway</TrackName>
<Location>Avondale, AZ</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>150</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<Listing>
<RaceID>1758</RaceID>
<Race_Date>11/14/2014</Race_Date>
<Race_Time>08:00 PM</Race_Time>
<RaceName>Ford EcoBoost 200</RaceName>
<TrackName>Homestead-Miami Speedway</TrackName>
<Location>Homestead, FL</Location>
<TV_Listing>FS1</TV_Listing>
<Laps>148</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
</RaceResults>
</Listing>
<time_stamp> January 13, 2014, at 12:04 PM ET </time_stamp>
</message>
+ test/xml/Auto_Racing_Schedule_XML.dtd view
@@ -0,0 +1,26 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT Title (#PCDATA)>+<!ELEMENT Complete_Through (#PCDATA)>+<!ELEMENT RaceID (#PCDATA)>+<!ELEMENT Race_Date (#PCDATA)>+<!ELEMENT Race_Time (#PCDATA)>+<!ELEMENT RaceName (#PCDATA)>+<!ELEMENT TrackName (#PCDATA)>+<!ELEMENT Location (#PCDATA)>+<!ELEMENT TV_Listing (#PCDATA)>+<!ELEMENT Laps (#PCDATA)>+<!ELEMENT TrackLength (#PCDATA)>+<!ELEMENT FinishPosition (#PCDATA)>+<!ELEMENT DriverID (#PCDATA)>+<!ELEMENT Name (#PCDATA)>+<!ELEMENT LeadingLaps (#PCDATA)>+<!ELEMENT Earnings (#PCDATA)>+<!ELEMENT Status (#PCDATA)>+<!ELEMENT RaceResultsListing ( ( FinishPosition, DriverID, Name, LeadingLaps, Laps, Earnings, Status ) )>+<!ELEMENT RaceResults ( RaceResultsListing* )>+<!ELEMENT Listing ( ( RaceID, Race_Date, Race_Time, RaceName, TrackName, Location, TV_Listing, Laps, TrackLength, RaceResults ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, category, sport, Title, Complete_Through, Listing*, time_stamp ) )>
+ test/xml/Auto_Racing_Schedule_XML.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd">
<message>
<XML_File_ID>20136714</XML_File_ID>
<heading>BFX%SCHEDULE</heading>
<category>Statistics</category>
<sport>NASCAR</sport>
<Title>2013 NASCAR Sprint Cup Schedule</Title>
<Complete_Through>Complete through </Complete_Through>
<Listing>
<RaceID>1492</RaceID>
<Race_Date>02/16/2013</Race_Date>
<Race_Time>08:10 PM</Race_Time>
<RaceName>Sprint Unlimited at Daytona</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>75</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>75</Laps>
<Earnings>205,075</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>75</Laps>
<Earnings>101,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>75</Laps>
<Earnings>61,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>5</LeadingLaps>
<Laps>75</Laps>
<Earnings>52,325</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>26</LeadingLaps>
<Laps>75</Laps>
<Earnings>51,300</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1493</RaceID>
<Race_Date>02/21/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Budweiser Duel 1</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>60</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>23</LeadingLaps>
<Laps>60</Laps>
<Earnings>57,792</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>42,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>37,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>23,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>30,789</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1494</RaceID>
<Race_Date>02/21/2013</Race_Date>
<Race_Time>04:00 PM</Race_Time>
<RaceName>Budweiser Duel 2</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>60</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>60</Laps>
<Earnings>58,977</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>43,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1321</DriverID>
<Name>Austin Dillon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>38,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>60</Laps>
<Earnings>33,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>60</Laps>
<Earnings>31,963</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1495</RaceID>
<Race_Date>02/24/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Daytona 500</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>17</LeadingLaps>
<Laps>200</Laps>
<Earnings>1,525,275</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>1,104,814</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>32</DriverID>
<Name>Mark Martin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>817,013</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>13</LeadingLaps>
<Laps>200</Laps>
<Earnings>707,855</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>200</Laps>
<Earnings>578,471</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1496</RaceID>
<Race_Date>03/03/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Subway Fresh Fit 500</RaceName>
<TrackName>Phoenix International Raceway</TrackName>
<Location>Avondale, AZ</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>316</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>122</LeadingLaps>
<Laps>316</Laps>
<Earnings>298,875</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>316</Laps>
<Earnings>209,686</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>316</Laps>
<Earnings>157,575</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>316</Laps>
<Earnings>168,076</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>47</LeadingLaps>
<Laps>316</Laps>
<Earnings>130,750</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1497</RaceID>
<Race_Date>03/10/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Kobalt Tools 400</RaceName>
<TrackName>Las Vegas Motor Speedway</TrackName>
<Location>Las Vegas, NV</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>42</LeadingLaps>
<Laps>267</Laps>
<Earnings>408,666</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>114</LeadingLaps>
<Laps>267</Laps>
<Earnings>284,340</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>12</LeadingLaps>
<Laps>267</Laps>
<Earnings>248,956</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>27</LeadingLaps>
<Laps>267</Laps>
<Earnings>208,698</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>180,590</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1498</RaceID>
<Race_Date>03/17/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Food City 500</RaceName>
<TrackName>Bristol Motor Speedway</TrackName>
<Location>Bristol, TN</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.533</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>109</LeadingLaps>
<Laps>500</Laps>
<Earnings>176,760</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>56</LeadingLaps>
<Laps>500</Laps>
<Earnings>188,893</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>62</LeadingLaps>
<Laps>500</Laps>
<Earnings>168,651</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>500</Laps>
<Earnings>134,255</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>144,543</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1499</RaceID>
<Race_Date>03/24/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Auto Club 400</RaceName>
<TrackName>Auto Club Speedway</TrackName>
<Location>Fontana, CA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>125</LeadingLaps>
<Laps>200</Laps>
<Earnings>334,233</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>212,340</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>41</LeadingLaps>
<Laps>200</Laps>
<Earnings>193,673</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>181,815</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>146,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1500</RaceID>
<Race_Date>04/07/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>STP Gas Booster 500</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Martinsville, VA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>346</LeadingLaps>
<Laps>500</Laps>
<Earnings>214,471</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>164,893</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>146,446</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>112,385</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>56</LeadingLaps>
<Laps>500</Laps>
<Earnings>145,278</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1501</RaceID>
<Race_Date>04/13/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>NRA 500</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>171</LeadingLaps>
<Laps>334</Laps>
<Earnings>550,858</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>142</LeadingLaps>
<Laps>334</Laps>
<Earnings>346,555</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>268,605</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>214,855</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>209,913</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1502</RaceID>
<Race_Date>04/21/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>STP 400</RaceName>
<TrackName>Kansas Speedway</TrackName>
<Location>Kansas City, KS</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>163</LeadingLaps>
<Laps>267</Laps>
<Earnings>263,816</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>182,085</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>267</Laps>
<Earnings>185,021</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>46</LeadingLaps>
<Laps>267</Laps>
<Earnings>155,985</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>156,218</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1503</RaceID>
<Race_Date>04/27/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Toyota Owners 400</RaceName>
<TrackName>Richmond International Raceway</TrackName>
<Location>Richmond, VA</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>406</Laps>
<TrackLength>0.75</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>406</Laps>
<Earnings>242,511</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>113</LeadingLaps>
<Laps>406</Laps>
<Earnings>196,668</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>406</Laps>
<Earnings>161,618</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>67</LeadingLaps>
<Laps>406</Laps>
<Earnings>147,474</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>7</LeadingLaps>
<Laps>406</Laps>
<Earnings>118,435</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1504</RaceID>
<Race_Date>05/05/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Aaron's 499</RaceName>
<TrackName>Talladega Superspeedway</TrackName>
<Location>Talladega, AL</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>192</Laps>
<TrackLength>2.66</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>455</DriverID>
<Name>David Ragan</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>192</Laps>
<Earnings>373,108</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>399</DriverID>
<Name>David Gilliland</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>192</Laps>
<Earnings>235,153</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>5</LeadingLaps>
<Laps>192</Laps>
<Earnings>207,720</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>46</DriverID>
<Name>Michael Waltrip</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>192</Laps>
<Earnings>155,620</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>192</Laps>
<Earnings>181,426</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1505</RaceID>
<Race_Date>05/11/2013</Race_Date>
<Race_Time>07:00 PM</Race_Time>
<RaceName>Bojangles Southern 500</RaceName>
<TrackName>Darlington Raceway</TrackName>
<Location>Darlington, SC</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>367</Laps>
<TrackLength>1.366</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>17</LeadingLaps>
<Laps>367</Laps>
<Earnings>314,866</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>211,465</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>367</Laps>
<Earnings>200,026</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>178,876</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>367</Laps>
<Earnings>165,976</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1506</RaceID>
<Race_Date>05/18/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Sprint Showdown</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>40</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>40</Laps>
<Earnings>50,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1341</DriverID>
<Name>Ricky Stenhouse Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>40,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>36,640</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>34,540</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>40</Laps>
<Earnings>33,540</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1507</RaceID>
<Race_Date>05/18/2013</Race_Date>
<Race_Time>09:00 PM</Race_Time>
<RaceName>NASCAR Sprint All-Star Race</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>SPEED</TV_Listing>
<Laps>90</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>10</LeadingLaps>
<Laps>90</Laps>
<Earnings>1,039,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>244,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>144,175</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>11</LeadingLaps>
<Laps>90</Laps>
<Earnings>114,150</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>109,150</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1508</RaceID>
<Race_Date>05/26/2013</Race_Date>
<Race_Time>06:00 PM</Race_Time>
<RaceName>Coca-Cola 600</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>28</LeadingLaps>
<Laps>400</Laps>
<Earnings>407,011</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>161</LeadingLaps>
<Laps>400</Laps>
<Earnings>291,615</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>8</LeadingLaps>
<Laps>400</Laps>
<Earnings>218,560</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>400</Laps>
<Earnings>220,915</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>174,823</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1509</RaceID>
<Race_Date>06/02/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>FedEx 400</RaceName>
<TrackName>Dover International Speedway</TrackName>
<Location>Dover, DE</Location>
<TV_Listing>FOX</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>139</LeadingLaps>
<Laps>400</Laps>
<Earnings>318,100</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>400</Laps>
<Earnings>226,504</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>203,051</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>150</LeadingLaps>
<Laps>400</Laps>
<Earnings>196,198</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>400</Laps>
<Earnings>177,431</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1510</RaceID>
<Race_Date>06/09/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Party in the Poconos 400</RaceName>
<TrackName>Pocono Raceway</TrackName>
<Location>Long Pond, PA</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>128</LeadingLaps>
<Laps>160</Laps>
<Earnings>244,436</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>179,185</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>143,060</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>165,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>19</LeadingLaps>
<Laps>160</Laps>
<Earnings>144,343</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1511</RaceID>
<Race_Date>06/16/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Quicken Loans 400</RaceName>
<TrackName>Michigan International Speedway</TrackName>
<Location>Brooklyn, MI</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>48</LeadingLaps>
<Laps>200</Laps>
<Earnings>240,460</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>173,781</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>145,670</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>148,803</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>142,085</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1513</RaceID>
<Race_Date>06/23/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Toyota/Save Mart 350</RaceName>
<TrackName>Sonoma Raceway</TrackName>
<Location>Sonoma, CA</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>110</Laps>
<TrackLength>1.99</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>51</LeadingLaps>
<Laps>110</Laps>
<Earnings>309,250</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>110</Laps>
<Earnings>240,451</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>110</Laps>
<Earnings>198,140</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>15</LeadingLaps>
<Laps>110</Laps>
<Earnings>154,860</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>110</Laps>
<Earnings>157,548</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1514</RaceID>
<Race_Date>06/30/2013</Race_Date>
<Race_Time>12:00 PM</Race_Time>
<RaceName>Quaker State 400</RaceName>
<TrackName>Kentucky Speedway</TrackName>
<Location>Sparta, KY</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>38</LeadingLaps>
<Laps>267</Laps>
<Earnings>200,451</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>159,115</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>146,078</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>130,338</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>139,743</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1515</RaceID>
<Race_Date>07/06/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Coke Zero 400</RaceName>
<TrackName>Daytona International Speedway</TrackName>
<Location>Daytona Beach, FL</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>161</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>94</LeadingLaps>
<Laps>161</Laps>
<Earnings>327,961</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>254,490</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>224,301</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>182,073</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>46</DriverID>
<Name>Michael Waltrip</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>161</Laps>
<Earnings>141,365</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1516</RaceID>
<Race_Date>07/14/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Camping World RV Sales 301</RaceName>
<TrackName>New Hampshire Motor Speedway</TrackName>
<Location>Loudon, NH</Location>
<TV_Listing>TNT</TV_Listing>
<Laps>302</Laps>
<TrackLength>1.058</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>118</DriverID>
<Name>Brian Vickers</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>302</Laps>
<Earnings>214,075</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>53</LeadingLaps>
<Laps>302</Laps>
<Earnings>228,043</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>16</DriverID>
<Name>Jeff Burton</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>302</Laps>
<Earnings>147,135</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>14</LeadingLaps>
<Laps>302</Laps>
<Earnings>179,076</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>580</DriverID>
<Name>Aric Almirola</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>302</Laps>
<Earnings>152,496</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1517</RaceID>
<Race_Date>07/28/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Crown Royal 400 at the Brickyard</RaceName>
<TrackName>Indianapolis Motor Speedway</TrackName>
<Location>Indianapolis, IN</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>45</LeadingLaps>
<Laps>160</Laps>
<Earnings>423,033</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>73</LeadingLaps>
<Laps>160</Laps>
<Earnings>379,736</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>299,500</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>43</DriverID>
<Name>Tony Stewart</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>300,650</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>160</Laps>
<Earnings>273,266</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1518</RaceID>
<Race_Date>08/04/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>GoBowling.com 400</RaceName>
<TrackName>Pocono Raceway</TrackName>
<Location>Long Pond, PA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>160</Laps>
<TrackLength>2.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>66</LeadingLaps>
<Laps>160</Laps>
<Earnings>208,500</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>7</LeadingLaps>
<Laps>160</Laps>
<Earnings>199,221</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>160</Laps>
<Earnings>153,930</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>160</Laps>
<Earnings>161,343</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>160</Laps>
<Earnings>130,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1519</RaceID>
<Race_Date>08/11/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Cheez-It 355 at the Glen</RaceName>
<TrackName>Watkins Glen International</TrackName>
<Location>Watkins Glen, NY</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>90</Laps>
<TrackLength>2.45</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>29</LeadingLaps>
<Laps>90</Laps>
<Earnings>236,658</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>204,876</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>161,735</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>90</Laps>
<Earnings>149,360</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>90</Laps>
<Earnings>137,524</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1520</RaceID>
<Race_Date>08/18/2013</Race_Date>
<Race_Time>01:00 PM</Race_Time>
<RaceName>Pure Michigan 400</RaceName>
<TrackName>Michigan International Speedway</TrackName>
<Location>Brooklyn, MI</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>200</Laps>
<TrackLength>2.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>51</LeadingLaps>
<Laps>200</Laps>
<Earnings>252,393</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>180,731</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>43</LeadingLaps>
<Laps>200</Laps>
<Earnings>136,315</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>143,486</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>200</Laps>
<Earnings>145,493</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1521</RaceID>
<Race_Date>08/24/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>IRWIN Tools Night Race</RaceName>
<TrackName>Bristol Motor Speedway</TrackName>
<Location>Bristol, TN</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.533</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>149</LeadingLaps>
<Laps>500</Laps>
<Earnings>328,466</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>214,815</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>59</DriverID>
<Name>Juan Pablo Montoya</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>200,529</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>118</DriverID>
<Name>Brian Vickers</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>150,315</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>155,973</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1522</RaceID>
<Race_Date>09/01/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>AdvoCare 500</RaceName>
<TrackName>Atlanta Motor Speedway</TrackName>
<Location>Hampton, GA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>325</Laps>
<TrackLength>1.54</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>36</LeadingLaps>
<Laps>325</Laps>
<Earnings>338,058</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>78</LeadingLaps>
<Laps>325</Laps>
<Earnings>244,473</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>325</Laps>
<Earnings>207,065</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>325</Laps>
<Earnings>165,235</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>325</Laps>
<Earnings>167,848</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1523</RaceID>
<Race_Date>09/07/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Federated Auto Parts 400</RaceName>
<TrackName>Richmond International Raceway</TrackName>
<Location>Richmond, VA</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>400</Laps>
<TrackLength>0.75</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>46</LeadingLaps>
<Laps>400</Laps>
<Earnings>286,475</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>73</LeadingLaps>
<Laps>400</Laps>
<Earnings>185,355</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>47</DriverID>
<Name>Ryan Newman</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>400</Laps>
<Earnings>181,443</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>400</Laps>
<Earnings>151,805</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>400</Laps>
<Earnings>140,701</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1524</RaceID>
<Race_Date>09/15/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>GEICO 400</RaceName>
<TrackName>Chicagoland Speedway</TrackName>
<Location>Joliet, IL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>89</LeadingLaps>
<Laps>267</Laps>
<Earnings>334,891</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>67</LeadingLaps>
<Laps>267</Laps>
<Earnings>261,048</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>267</Laps>
<Earnings>221,326</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>169,960</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>40</LeadingLaps>
<Laps>267</Laps>
<Earnings>176,926</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1525</RaceID>
<Race_Date>09/22/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Sylvania 300</RaceName>
<TrackName>New Hampshire Motor Speedway</TrackName>
<Location>Loudon, NH</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>300</Laps>
<TrackLength>1.058</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>106</LeadingLaps>
<Laps>300</Laps>
<Earnings>262,066</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>210,143</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>49</DriverID>
<Name>Greg Biffle</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>151,785</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>300</Laps>
<Earnings>160,796</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>300</Laps>
<Earnings>142,005</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1526</RaceID>
<Race_Date>09/29/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>AAA 400</RaceName>
<TrackName>Dover International Speedway</TrackName>
<Location>Dover, DE</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>400</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>243</LeadingLaps>
<Laps>400</Laps>
<Earnings>243,836</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>80</LeadingLaps>
<Laps>400</Laps>
<Earnings>197,210</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>400</Laps>
<Earnings>166,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>400</Laps>
<Earnings>168,296</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>30</LeadingLaps>
<Laps>400</Laps>
<Earnings>162,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1527</RaceID>
<Race_Date>10/06/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Hollywood Casino 400</RaceName>
<TrackName>Kansas Speedway</TrackName>
<Location>Kansas City, KS</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>138</LeadingLaps>
<Laps>267</Laps>
<Earnings>364,636</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>229,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>216,776</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>33</LeadingLaps>
<Laps>267</Laps>
<Earnings>176,473</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>127</DriverID>
<Name>Carl Edwards</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>169,965</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1528</RaceID>
<Race_Date>10/12/2013</Race_Date>
<Race_Time>07:30 PM</Race_Time>
<RaceName>Bank of America 500</RaceName>
<TrackName>Charlotte Motor Speedway</TrackName>
<Location>Concord, NC</Location>
<TV_Listing>ABC</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>11</LeadingLaps>
<Laps>334</Laps>
<Earnings>314,441</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>138</LeadingLaps>
<Laps>334</Laps>
<Earnings>224,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>199,426</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>130</LeadingLaps>
<Laps>334</Laps>
<Earnings>192,721</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>4</LeadingLaps>
<Laps>334</Laps>
<Earnings>163,568</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1529</RaceID>
<Race_Date>10/20/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Camping World RV Sales 500</RaceName>
<TrackName>Talladega Superspeedway</TrackName>
<Location>Talladega, AL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>188</Laps>
<TrackLength>2.66</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>34</DriverID>
<Name>Jamie McMurray</Name>
<LeadingLaps>16</LeadingLaps>
<Laps>188</Laps>
<Earnings>236,345</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>38</LeadingLaps>
<Laps>188</Laps>
<Earnings>185,410</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1341</DriverID>
<Name>Ricky Stenhouse Jr.</Name>
<LeadingLaps>6</LeadingLaps>
<Laps>188</Laps>
<Earnings>187,596</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>310</DriverID>
<Name>Paul Menard</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>188</Laps>
<Earnings>154,726</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>304</DriverID>
<Name>Kyle Busch</Name>
<LeadingLaps>9</LeadingLaps>
<Laps>188</Laps>
<Earnings>162,068</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1530</RaceID>
<Race_Date>10/27/2013</Race_Date>
<Race_Time>02:00 PM</Race_Time>
<RaceName>Goody's Headache Relief Shot 500</RaceName>
<TrackName>Martinsville Speedway</TrackName>
<Location>Ridgeway, VA</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>500</Laps>
<TrackLength>0.526</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>22</DriverID>
<Name>Jeff Gordon</Name>
<LeadingLaps>78</LeadingLaps>
<Laps>500</Laps>
<Earnings>188,796</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>202</LeadingLaps>
<Laps>500</Laps>
<Earnings>177,736</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>60</LeadingLaps>
<Laps>500</Laps>
<Earnings>141,478</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>433</DriverID>
<Name>Brad Keselowski</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>500</Laps>
<Earnings>153,436</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>123</LeadingLaps>
<Laps>500</Laps>
<Earnings>144,046</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1531</RaceID>
<Race_Date>11/03/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>AAA Texas 500</RaceName>
<TrackName>Texas Motor Speedway</TrackName>
<Location>Fort Worth, TX</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>334</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>255</LeadingLaps>
<Laps>334</Laps>
<Earnings>484,211</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>337,810</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>1306</DriverID>
<Name>Joey Logano</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>334</Laps>
<Earnings>256,393</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>3</LeadingLaps>
<Laps>334</Laps>
<Earnings>238,776</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>334</Laps>
<Earnings>180,585</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1532</RaceID>
<Race_Date>11/10/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>AdvoCare 500</RaceName>
<TrackName>Phoenix International Raceway</TrackName>
<Location>Avondale, AZ</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>312</Laps>
<TrackLength>1.0</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>25</DriverID>
<Name>Kevin Harvick</Name>
<LeadingLaps>70</LeadingLaps>
<Laps>312</Laps>
<Earnings>263,386</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>109</DriverID>
<Name>Kasey Kahne</Name>
<LeadingLaps>41</LeadingLaps>
<Laps>312</Laps>
<Earnings>171,715</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>27</DriverID>
<Name>Jimmie Johnson</Name>
<LeadingLaps>1</LeadingLaps>
<Laps>312</Laps>
<Earnings>182,326</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>2</LeadingLaps>
<Laps>312</Laps>
<Earnings>131,135</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>18</DriverID>
<Name>Kurt Busch</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>312</Laps>
<Earnings>137,630</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<Listing>
<RaceID>1533</RaceID>
<Race_Date>11/17/2013</Race_Date>
<Race_Time>03:00 PM</Race_Time>
<RaceName>Ford EcoBoost 400</RaceName>
<TrackName>Homestead-Miami Speedway</TrackName>
<Location>Homestead, FL</Location>
<TV_Listing>ESPN</TV_Listing>
<Laps>267</Laps>
<TrackLength>1.5</TrackLength>
<RaceResults>
<RaceResultsListing>
<FinishPosition>1</FinishPosition>
<DriverID>490</DriverID>
<Name>Denny Hamlin</Name>
<LeadingLaps>72</LeadingLaps>
<Laps>267</Laps>
<Earnings>322,350</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>2</FinishPosition>
<DriverID>28</DriverID>
<Name>Matt Kenseth</Name>
<LeadingLaps>144</LeadingLaps>
<Laps>267</Laps>
<Earnings>293,251</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>3</FinishPosition>
<DriverID>20</DriverID>
<Name>Dale Earnhardt Jr.</Name>
<LeadingLaps>28</LeadingLaps>
<Laps>267</Laps>
<Earnings>203,860</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>4</FinishPosition>
<DriverID>266</DriverID>
<Name>Martin Truex Jr.</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>179,435</Earnings>
<Status>Running</Status>
</RaceResultsListing>
<RaceResultsListing>
<FinishPosition>5</FinishPosition>
<DriverID>431</DriverID>
<Name>Clint Bowyer</Name>
<LeadingLaps>0</LeadingLaps>
<Laps>267</Laps>
<Earnings>167,968</Earnings>
<Status>Running</Status>
</RaceResultsListing>
</RaceResults>
</Listing>
<time_stamp> January 13, 2014, at 11:34 AM ET </time_stamp>
</message>
+ test/xml/scoresxml-no-locations.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd">
<message>
<XML_File_ID>20160285</XML_File_ID>
<heading>BC-BLP+P26:P56*  7  7 1R14:56</heading>
<game_id>50719</game_id>
<schedule_id>50719</schedule_id>
<category>Scores</category>
<sport>CBASK-W</sport>
<seasontype>Regular</seasontype>
<game>
<vteam id="P26">Campbell</vteam>
<hteam id="P56">Gardner-Webb</hteam>
<vscore>7</vscore>
<hscore>7</hscore>
<time_r>14:56</time_r>
<status numeral="1" type="P">1 Half</status>
</game>
<time_stamp> January 16, 2014, at 11:17 AM ET </time_stamp>
</message>
+ test/xml/scoresxml.dtd view
@@ -0,0 +1,27 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT game_id (#PCDATA)>+<!ELEMENT schedule_id (#PCDATA)>+<!ELEMENT tsnupdate (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT seasontype (#PCDATA)>+<!ELEMENT vteam (#PCDATA)>+<!ELEMENT hteam (#PCDATA)>+<!ELEMENT vscore (#PCDATA)>+<!ELEMENT hscore (#PCDATA)>+<!ELEMENT time_r (#PCDATA)>+<!ELEMENT status (#PCDATA)>+<!ELEMENT game ( ( vteam, hteam, vscore, hscore, time_r?, status, notes? ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, game_id, schedule_id, tsnupdate?, category, sport, location*, seasontype, game, time_stamp ) )>+<!ELEMENT city (#PCDATA)>+<!ELEMENT state (#PCDATA)>+<!ELEMENT country (#PCDATA)>+<!ELEMENT location ( ( city, state, country ) )>+<!ELEMENT notes (#PCDATA)>++<!ATTLIST vteam id CDATA #REQUIRED>+<!ATTLIST hteam id CDATA #REQUIRED>+<!ATTLIST status numeral CDATA #REQUIRED>+<!ATTLIST status type CDATA #REQUIRED>
+ test/xml/scoresxml.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?>
<!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd">
<message>
<XML_File_ID>20160114</XML_File_ID>
<heading>BC-ADi+129:143*  0  0 0</heading>
<game_id>18166</game_id>
<schedule_id>18166</schedule_id>
<category>Scores</category>
<sport>NHL</sport>
<location>
<city>Montreal</city>
<state>QUEBEC</state>
<country>CANADA</country>
</location>
<location>
<city>Ottawa</city>
<state>ONTARIO</state>
<country>CANADA</country>
</location>
<seasontype>Regular</seasontype>
<game>
<vteam id="129">Montreal</vteam>
<hteam id="143">Ottawa</hteam>
<vscore>0</vscore>
<hscore>0</hscore>
<status numeral="0" type="i">0 Period</status>
<notes>Ottawa - Right Wing Chris Neil (1/16, lower body) is probable for Thursday's 
  game against Montreal.</notes>
</game>
<time_stamp> January 16, 2014, at 10:39 AM ET </time_stamp>
</message>