用xml镜片提取nth-child

时间:2015-12-24 16:22:47

标签: haskell lens

我正在尝试从这样的XML中获取带有xml-lens的第一个<bar>文本节点:

<foo>
  <bar>
    I want ONLY this!
  </bar>
  <bar>
    I DON'T want this!
  </bar>
</foo>

换句话说,我想写一个与XPath /foo/bar[1]/text()

相当的镜头表达式

首先,我写了一个像下面这样的haskell脚本:

{-# LANGUAGE OverloadedStrings #-}

import           Control.Lens
import           Text.XML.Lens
import           Text.HTML.DOM
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as TIO

main :: IO ()
main = do
  input <- TIO.getContents
  parseLT input & toListOf (root . el "foo" ./ indexing (el "bar") . index 0 . text) & map T.fromStrict & T.unlines & TIO.putStr

但实际上有第一和第二 <bar>的文字:

> stack runghc sample.hs  < input.xml

    I want ONLY this!


    I DON'T want this!

目前的xml镜头实现不是这样吗? 我应该向xml-lens或其他项目提交问题吗?

1 个答案:

答案 0 :(得分:1)

这是正确的行为。

indexing将指数分配给遍历的目标; el最多只有一个目标,因此只会给出0。

您可能希望使用el "foo" . indexing (plate . el "bar") . index 0el "foo" . elementOf (plate . el "bar") 0。这些处理多次出现"bar"