HXT
from HaskellでXML
Haskell XML Toolbox
Arrow型クラスベースのXML parser関連のtoolbox
10種類程度のpackageから構成される
website
github
hackage
wiki
仕組み
getting started
example
etc.
examples
基本的なデータ構造
Text.XML.HXT.DOM.TypeDefsらへんで定義されている ref
code: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を扱い祭はこれが中心概念となる
例を見ればだいたい対応がわかる
code:xml
<rss version="2.0" piyo="fuga"><div>hoge</div></rss>
code:XMLTrees
[NTree
(XTag "rss"
[NTree
(XAttr "version")
[NTree (XText "2.0") []]]
,NTree
(XAttr "piyo")
[NTree (XText "fuga") []]])
[NTree
(XTag "div" [])
[NTree (XText "hoge") []]]
#WIP
https://stackoverflow.com/questions/66756351/parsing-xml-with-haskell-with-hxt
https://stackoverflow.com/questions/10558003/how-to-get-utf8-rss-feed
https://github.com/sinelaw/xml-to-json/blob/master/src/Text/XML/JSON/XmlToJson.hs
jsonに変換
#??
何が嬉しくてArrow使ってるのか
DTD
https://ja.wikipedia.org/wiki/Document_Type_Definition
code:xml
<!ELEMENT 要素名 構成要素>
https://atmarkit.itmedia.co.jp/ait/articles/0307/16/news001.html
tagsoup
大まかにわけると
XML→NTree
NTree→hs
NTree→XML
https://wiki.haskell.org/HXT/Conversion_of_Haskell_data_from/to_XML
XMLからhs dataに変換する
Pickler
2つの関数 #??
属性と子を並列にrecord型で定義する
属性がない場合なくて、単体の子しかない場合はMapにする
考え方としては、1fieldのRecordだからMapにする、という感じ
だから別にrecordでもいいっちゃいい
XmlPickler型クラスが用意されてる
code: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.icon
この辺の用意されたpicklerを使って自作型向けのやつを定義していく
https://wiki.haskell.org/HXT/Practical
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.icon
deepとの差異をよくわかっていないmrsekut.icon
>>>
andと見なせる
ArrowとListの関連をうまく使った定義をしている
ちゃんと見てみると面白そう
条件分岐
orElse
||のイメージ
guards
when
<+>
orみたいなやつ
たぶんArrow型クラス内の演算子
writeDocument
書き込みの方
renderの方
今回は必要ないはず
Expat XML parserが具体的に何がスゴイのかわからんので、採用しづらい