2016-05-17 29 views
2

我需要更新文本結構的可能性,如<node><data key="attr">text</data></node>。在Haskell中使用HXT庫有沒有辦法做到這一點?haskell xml使用HXT庫更新文本

+1

嗨歡迎來到stackoverflow - 這是一個平臺,人們可以免費回答問題和互相幫助。所以請至少把**放在你的問題上,就像你期待有人回答它一樣。你可以告訴我們你試過的是什麼,偉大的搜索引擎告訴你什麼。您可以參考您不明白的地方或通常卡住的地方。現在我努力根據你的努力付出的努力是:「我認爲這是可能的。」 – epsilonhalbe

回答

1

自然的答案是鏡頭庫;我不認爲hxt有這樣的事情與它相關聯。但有xml-lens它使用xml-conduit(實際上而不是管道)

例子自述https://github.com/fumieval/xml-lens是相當簡單的,但也許有些運營商的堵塞,如果你不熟悉的鏡頭。但是這裏有一個例子的密度較小的版本。它修改在書中列表中的每個頁碼加入「頁」給它,改變

<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> 

考慮到它在表面以下使用的奇特設備,這可能會有點慢,但顯然是瘋狂的強大。