在Haskell中解析FB2(XML)

在Haskell中解析FB2(XML),haskell,parsec,fb2,Haskell,Parsec,Fb2,开始学习Haskell时,我决定熟悉Parsec,但有一些问题。我试图以FB2的格式实现对书籍的解析。在传统的标签上(文本)是好的,但是当标签中的标签不起作用时 import Text.ParserCombinators.Parsec data FB2Doc = Node String FB2Doc | InnText String deriving (Eq,Show) parseFB2 :: GenParser Char st [FB2Doc

开始学习Haskell时,我决定熟悉Parsec,但有一些问题。我试图以FB2的格式实现对书籍的解析。在传统的标签上(文本)是好的,但是当标签中的标签不起作用时

import Text.ParserCombinators.Parsec

data FB2Doc = Node String FB2Doc
            | InnText String
            deriving (Eq,Show)

parseFB2 :: GenParser Char st [FB2Doc]
parseFB2 = many test

test :: GenParser Char st FB2Doc
test = do name <- nodeStart
          value <- getvalue
          nodeEnd
          return $ Node name value

nodeStart = do char '<'
               name <- many (letter <|> digit <|> oneOf "-_")
               char '>'
               return name

nodeEnd = do string "</"
             many (letter <|> digit)
             char '>'
             spaces 
gettext = do x <- many (letter <|> digit <|> oneOf "-_")
             return $ InnText x 

getvalue = do (nodeStart >> test) <|> gettext <|> return (Node "" (InnText ""))
main = do
         print $ parse parseFB2 "" "<h1><a2>ge</a2></h1> <genre>history_russia</genre>"
import Text.ParserCombinators.Parsec
数据FB2Doc=节点字符串FB2Doc
|输入文本字符串
推导(等式,显示)
parseFB2::GenParser Char st[FB2Doc]
parseFB2=多个测试
测试::GenParser Char st FB2Doc
test=do name test)gettext返回(节点“”(InnText“”)
main=do
打印$FB2”““ge历史\俄罗斯”
我想你想要这个:

getvalue = try test <|> gettext
getvalue=尝试测试gettext

空节点需要使用
try
“”
test
将消耗
“我还没有进行真正的一轮调试,但是
getvalue
nodeStart>>test
子句看起来有点可疑:它有一个
nodeStart
nodeEnd
不匹配;它丢弃已启动节点的名称;而且,由于
test
会立即调用
many
,因此它永远不会返回空的节点列表。@fuzzxl,OP这样做是作为一种学习练习,而不是作为实现生产质量XML解析器的一种方式。所以“使用一个为你做这件事的库”并不能真正实现这个目标。你能提供更多关于它如何不起作用的信息吗。错误消息、预期输出等。这些东西有助于将我们的注意力引导到代码的重要部分。@luqui我删除了我的注释。。。你是对的。我忘了。谢谢