<div dir="ltr">Michael,<br><div class="gmail_extra"><br></div><div class="gmail_extra">On 31 March 2015 at 14:26, Thomas Koster <span dir="ltr"><<a href="mailto:tkoster@gmail.com" target="_blank">tkoster@gmail.com</a>></span> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I want to write a simple XML web service in Haskell that services a .NET WCF client, but am struggling with choosing the right XML library.<br>...<br>I need the library to understand XML namespaces and the mandatory predefined entities, but I do not need any other extensions like XML Schemas, XPath or XSLT. Preferably, "xmlns" attributes should be handled specially and namespace prefixes resolved by the parser. "xmlns" attributes should be placed automatically by the renderer (I don't care what prefixes it chooses). I do not want to have to keep track of seen namespace prefixes while I am traversing the document, or to manually place "xmlns" attributes on elements for rendering.</blockquote><div class="gmail_extra"><div class="gmail_quote"><br></div><div class="gmail_quote">On 31 March 2015 at 16:39, Michael Snoyman <span dir="ltr"><<a href="mailto:michael@snoyman.com" target="_blank">michael@snoyman.com</a>></span> wrote:</div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">It doesn't have the typeclass stuff built in, but xml-conduit has proper support for XML namespaces.</blockquote><div> </div><div>That's OK. I can create the type classes myself.</div><div><br></div><div>class ToElement a where</div><div>  toElement :: a -> Element</div><div><br></div><div>class FromElement a where<br></div><div>  parseElement :: Element -> Either String a</div><div><br></div><div>The important thing is that namespaces are understood so that I am able create instances that compose, e.g. (off the top of my head)</div><div><br></div><div>data SoapEnvelope h b = SoapEnvelope</div><div>  {</div><div>    soapEnvelopeHeaders :: [h],</div><div>    soapEnvelopeBody :: b</div><div>  }</div><div><br></div><div>instance (FromElement h, FromElement b) => FromElement (SoapEnvelope h b) where</div><div>  parseElement e = SoapEnvelope <$> (...headers...) <*> (...body...)<br></div><div><br></div><div>Thanks,</div><div>--</div><div>Thomas Koster</div><div><br></div></div></div></div>