0

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 库提出和贡献解决方案。社区可以使用更多示例。

4

2 回答 2

0

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

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

document{ documentRoot=
    (documentRoot document){ elementNodes=
        (documentRoot document
        & elementNodes
        & (\[head,NodeElement body]->
            [head,NodeElement body{elementNodes=
                [elementNodes body & last]
        }]))
    })
}
于 2020-04-03T11:42:03.750 回答
0

另一种方法。

from simplified_scrapy import SimplifiedDoc 
html = '''<html>
    <head>
        <title>My <b>Title</b></title>
    </head>
    <body>
        <p>Paragraph 1.</p>
        <p>Paragraph 2.</p>
    </body>
</html>'''
doc = SimplifiedDoc(html)
title = doc.title
title.setContent('Modify <b>Title</b>')
firstP = doc.body.p
firstP.repleaceSelf("")
p = doc.p
p.insertAfter(p.outerHtml)
print (doc.html)

结果:

<html>
    <head>
        <title>Modify <b>Title</b></title>
    </head>
    <body>

        <p>Paragraph 2.</p><p>Paragraph 2.</p>
    </body>
</html>

这里有更多例子:https ://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

于 2020-05-16T09:34:21.353 回答