首页 > 解决方案 > xml-conduit:如何修改文档?

问题描述

xml-conduit 教程(现存的唯一一个,也许是唯一一个带有教程的 Haskell XML 库)展示了如何创建或读取 XML 文档,但没有展示如何修改文档。我熟悉此类操作的唯一方法是使用 lxml/elementtree (python),它只能通过副作用(我知道)起作用。我怀疑这里有一种非常不同的方法。

假设我有一个简单的文档:

<html>
    <head>
        <title>My <b>Title</b></title>
    </head>
    <body>
        <p>Paragraph 1.</p>
        <p>Paragraph 2.</p>
    </body>
</html>

如何:
- 修改标题?
- 删除本文件的第一段?
- 将此文档的正文附加到另一个文档的正文中?

随意使用其他 Haskell 库提出和贡献解决方案。社区可以使用更多示例。

标签: xmlhaskellxml-conduit

解决方案


通过阅读 XML 文档并编写一个新文档,保持您想要的相似之处,但在您想要的方面有所不同。

假设你有一个document:: Document. 如果您更喜欢记录语法而不是镜头,您可能会得到一个类似于以下的解决方案。公平地说,将其重构为具有描述性名称的小函数可以使其更具可读性。或者,您可以使用 Lens,这是一个小型通用函数库,其名称难以描述,对这种 DOM 树操作非常有用。

document{ documentRoot=
    (documentRoot document){ elementNodes=
        (documentRoot document
        & elementNodes
        & (\[head,NodeElement body]->
            [head,NodeElement body{elementNodes=
                [elementNodes body & last]
        }]))
    })
}

推荐阅读