XML计数TXT

时间:2011-05-03 19:51:37

标签: xml recursion tree

查看以下XXX数据:

lala XXX = EL String [XXX]
         | TXT String
         | MMS String

为此,XXX数据<r><r>y</s>pp<s>z</r></r>

构建
lala "r" [ Element "ss" [Text "er"], 
              Text "dd",
              Element "pp" [Text "tet"] ]

2 个答案:

答案 0 :(得分:2)

由于这基本上是家庭作业,我会给你提示而不是答案。

Text项目的答案是什么?将其写成“elemCount(Text _)= ....”

的形式

“元素”项目的答案是什么?以“elemCount(List _ children)= ...”

的形式写下来

答案 1 :(得分:1)

因此,基本思想是遍历树并查找匹配XML的所有数据构造函数。我们的函数只为任何Text数据构造函数返回1,为1 Element数据构造函数添加所有子列表的总和。因此,它看起来像这样:

countTags (Element _ list) = 1 + sum $ map countTags list
countTags _ = 1

这是基本的解决方案。但它有点低效,因为它使用真正的递归。更好的想法是通过手动传递计数器和列表遍历:

countTag = countTag' 0 where
  countTag' n (Element _ list) = foldr (flip countTag') (n+1) list
  countTag' n _ = (n+1)

我没有比较这两个功能,但凭直觉,第二个应该表现得更好。