I found the error. I used "Renewable" as the name of the XML element tag when it should have been "Renewables" with a trailing s. Oops. Sorry for the spam -- Tim



On Tue, Jul 31, 2012 at 10:55 AM, Tim Perry <tim.v2.0@gmail.com> wrote:
Hi everyone,

I'm trying to learn to write XmlPicklers.  I've been trying to follow the tutorial on the HaskelWiki, but it doesn't quite cover an issue I've run into.
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML

I have a ADTs like so:

data Plant = Plant 
   
{ renewables :: [Renewable]
   
, rewewableMonthly :: [RenewableMonthly]
   
, waterHeating :: [WaterHeating]
   
, hvac :: [HVAC]
   
} deriving (Read, Show, Eq)

data
Renewable = Renewable
   
{ dcRating :: Double -- kW
   
, annualTDV :: Double -- CA Energy Comm. TDV
   
} deriving (Read, Show, Eq)

data
RenewableMonthly = RenewableMonthly
   
{ month :: Int
   
, cost :: Double
   
, demand :: Double
   
, energy :: Double
   
} deriving (Read, Show, Eq)

data
WaterHeating = WaterHeating
   
{ whName :: String                      -- name for reference purposes.
   
, whQuantity :: Int      
...
data HVAC
= HVAC
   
{ slaStatus :: String                  -- Specific leakage area construction type.
   
, newCFM50 :: Double                   -- New building leakage in cubic feet per minute.
   
, existCFM50 :: Double

I want to use an XmlPickler to read and write this.  The XML looks like this:

<Plant>
 
<Renewables DCRating="8.4" AnnualTDV="0" />
 
<RenewableMonthly Month="1" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="2" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="3" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="4" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="5" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="6" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="7" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="8" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="9" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="10" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="11" Cost="0" Demand="0" Energy="0" />
 
<RenewableMonthly Month="12" Cost="0" Demand="0" Energy="0" />
  <WaterHeating Name="Daikin Altherma HP" Quantity="1" ConstructionStatus="New" EnergyFactor="2.344" SolarFraction="0" ....
  <HVAC SLAStatus="New" NewCFM50="0" ExistCFM50="0" NewSLA="4.9000000953674316" ExistSLA="4.9" DuctStatus="New" ....
    <Zone 
...

Running my code I get an error:

-- (1) readDocument: start processing document "1101_11-001 Walsh.xml" -- (1) getXmlContents: content read and decoded for "file:///fairoaks1/all_proj/1101%20PG&E%20CAHP%2011-12/CRM/EProDataExtractPlanning/XML%20samples/1101_11-001%20Walsh.xml" -- (1) getXmlContents' -- (1) readDocument: "1101_11-001 Walsh.xml" (mime type: "text/xml" ) will be processed -- (1) readDocument: "1101_11-001 Walsh.xml" processed

fatal error: document unpickling failed 
xpCheckEmptyContents: unprocessed XML content detected context: element "Plant" contents:


Is it possible to write an XmlPickler for this?  Do I need to make Renewable, RenewableMonthly, WaterHeating, and HVAC all the same type with 4 constructors and use xpAlt? Ideas?

Thanks,
Tim