我在网上看到的 Haskell 的 xml-conduit 模块的每个示例都使用了 OverloadedStrings GHC 扩展(例如这里)。我认为这是因为该Text.XML.Cursor.element
函数具有 type Name -> Axis
。例如,如果没有 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]
_ -> []
但是,我想编写一个更便携的模块,即不使用这个扩展。这样做的最佳方法是什么?我是否注定Text
要从每个字符串中创建一个值Data.Text.pack
,然后Text.XML.Name
在将结果传递给之前使用数据构造函数element
?或者有没有更简单的方法?