Well, figured out a solution to parsing xml.&nbsp; It&#39;s not really pretty, but it works.<br>
<br>
Basically we just convert the incoming xml into a gread compatible format then use gread :-D<br>
<br>
If someone has a more elegant solution, please let me know.<br><br>For the moment, it will only work with Ints and Strings as the children, but it&#39;s pretty easy to add new primitive data types, as long as it&#39;s pretty easy to make them compatible with gread.&nbsp; You just need to add additional lines to the case statement in 
xmlToGShowFormat<br><br>Again, if someone has a more elegant solution, I&#39;d enjoy seeing it,&nbsp; but at least this one works :-D<br>
<br>
module ParseXml<br>
&nbsp;&nbsp; where<br>
<br>
import IO<br>
import Char<br>
import List<br>
import Maybe<br>
import Data.Generics hiding (Unit)<br>
import Text.XML.HXT.Arrow hiding (when)<br>
<br>
data Config = Config{ name :: String, age :: Int } <br>
--data Config = Config{ age :: Int } <br>
&nbsp;&nbsp; deriving( Data, Show, Typeable, Ord, Eq, Read )<br>
<br>
createConfig = Config &quot;qsdfqsdf&quot; 3<br>
--createConfig = Config 3<br>
gshow&#39; :: Data a =&gt; a -&gt; String<br>
gshow&#39; t = fromMaybe (showConstr(toConstr t)) (cast t)<br>
<br>
-- helper function from <a href="http://www.defmacro.org/ramblings/haskell-web.html">http://www.defmacro.org/ramblings/haskell-web.html</a><br>
introspectData :: Data a =&gt; a -&gt; [(String, String)]<br>
introspectData a = zip fields (gmapQ gshow&#39; a)<br>
&nbsp;&nbsp;&nbsp; where fields = constrFields $ toConstr a<br>
<br>
-- function to create xml string from single-layer Haskell data type<br>
xmlSerialize object = &quot;&lt;&quot; ++ show(toConstr object) ++ &quot;&gt;&quot; ++ <br>
&nbsp;&nbsp; foldr (\(a,b) x&nbsp; -&gt; x ++ &quot;&lt;&quot; ++ a ++ &quot;&gt;&quot; ++ b ++ &quot;&lt;/&quot; ++ a ++ &quot;&gt;&quot;) &quot;&quot; ( introspectData object )<br>
&nbsp;&nbsp; ++ &quot;&lt;/&quot; ++ show(toConstr object) ++ &quot;&gt;&quot;<br>
<br>
-- parse xml to HXT tree, and obtain the value of node &quot;fieldname&quot;<br>
-- returns a string<br>
getValue xml fieldname | length(resultlist) &gt; 0 = Just (head resultlist)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise = Nothing<br>
&nbsp;&nbsp;&nbsp; where resultlist = (runLA ( constA xml &gt;&gt;&gt; xread
&gt;&gt;&gt; deep ( hasName fieldname ) &gt;&gt;&gt; getChildren
&gt;&gt;&gt; getText ))[]<br>
&nbsp;<br>
-- parse templateobject to get list of field names<br>
-- apply these to xml to get list of values<br>
-- return (fieldnames list, value list)<br>
xmlToGShowFormat :: Data a =&gt; String -&gt; a -&gt; String<br>
xmlToGShowFormat xml templateobject = <br>
&nbsp;&nbsp; go<br>
&nbsp;&nbsp; where mainconstructorname = (showConstr $ toConstr templateobject)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fields = constrFields $ toConstr templateobject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values = map ( \fieldname -&gt; getValue xml fieldname ) fields<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatypes = gmapQ (dataTypeOf) templateobject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; constrs = gmapQ (toConstr) templateobject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatypereps = gmapQ (dataTypeRep . dataTypeOf) templateobject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldtogshowformat (value,datatyperep) = case datatyperep of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntRep -&gt; &quot;(&quot; ++ fromJust value ++ &quot;)&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ -&gt; show(fromJust value)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; formattedfieldlist = map (fieldtogshowformat) (zip values datatypereps)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go = &quot;(&quot; ++ mainconstructorname ++ &quot; &quot; ++ (concat $ intersperse &quot; &quot; formattedfieldlist ) ++ &quot;)&quot;<br>
<br>
xmlDeserialize xml templateobject = fst $ head $ gread( xmlToGShowFormat xml templateobject)<br>
<br>
dotest = xmlDeserialize (xmlSerialize createConfig) createConfig :: Config<br>
dotest&#39; = xmlDeserialize
(&quot;&lt;Config&gt;&lt;age&gt;12&lt;/age&gt;&lt;name&gt;test
name!&lt;/name&gt;&lt;/Config&gt;&quot;) createConfig :: Config<br>