HXT XML 搜索未返回预期结果

问题描述 投票:0回答:1

所以我正在解析这个 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 haskell functional-programming hxt arrow-abstraction
1个回答
1
投票

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

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

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

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

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

查看代码 getTeams3 以获得灵感。

© www.soinside.com 2019 - 2024. All rights reserved.