测试它是否存在节点HXT

时间:2014-04-08 11:14:41

标签: haskell if-statement attributes arrows hxt

有没有办法测试节点(属性值)并将其与if条件一起使用? 例如:

import Text.XML.HXT.Core
import System.Environment  --para uso do getArgs
import Data.List.Split (splitOn)

data Class = Class { name ::String }
    deriving (Show,Eq)

main = do
   [src]<- getArgs
   teams <- runX(readDocument [ withValidate no] src  >>> getClass)
   print teams
--Test
test = if (True) then getAttrValue "rdf:about" else getAttrValue "rdf:ID"

atTag tag = deep (isElem >>> hasName tag)
getClass = atTag "owl:Class" >>>
    proc l -> do
    className <- test -< l
    returnA -< Class { name = splitOn "#" className !! 1}

在那个例子中,我想测试一个属性值,如果它存在,则返回我的then条件,否则为else条件! 我看到了XMLArrow的API,并且它存在一些能够执行此操作的函数(例如,isAttrib或hasAttrib)但它没有返回布尔值... 所以......我想到了解决问题的其他方法,但我认为必须有一个更简单的解决方案来解决这个问题...... 有人能给我一个暗示吗?

1 个答案:

答案 0 :(得分:1)

您可以使用hxt包的模块Control.Arrow.ArrowIf的功能。在这里,您可以找到函数ifA,这是if-else语句的提升版本。例如代码

if (True) then getAttrValue "rdf:about" else getAttrValue "rdf:ID"

应该写成

ifA (constA True) (getAttrValue "rdf:about") (getAttrValue "rdf:ID")

根据您要归档的内容,您应使用ifA的派生函数,例如guards