用 xml-lens 提取 nth-child

Extract nth-child with xml-lens

我正在尝试从 XML 中获取第一个 <bar> 的带有 xml-lens 的文本节点,如下所示:

<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-lens 实现不可能吗? 我应该向 xml-lens 或其他项目提交问题吗?

这是正确的行为。

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

您可能想改用 el "foo" . indexing (plate . el "bar") . index 0el "foo" . elementOf (plate . el "bar") 0。这些处理 "bar".

的多次出现