XsdToHaskell 输出用法

XsdToHaskell output usage

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

这里是Plans.hs (output of XmlToHaskell), XSD and XML

Hayoo 上做了一些搜索,XMLParser PlansType 似乎与 Parser (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 (and the lazy version)——它有一个 runParser 功能。


回复:您的评论:文档中的类型是可点击的,即您可以导航到它们并尝试理解它们:

单击 Content 将带您 here。从那里很明显,为了传递 String[t],其中 t ~ Char),您需要使用 CString Bool CharData i 构造一个 Content 值。 bool 指定空格是否重要; CharDataString 的别名,而 i 是您的 Posn 类型的值。

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

总而言之:CString False "bla bla bla" noPosCString True "bla bla bla" noPos 应该可以让您入门。

我会查看模块 Text.XML.HaXml.Html.Parse 中的 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

看起来它使用与 XMLParser 相同的 Parser 类型。

以下解决问题:

xmlText <- readFile fname
let (Document _ _ root _) = xmlParse "(No Document)" xmlText
let (Right plans) = fst $ runParser elementPlans [CElem root noPos]

在第一行中,我们将 xml 文件内容读取为字符串,然后是 xmlParse returns 根元素类型为 Element 的文档,我们使用它来创建单个令牌类型 CElem 然后是 运行 解析器,由 XsdToHaskell 生成。