Every example I have seen online of Haskell's xml-conduit module uses the OverloadedStrings GHC extension (e.g. here). I assume this is because the Text.XML.Cursor.element
function has type Name -> Axis
. For example, this snippet would not work without OverloadedStrings:
{-# LANGUAGE OverloadedStrings #-}
import Text.XML
import Text.XML.Cursor
import Data.Text (Text)
import Data.Text.Read (decimal)
import Data.Monoid (mconcat)
main :: IO ()
main = do
doc <- Text.XML.readFile def "people2.xml"
let cursor = fromDocument doc
print $ cursor $// element "{http://example.com}person" >=> parsePerson
data Person = Person Int Text
deriving Show
parsePerson :: Cursor -> [Person]
parsePerson c = do
let name = c $/ element "{http://example.com}firstname" &/ content
ageText = c $/ element "{http://example.com}age" &/ content
case decimal $ mconcat ageText of
Right (age, "") -> [Person age $ mconcat name]
_ -> []
However, I want to write a module that is more portable, i.e. without using this extension. What is the best way of doing this? Am I doomed to create a Text
value from each string with Data.Text.pack
and then using the Text.XML.Name
data constructor before passing the result to element
? Or is there some easier way?
I'm afraid the "easier way" is -XOverloadedStrings. I'm also afraid you're not going to be able to meet your portability goals while relying on xml-conduit, because it makes liberal use of language extensions itself.
Unless you have a specific alternative compiler you are targeting, you might as well use a -XOverloadedStrings, especially since xml-conduit was explicitly designed to support it.