3

我在使用HXT时遇到了一些问题,尽管我怀疑这只是我对箭头的遗漏。

我有一个类似的 XML 结构

<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>

和内部结构一样

data XmlData = XmlStr String | XmlList XmlData

有没有办法在箭头的一步收集元素?

getXmlData :: IOSArrow XmlTree (String, XmlData)
getXmlData = (getAttrl >>> getChildren >>> getText) &&& 
      ((filterByType "str" >>> getText >>> arr (\x -> XmlStr x))
      <+> (filterByType "lst" >>> getXmlData))
  where filterByType t = isElem >>> hasName t >>> getChildren

对 getXmlData 的递归调用需要收集它的答案并包装在 XmlList 构造函数中,但我不知道如何收集术语。目前,我正在对输出进行一些后处理(以相同的名称收集)来完成此操作,但我想要一个更好的解决方案。

4

1 回答 1

3

一般来说,您可以使用listAfromControl.Arrow.ArrowList来执行此操作。它有类型(ArrowList a) => a b c -> a b [c]并且是

用于将箭头转换为确定性版本的组合器,所有结果都收集在单个元素列表中。

(有关具体示例,请参见我的答案herehere。)

在这种特定情况下,您可以使用>.带有XmlList构造函数的组合子作为其第二个参数来更简洁地完成相同的事情。

于 2010-10-27T12:33:48.213 回答