【问题标题】:Parsing FB2(XML) in Haskell在 Haskell 中解析 FB2(XML)
【发布时间】:2023-03-19 14:21:01
【问题描述】:

开始学习Haskell,我决定熟悉Parsec,但是出现了问题。我正在尝试以 FB2 的格式实现对书籍的解析。对常规标签( text )是好的,但是当标签内的标签 - 不起作用。

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>"

【问题讨论】:

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

标签: haskell parsec fb2


【解决方案1】:

我想你想要这个:

getvalue = try test <|> gettext

空节点需要try"&lt;bla&gt;&lt;/bla&gt;"test 将消耗&lt;/bla&gt;'&lt;',而try 允许回溯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2022-08-22
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多