我需要能够更新像这样的结构中的文本 <node><data key="attr">text</data></node>
。有没有办法通过在 haskell 中使用 HXT 库来做到这一点?
最佳答案
自然的答案是镜头库;我不认为 hxt
有这样的东西与之相关。但是有 xml-lens
使用 xml-conduit
(但实际上不是管道)
自述文件中的示例 https://github.com/fumieval/xml-lens相当简单,但如果您不熟悉镜头,可能会有点运算符(operator)堵塞。但这里是其中一个示例的不太密集的版本。它通过添加“pages”来修改图书列表中的每个页码,更改
<pages>360</pages>
到
<pages>360 pages</pages>
从这样的 XML 开始:
<?xml version="1.0" encoding="ISO-8859-1"?>
<books>
<book category="Textbooks">
<title>Learn You a Haskell for Great Good!</title>
<author year="2011">Miran Lipovaca</author>
<pages>360</pages>
</book>
<book category="Textbooks">
<title>Programming in Haskell</title>
<author year="2007">Graham Hutton</author>
<pages>200</pages>
</book>
</books>
我们需要这样的导入
>>> import Text.XML.Lens -- from the lens-xml package
>>> import Control.Lens -- from the lens package
>>> import Text.XML -- from the xml-conduit package
>>> import Data.Monoid ((<>))
>>> import qualified Data.Text as T
>>> import qualified Data.ByteString.Lazy.Char8 as BL
>>> :set -XOverloadedStrings -- for Text literals
首先,我定义针对我想要更改的内容的遍历:
>>> let my_focus = root . el "books" ./ el "book" ./ el "pages" . text
然后我根据它定义一个普通的 Haskell 函数,使用 over some_traversal some_function
>>> let my_transformation = over my_focus (<> " pages") -- i.e. apply (<> " pages") to
>>> :t my_transformation -- all the focused positions
my_transformation :: Document -> Document
阅读文档:
>>> doc <- Text.XML.readFile def "book.xml"
>>> :t doc
doc :: Document
然后转换并渲染它:
>>> BL.putStrLn $ renderLBS def (my_transformation doc)
<?xml version="1.0" encoding="UTF-8"?><books>
<book category="Textbooks">
<title>Learn You a Haskell for Great Good!</title>
<author year="2011">Miran Lipovaca</author>
<pages>360 pages</pages>
</book>
<book category="Textbooks">
<title>Programming in Haskell</title>
<author year="2007">Graham Hutton</author>
<pages>200 pages</pages>
</book>
</books>
考虑到它在地表下使用的奇特设备,这可能有点慢,但显然非常强大。
关于xml - haskell xml使用HXT库更新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37269316/