我正在尝试从这样的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或其他项目提交问题吗?
答案 0 :(得分:1)
这是正确的行为。
indexing
将指数分配给遍历的目标; el
最多只有一个目标,因此只会给出0。
您可能希望使用el "foo" . indexing (plate . el "bar") . index 0
或el "foo" . elementOf (plate . el "bar") 0
。这些处理多次出现"bar"
。