XsdToHaskell输出用法

时间:2015-09-28 06:44:23

标签: xml haskell xsd haxml

我使用嵌入在HaXml库中的XsdToHaskell工具从XSD生成Haskell数据类型。 现在我有一堆数据类型和似乎是这些数据类型的解析器。 但是输出文件(elementPlans)中的主要函数是返回XMLParser PlansTypePlansType是XML中根元素的类型),我不知道如何解析XML文件这个解析器。

这是Plans.hs(XmlToHaskell的输出),XSDXML

3 个答案:

答案 0 :(得分:0)

Hayoo上进行了一些搜索后,似乎XMLParser PlansTypeParser (Content Posn) PlansType相同:

type XMLParser a = Parser (Content Posn) a

根据http://hackage.haskell.org/package/HaXml-1.25.3/docs/Text-XML-HaXml-XmlContent-Parser.html#t:XMLParser

反过来导致我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指定空格是否重要; CharDataString的别名,i是您的案例中Posn类型的值。

要构建Posn值,请点击Posn;你会看到有一个函数noPos,您可以使用它来构造Posn类型的值(假设您暂时不关心错误报告中的位置)。

总而言之:CString False "bla bla bla" noPosCString 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生成。