XsdToHaskell 输出用法
XsdToHaskell output usage
我使用 HaXml 库中嵌入的 XsdToHaskell 工具从 XSD 生成了 Haskell 数据类型。
现在我有一堆数据类型和似乎是这些数据类型的解析器。
但是输出文件(elementPlans
)中的主要函数返回XMLParser PlansType
(PlansType
是XML中根元素的类型)我不知道如何解析具有此解析器的 XML 文件。
在 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 (and the lazy version)——它有一个 runParser
功能。
回复:您的评论:文档中的类型是可点击的,即您可以导航到它们并尝试理解它们:
单击 Content
将带您 here。从那里很明显,为了传递 String
([t]
,其中 t ~ Char
),您需要使用 CString Bool CharData i
构造一个 Content
值。 bool 指定空格是否重要; CharData
是 String
的别名,而 i
是您的 Posn
类型的值。
为了构造一个Posn
值,点击Posn;你会看到有一个函数 noPos
可以用来构造一个类型 Posn
的值(假设你暂时不关心错误报告中的位置)。
总而言之:CString False "bla bla bla" noPos
或 CString 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 生成。
我使用 HaXml 库中嵌入的 XsdToHaskell 工具从 XSD 生成了 Haskell 数据类型。
现在我有一堆数据类型和似乎是这些数据类型的解析器。
但是输出文件(elementPlans
)中的主要函数返回XMLParser PlansType
(PlansType
是XML中根元素的类型)我不知道如何解析具有此解析器的 XML 文件。
在 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 (and the lazy version)——它有一个 runParser
功能。
回复:您的评论:文档中的类型是可点击的,即您可以导航到它们并尝试理解它们:
单击 Content
将带您 here。从那里很明显,为了传递 String
([t]
,其中 t ~ Char
),您需要使用 CString Bool CharData i
构造一个 Content
值。 bool 指定空格是否重要; CharData
是 String
的别名,而 i
是您的 Posn
类型的值。
为了构造一个Posn
值,点击Posn;你会看到有一个函数 noPos
可以用来构造一个类型 Posn
的值(假设你暂时不关心错误报告中的位置)。
总而言之:CString False "bla bla bla" noPos
或 CString 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 生成。