generated at
HXT

Haskell XML Toolbox
Arrow型クラスベースのXML parser関連のtoolbox
10種類程度のpackageから構成される

仕組み
getting started
example
etc.


基本的なデータ構造
Text.XML.HXT.DOM.TypeDefsらへんで定義されている ref
hs
data NTree a = NTree a [NTree a] data XNode = XText String | ... type XmlTree = NTree XNode type XmlTrees = [XmlTree]
NTree
Nodeと、子TreeのList
Listが空ならtreeのleafであることを表す
a で多相ってるので、これ自体は任意のtreeを表している
XNode
XMLのAST
QName はxmlの属性名を表す
XMLTree
XMLに具体化されたTree
HXTを扱い祭はこれが中心概念となる
例を見ればだいたい対応がわかる
xml
<rss version="2.0" piyo="fuga"><div>hoge</div></rss>
XMLTrees
[NTree (XTag "rss" [NTree (XAttr "version") [NTree (XText "2.0") []]] ,NTree (XAttr "piyo") [NTree (XText "fuga") []]]) [NTree (XTag "div" []) [NTree (XText "hoge") []]]






jsonに変換

何が嬉しくてArrow使ってるのか
xml
<!ELEMENT 要素名 構成要素>


大まかにわけると
XML→NTree
NTree→hs
NTree→XML




XMLからhs dataに変換する
Pickler
2つの関数 #??
属性と子を並列にrecord型で定義する
属性がない場合なくて、単体の子しかない場合はMapにする
考え方としては、1fieldのRecordだからMapにする、という感じ
だから別にrecordでもいいっちゃいい
XmlPickler型クラスが用意されてる
hs
class XmlPickler a where xpickle :: PU a
xpickle
基本的な型はinstanceになっており、 xpHoge という感じでpicklerがある
e.g. xpPrim, xpList, xpOption, ...
xpElem
xpAttr
xpWrap
2値ならtuple,
Map, List, とかで、相互変換する
xpWrap (tupleから戻す, tupleに変換) $ xpPair ..
この辺の関数は、生成と解析を担う
この辺の関数のことをpicklerと呼んでるのねmrsekut
この辺の用意されたpicklerを使って自作型向けのやつを定義していく



XML→???→???

filterの概念
type Filter a b = a -> [b] という型のものをfilterと呼ぶ
例えば、 type XmlFilter = XmlTree -> [XmlTree]
述語
selector
constructor
transformer
treeを別のtreeにmappingする関数
tracersal filter

traceMsg
中間結果を表示する
引数が 0 なら何も表示しない
isA
述語を引数にとってfilterを返す
普通の関数を、arrowにliftingする
arr
普通の関数を、arrowにliftingする


deep f
tree全体をtraverseする
filterである f 満たす全てのsub treeを収集する
multi f
こっちが全体のtraverseかmrsekut
deepとの差異をよくわかっていないmrsekut


>>>
andと見なせる
ArrowとListの関連をうまく使った定義をしている
ちゃんと見てみると面白そう

条件分岐
orElse
|| のイメージ
guards
when
<+>
orみたいなやつ
たぶんArrow型クラス内の演算子


writeDocument
書き込みの方
renderの方
今回は必要ないはず

Expat XML parserが具体的に何がスゴイのかわからんので、採用しづらい