2016-05-17 4 views
2

このような構造でテキストを更新する必要があります。<node><data key="attr">text</data></node> haskellでHXTライブラリを使ってこれを行う方法はありますか?haskell xmlはHXTライブラリを使用してテキストを更新します

+1

こんにちは、こんにちは、stackoverflowへようこそ - これは、人々が質問に答え、お互いを無料で助けるプラットフォームです。だから誰かがそれに答えてくれると思うように**少なくともあなたの質問に**努力を払ってください**。あなたは試したこと、偉大な検索エンジンがあなたに語ったことを示すことができます。あなたが理解していないドキュメントや一般的にどこにいるのかを参照できます。今私があなたの努力に基づいて答えに入れようとしている努力は、「私はそれが可能だと思う」 – epsilonhalbe

答えて

1

自然な答えはレンズライブラリです。私はhxtにそれに関連したものがあるとは思わない。あなたは、レンズに精通していない場合でも、README https://github.com/fumieval/xml-lensxml-conduit(実際にはなく、導管)を使用していますxml-lens

がある例は、かなり簡単ですが、多分ビット演算-詰まっ。しかしここでは例の1つの密度の低いバージョンです。私たちは、輸入を必要とする

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

:それはこのようなXMLで始まる

<pages>360 pages</pages> 

<pages>360</pages> 

を変更し、それへの「ページ」を追加することにより、ブックリストの各ページ番号を変更しますこれらのようなもの

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

>>> let my_transformation = over my_focus (<> " pages") -- i.e. apply (<> " pages") to 
    >>> :t my_transformation        -- all the focused positions 
    my_transformation :: Document -> Document 

を使用して、それの面で通常のHaskellの関数を定義するには、ドキュメントをお読みください。

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

これは、表面下で使用している派手な装置を考えると少し遅いかもしれませんが、明らかに狂気のように強力です。

関連する問題