haskell xml使用HXT库更新文本

时间:2016-05-17 07:05:28

标签: xml haskell

我需要有可能更新结构中的文本,例如<node><data key="attr">text</data></node>。有没有办法在haskell中使用HXT库?

1 个答案:

答案 0 :(得分:1)

自然答案是镜头库;我不认为hxt有与之相关的事情。但xml-lens使用xml-conduit(但实际上不是渠道)

自述文件https://github.com/fumieval/xml-lens中的示例非常简单,但如果您不熟悉镜头,可能会有一些操作员堵塞。但这里是其中一个例子的密集版本。它通过添加&#34;修改图书列表中的每个页码。页面&#34;对它,改变

  <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

然后我使用over some_traversal some_function

来定义一个普通的Haskell函数
  >>> 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>

考虑到它在表面下方使用的奇特装置,这可能会有点慢,但显然很疯狂。