1

あるタイプの値コンストラクターを特定の属性の XML 属性値にシリアル化し、XML 属性値をそのタイプの値コンストラクターに逆シリアル化する xpickle を作成しようとしています。

次のデータがあります。

module Main where

import Text.XML.HXT.Core

newtype Things = Things [Thing]
data Thing = Thing (Maybe Property)
data Property = A | B

someThings :: Things
someThings = Things [ Thing (Just A)
                    , Thing Nothing
                    , Thing (Just B)
                    ]

そして、これを次のようなものにシリアライズしたいと思います:

<things>
  <thing property="a" />
  <thing />
  <thing property="b" />
</things>

これが私が取っているアプローチです:

instance XmlPickler Things where
  xpickle = xpWrap ( \things -> Things things , \(Things things) -> things ) $
            xpElem "things" $
            xpThings

xpThings :: PU [Thing]
xpThings = xpList xpickle

instance XmlPickler Thing where
  xpickle = xpElem "thing" $
            xpWrap ( \p -> Thing p , \(Thing p) -> p ) $
            xpProperty

xpProperty :: PU (Maybe Property)
xpProperty = xpOption $ xpAttr "property" xpPropertyValue

xpPropertyValue :: PU Property
xpPropertyValue = xpAlt tag ps
  where
    tag A = 1
    tag B = 2
    ps = [ xpTextAttr "a"
         , xpTextAttr "b"
         ]

main :: IO ()
main = do
  putStrLn $ showPickled [ withIndent yes ] someThings
  return ()

ここでは、属性をxpProperty作成または読み取り、値を計算するために使用します。値の値コンストラクターに応じて値を決定します。ここでの問題は、それが必要な場所で使用しようとしているということです。しかし、値の値コンストラクターに依存する値を生成する別の方法を見つけることはできません。@propertyxpPropertyValuexpPropertyValueA"a"B"b"xpTextAttrxpTextAttrString -> PU StringPU PropertyPU PropertyProperty

4

1 に答える 1

0

これはxpTextAttr正しく使用されていません。まず、最初のパラメーターは属性名"property"である必要があり、次に、一致するテキストを返します。

AコンストラクターまたはBそれぞれを返したい。

プロパティ (または) のテキスト コンテンツとそれらのコンストラクターxpWrapの間のマッピング (双方向) を指定するには、を使用する必要があります。タグは 0 ベースだと思いますので、0 と 1 です。"a""b"

where
  tag A = 0
  tag B = 1
  ps = [ xpWrap (const A,const "a") $ xpTextAttr "property"
       , xpWrap (const B,const "b") $ xpTextAttr "property"
       ]

次に、への呼び出しxpAttrが間違っています。正直なところxpAttr、修飾名と関係があるのか​​ 、何のためにあるのかわかりません。実際、十分なコードxpProperty

xpProperty :: PU (Maybe Property)
xpProperty = xpOption $ xpPropertyValue
于 2015-09-17T11:16:24.190 に答える