HXT XML搜索未返回预期结果

时间:2012-02-08 13:55:08

标签: xml haskell functional-programming arrows

所以我正在解析这个XML文件。一旦我到达其中的一个节点,我就有一个孩子代表一个代码,一个用于描述,一个或多个(孙子)节点保留外部节点引用。

我首先尝试使用简单的箭头符号和< +>聚合以获得我想要的所有信息,但只是弹出一个大清单,我想也许有更优雅的方式来实现这个

所以我尝试使用箭头符号,并使代码看起来像是一行:

import Text.XML.HXT.Core

getDocument cale = readDocument [withValidate  no] cale

atName name=deep (hasName name)
text = getChildren>>>getText

getList = deep (hasName "list-info")>>>
 proc x -> do
    desc <- text <<< atName "desc"  -< x
    code <- text  <<< atName "code"   -< x
    refs <- getAttrValue "idref" <<< deep (hasName "service-id-ref") -< x
    returnA -< (desc,code,refs)

根据我对此过滤器的理解,基本上深度应该返回所有“service-id-ref”节点,但满足“list-info”名称的第一个节点有2个“service-id-” ref“2个不同的grand-grand children节点上的子节点,refs每次只绑定到第一个节点。所以基本上我期待一个3元组(String,String,[String]),但我得到的只是3个普通字符串。

是因为我对do-notation(或一般)中箭头的理解不足,还是应该尝试以其他方式绑定refs?

提前致谢

1 个答案:

答案 0 :(得分:1)

我没有你的xml文件,因此很难检查我的答案是否正确。但根据预期的结果,您需要refs的字符串列表。

在箭头中获取列表,有功能列表A.

所以你的代码可能会变成这样的东西(未经测试):

refs <- listA (getAttrValue "idref" <<< deep (hasName "service-id-ref")) -< x

您是否阅读过以下示例:http://www.haskell.org/haskellwiki/HXT/Practical/Simple2

查看代码getTeams3获取灵感。