假定节点属性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")