dom-parser-3.2.0: src/Text/XML/Soap.hs
module Text.XML.Soap where
import Control.Lens
import Data.String
import Text.XML
import Text.XML.DOM.Parser
import Text.XML.Writer
data XmlEnvelope h b = XmlEnvelope
{ _xeHeader :: !(Maybe h)
, _xeBody :: !(Maybe b)
} deriving (Eq, Show)
makeLenses ''XmlEnvelope
xmlEnvelopeToDocument :: (ToXML h, ToXML b) => XmlEnvelope h b -> Document
xmlEnvelopeToDocument xe = doc
where
sname n = fromString $ "{http://schemas.xmlsoap.org/soap/envelope/}" <> n
doc =
Document
{ documentPrologue = Prologue [] Nothing []
, documentRoot =
Element
{ elementName = sname "Envelope"
, elementAttributes = mempty
, elementNodes = [NodeElement header, NodeElement body]
}
, documentEpilogue = []
}
header =
Element
{ elementName = sname "Header"
, elementAttributes = mempty
, elementNodes = render . toXML $ xe ^. xeHeader
}
body =
Element
{ elementName = sname "Body"
, elementAttributes = mempty
, elementNodes = render . toXML $ xe ^. xeBody
}
instance (FromDom h, FromDom b) => FromDom (XmlEnvelope h b) where
fromDom = XmlEnvelope <$> inElemMay "Header" fromDom
<*> inElemMay "Body" fromDom