我使用嵌入在HaXml库中的XsdToHaskell工具从XSD生成Haskell数据类型。
现在我有一堆数据类型和似乎是这些数据类型的解析器。
但是输出文件(elementPlans
)中的主要函数是返回XMLParser PlansType
(PlansType
是XML中根元素的类型),我不知道如何解析XML文件这个解析器。
答案 0 :(得分:0)
在Hayoo上进行了一些搜索后,似乎XMLParser PlansType
与Parser (Content Posn) PlansType
相同:
type XMLParser a = Parser (Content Posn) a
反过来导致我http://hackage.haskell.org/package/polyparse-1.11/docs/Text-ParserCombinators-Poly-Plain.html(及其the lazy version) - 具有runParser
功能。
Re:您的评论:文档中的类型是可点击的,即您可以导航到它们并尝试理解它们:
点击Content
会看到here。从那里很明显,为了传递String
([t]
其中t ~ Char
),您需要使用Content
构建CString Bool CharData i
值。 bool指定空格是否重要; CharData
是String
的别名,i
是您的案例中Posn
类型的值。
要构建Posn
值,请点击Posn;你会看到有一个函数noPos
,您可以使用它来构造Posn
类型的值(假设您暂时不关心错误报告中的位置)。
总而言之:CString False "bla bla bla" noPos
或CString True "bla bla bla" noPos
应该让你开始。
答案 1 :(得分:0)
我会查看模块Text.XML.HaXml.Html.Parse中的2
例程以获取想法:
htmlParse'
看起来-- | The first argument is the name of the file, the second is the string
-- contents of the file. The result is the generic representation of
-- an XML document. Any parsing errors are returned in the @Either@ type.
htmlParse' :: String -> String -> Either String (Document Posn)
htmlParse' file = Prelude.either Left (Right . simplify) . fst
. runParser document . xmlLex file
函数用于标记字符串,然后xmlLex
用于解析。
在该模块中,runParser
的类型为:
document
看起来它使用document :: HParser (Document Posn)
type HParser a = Parser (Posn,TokenT) a
使用的Parser
类型。
答案 2 :(得分:0)
以下解决了这个问题:
xmlText <- readFile fname
let (Document _ _ root _) = xmlParse "(No Document)" xmlText
let (Right plans) = fst $ runParser elementPlans [CElem root noPos]
在第一行中,我们将xml文件内容读为字符串,然后xmlParse
返回带有Element
类型的根元素的文档,我们使用它来创建类型为CElem
的单个标记,然后运行解析器,由XsdToHaskell生成。