所以我正在解析这个 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)
根据我对此过滤器的理解,基本上 Deep 应该返回同一级别的所有“service-id-ref”节点,但满足“list-info”名称的第一个节点有 2 个“service-id-ref” 2 个不同的孙子节点上的子节点和 refs 每次仅绑定到第一个。所以基本上我期待的是 (String,String,[String]) 的 3 元组,但我得到的只是 3 个普通字符串。
是因为我对 do 表示法(或一般情况)中的箭头理解不佳,还是我应该尝试以其他方式绑定引用?
提前致谢
我没有你的 xml 文件,所以很难检查我的答案是否正确。但根据预期结果,您需要一个参考字符串列表。
获取列表的箭头中有函数listA。
所以你的代码可能会变成这样(未经测试):
refs <- listA (getAttrValue "idref" <<< deep (hasName "service-id-ref")) -< x
您是否阅读过以下示例:http://www.haskell.org/haskellwiki/HXT/Practical/Simple2?
查看代码 getTeams3 以获得灵感。