Разбор FB2 (XML) в Haskell - PullRequest
       17

Разбор FB2 (XML) в Haskell

2 голосов
/ 09 октября 2011

Начал изучать 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>"

1 Ответ

1 голос
/ 10 октября 2011

Я думаю, вы хотите это:

getvalue = try test <|> gettext

try необходимо для пустых узлов: "<bla></bla>".test будет потреблять '<' из </bla>, а try допускает возврат.

...