所以我正在解析这个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?
提前致谢
答案 0 :(得分:1)
我没有你的xml文件,因此很难检查我的答案是否正确。但根据预期的结果,您需要refs的字符串列表。
在箭头中获取列表,有功能列表A.
所以你的代码可能会变成这样的东西(未经测试):
refs <- listA (getAttrValue "idref" <<< deep (hasName "service-id-ref")) -< x
您是否阅读过以下示例:http://www.haskell.org/haskellwiki/HXT/Practical/Simple2?
查看代码getTeams3获取灵感。