使用HXT解析期间捕获和停止语法异常

时间:2018-07-29 21:59:17

标签: haskell hxt

假定节点属性animal非法的基于XML的语言。考虑:

{-# LANGUAGE Arrows, RankNTypes #-}
module Lib ( parseXml ) where
import Control.Arrow
import Text.XML.HXT.Core

parseXml = runLA (xread >>> isElem >>> myParser) content
  where
    content = unlines
      [ "<pet animal='cat'>felix</pet>"
      , "<pet>milo</pet>"
      , "<pet animal='rat'>tom</pet>" ]

myParser :: (ArrowXml a) => a XmlTree [String]
myParser =  proc xml -> do
  x <- isElem -< xml
  pets <- (getText <<< getChildren <<< neg (hasAttr "animal")) >. id -< x
  returnA -< pets

评估parseXml的结果是:

parseXml
[[],["milo"],[]]

这不是想要的。解析器已静默忽略了第一个XML节点和第三个XML节点,因为它们不符合myParser,特别是neg (hasAttr "animal"),但是我希望这种行为不要静默地忽略它们,而应在第一个XML节点。

如果遇到我们违反XML节点从不具有“动物”属性的语法冲突,我如何更改此代码,使HXT引发错误?也就是说,当尝试解析第一个XML节点时,它会返回一个Left值,例如

parseXml
Left (ParseError "'animal' attribute is not permitted")

1 个答案:

答案 0 :(得分:0)

尝试err及其邻居与when