用 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 0
或 el "foo" . elementOf (plate . el "bar") 0
。这些处理 "bar"
.
的多次出现
我正在尝试从 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 0
或 el "foo" . elementOf (plate . el "bar") 0
。这些处理 "bar"
.