gpt4 book ai didi

haskell - HXT:在 Haskell 中使用 HXT 按位置选择节点?

转载 作者:行者123 更新时间:2023-12-02 19:07:58 27 4
gpt4 key购买 nike

我正在尝试使用 Haskell 解析一些 XML 文件。对于这项工作,我使用 HXT获取有关现实世界应用中箭头的一些知识。所以我对箭头主题还很陌生。

在 XPath(和 HaXml )中,可以按位置选择节点,比方说:/root/a[2]/b

即使一遍又一遍地阅读文档后,我也不知道如何使用 HXT 做类似的事情。

这是我正在使用的一些示例代码:

module Main where

import Text.XML.HXT.Core

testXml :: String
testXml = unlines
[ "<?xml version=\"1.0\"?>"
, "<root>"
, " <a>"
, " <b>first element</b>"
, " <b>second element</b>"
, " </a>"
, " <a>"
, " <b>third element</b>"
, " </a>"
, " <a>"
, " <b>fourth element</b>"
, " <b>enough...</b>"
, " </a>"
, "</root>"
]

selector :: ArrowXml a => a XmlTree String
selector = getChildren /> isElem >>> hasName "a" -- how to select second <a>?
/> isElem >>> hasName "b"
/> getText

main :: IO ()
main = do
let doc = readString [] testXml
nodes <- runX $ doc >>> selector
mapM_ putStrLn nodes

期望的输出是:

third element

提前致谢!

最佳答案

我认为选择“/root/a[2]/b”的解决方案(第二个“a”标签内的所有“b”标签):

selector :: ArrowXml a => Int -> a XmlTree String
selector nth =
(getChildren /> isElem >>> hasName "a") -- the parentheses required!
>. (!! nth)
/> isElem >>> hasName "b" /> getText

(结果为[“第三个元素”])。

解释:正如我所见,class (..., ArrowList a, ...) => ArrowXml a,因此 ArrowXml a 的子类>箭头列表。浏览ArrowList界面:

(>>.) :: a b c -> ([c] -> [d]) -> a b d
(>.) :: a b c -> ([c] -> d) -> a b d

因此 >>. 可以使用一些提升的 [c] -> [d]>. 来选择列表的子集使用 [c] -> d 类型的提升函数从列表中选择单个项目。因此,在选择子项并过滤标签“a”后,让我们使用 (!! nth)::[a] -> a

有一件重要的事情需要注意:

infix 1 >>>
infix 5 />
infix 8 >.

(所以我很难弄清楚为什么不带括号的 >. 不能按预期工作)。因此, getChildren/> isElem >>> hasName "a" 必须用括号括起来。

关于haskell - HXT:在 Haskell 中使用 HXT 按位置选择节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798417/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com