Haskell 如何跳过xml管道中的元素

Haskell 如何跳过xml管道中的元素,haskell,xml-conduit,Haskell,Xml Conduit,我必须处理相当大的XML文件,我想使用XMLconductor的流式API来遍历它们并提取我需要的信息。 在我的例子中,使用streamingXMLconductor特别有吸引力,因为我不需要从这些文件中获取太多数据,而且我需要在这些文件上执行简单的聚合,这样conduction就完美了 现在,我并不总是知道文件的确切结构。文件是由世界各地不同版本(有时有缺陷)的软件生成的,所以我不能强加模式 然而,我知道我感兴趣的元素和它们的形状。但是,正如我所说,这些元素可以与其他元素以不同的顺序排列,等等

我必须处理相当大的XML文件,我想使用
XMLconductor
的流式API来遍历它们并提取我需要的信息。 在我的例子中,使用streaming
XMLconductor
特别有吸引力,因为我不需要从这些文件中获取太多数据,而且我需要在这些文件上执行简单的聚合,这样conduction就完美了

现在,我并不总是知道文件的确切结构。文件是由世界各地不同版本(有时有缺陷)的软件生成的,所以我不能强加模式

然而,我知道我感兴趣的元素和它们的形状。但是,正如我所说,这些元素可以与其他元素以不同的顺序排列,等等

我想,我只需要跳过所有我不感兴趣的元素,而只考虑那些需要的元素。

我最初想写这样的东西:

tagName "person" (requireAttr "age" <* ignoreAttrs) <|> ignoreTag (const True)
标记名“person”(如建议,要求标记名“age”

λ>runconductor$Text.XML.Stream.Parse.parseLBS def“Barmichaelelezer”。|许多|(选择[takeTree“person”ignoreAttrs,ignoreAnyTreeContent])。|许多|数据.conduct.List.consume
[第25人“迈克尔”,第2人“埃利泽”]

fmap(可能为空(常量为空))(ignoreTag.)::对于任何类型的
b
,可能都是b
。是的,我也尝试过类似的方法,但仍然不是我所需要的,因为如果我返回
Nothing
,整个解析器都会失败。我想我需要一个类似于过滤器的方法。关于
可能
,没有什么特别之处-它并不表示“解析器”失败,尤其是失败h对
ConduitM i o m r
MonadThrow m
约束。因此,如果您的解析器出现故障,则是您自己编写的逻辑导致了故障。您已经使用了类似
many
的方法来重复解析器,在这种情况下,您需要使用
以外的其他方法来指示代码中的逻辑故障,如
xml管道
已经将
Maybe
用于自己的用途(
Maybe(Maybe X)
将起作用,然后更改
Nothing
->
只是Nothing
catMaybes
),您能发布代码的相关部分和一些示例输入吗?
λ> runConduit $ Text.XML.Stream.Parse.parseLBS def  "<foo>bar</foo><person age=\"25\">Michael</person><person age=\"2\">Eliezer</person>" .| many_ (choose [takeTree "person" ignoreAttrs, ignoreAnyTreeContent]) .| manyYield parsePerson .| Data.Conduit.List.consume 
[Person 25 "Michael",Person 2 "Eliezer"]