gpt4 book ai didi

haskell - 从子树中提取值

转载 作者:行者123 更新时间:2023-12-04 20:36:20 25 4
gpt4 key购买 nike

我正在使用 HXT 解析一个 XML 文件,并且我正在尝试将一些节点提取分解为模块化部分(我一直将其用作我的 guide )。不幸的是,一旦我进行第一级解析,我就无法弄清楚如何应用一些选择器。

 import Text.XML.HXT.Core

let node tag = multi (hasName tag)
xml <- readFile "test.xml"
let doc = readString [withValidate yes, withParseHTML no, withWarnings no] xml
books <- runX $ doc >>> node "book"

我看到书的类型为 [XmlTree]
 :t books
books :: [XmlTree]

现在我想获取 books 的第一个元素,然后在子树中提取一些值。
 let b = head(books)
runX $ b >>> node "cost"

Couldn't match type ‘Data.Tree.NTree.TypeDefs.NTree’
with ‘IOSLA (XIOState ()) XmlTree’
Expected type: IOSLA (XIOState ()) XmlTree XNode
Actual type: XmlTree
In the first argument of ‘(>>>)’, namely ‘b’
In the second argument of ‘($)’, namely ‘b >>> node "cost"’

一旦我有一个 XmlTree,我就找不到选择器,并且我展示了上述不正确的用法来说明我想要什么。我知道我可以这样做:
 runX $ doc >>> node "book" >>> node "cost" /> getText
["55.9","95.0"]

但我不仅对 cost 感兴趣,而且对 book 中的更多元素感兴趣。 XML 文件非常深,所以我不想用 <+> 嵌套所有内容,而且很多评价者更喜欢提取我想要的 block ,然后在单独的函数中提取子元素。

示例(虚构)XML 文件:
 <?xml version="1.0" encoding="UTF-8"?><start xmlns="http://www.example.com/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<books>
<book>
<author>
<name>
<first>Joe</first>
<last>Smith</last>
</name>
<city>New York City</city>
</author>
<released>1990-11-15</released>
<isbn>1234567890</isbn>
<publisher>X Publisher</publisher>
<cost>55.9</cost>
</book>
<book>
<author>
<name>
<first>Jane</first>
<last>Jones</last>
</name>
<city>San Francisco</city>
</author>
<released>1999-01-19</released>
<isbn>0987654321</isbn>
<publisher>Y Publisher</publisher>
<cost>95.0</cost>
</book>
</books>
</start>

有人可以帮我理解,如何提取 book 的子元素?理想情况下,使用像 >>>node 这样好的东西,这样我就可以定义自己的函数,例如 getCostgetName 等,每个函数都大致具有签名 XmlTree -> [String]

最佳答案

doc不是你想的那样。它的类型为 IOStateArrow s b XmlTree .你真的应该再读一遍你的指南,所有你想知道的都在标题下总结了"Avoiding IO" .

箭头基本上是函数。 SomeArrow a b可以被认为是 a -> b 类型的通用/专用函数. >>>范围内的其他运算符用于箭头组合,类似于函数组合。您的 books有类型 [XmlTree]所以它不是箭头,不能用箭头组成。满足您需求的是runLA ,它会转换像 node "tag" 这样的箭头正常功能:

module Main where

import Text.XML.HXT.Core

main = do
html <- readFile "test.xml"
let doc = readString [withValidate yes, withParseHTML no, withWarnings no] html
books <- runX $ doc >>> node "book"
-- runLA (node "cost" /> getText) :: XmlTree -> [String]
let costs = books >>= runLA (node "cost" /> getText)
print costs

node tag = multi (hasName tag)

关于haskell - 从子树中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986649/

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