xml - haskell xml使用HXT库更新文本

标签 xml haskell

我需要能够更新像这样的结构中的文本 <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/

相关文章:

c# - 操作 XML 文档的属性

javascript - 如何在纯 JavaScript 中执行 XML 的包容性规范化?

c# - new UTF8Encoding(false) 仍然写 utf8 BOM

java - JAXB 使用不同标签解码 XML 元素

haskell:使用高阶函数的阶乘

haskell - (fmap . fmap) 如何进行类型检查

Haskell GHCI 编译器 : Parse error in repl when defining and declaring a simple function

haskell - 在模式同义词中调用函数

php - XML DOM PHP 添加一个子节点到 root/links/link

haskell - Haskell 中的汉明数