0

所以我正在解析这个 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-notation(或一般而言)中的箭头理解不佳,还是我应该尝试以其他方式绑定 refs?

提前致谢

4

1 回答 1

1

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

在获取列表的箭头中,有函数 listA。

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

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

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

查看代码 getTeams3 以获得灵感。

于 2012-02-08T20:56:36.587 回答