Nedávno jsem se učil s knihovnou Haskell XML Toolbox. Má docela rozumně malou sadu funkcí a kombinátorů a podle tutorialu šlo všechno hladce. Jako vetšina haskellu, ma i tato knihovna problémy s hlášením chyb, takže níže jsou uvedeny nějaké pasti.
Při parsování xml je důležitý option [(a_remove_whitespace, v_1)] . Pokud parsujete xml, které je formátované pro čtení člověkem, je mezi tagy spousta whitespace, který parser neumí interpretovat.
Mějme testovací program test.hs
import Text.XML.HXT.Arrow data A = A { aValue1 :: String, aValue2 :: Bool, aValue3 :: Int } deriving (Eq, Show) data B = B { bValue1 :: String, bValue2 :: A } deriving (Eq, Show) instance XmlPickler A where xpickle = xpA instance XmlPickler B where xpickle = xpB xpA :: PU A xpA = xpElem "A" $ xpWrap ( uncurry3 A, \a -> (aValue1 a, aValue2 a, aValue3 a) ) $ xpTriple xpText (xpAttr "VAL2" xpPrim) (xpAttr "VAL3" xpPrim) xpB :: PU B xpB = xpElem "B" $ xpWrap ( uncurry B, \b -> (bValue1 b, bValue2 b) ) $ xpPair (xpAttr "VAL1" xpPrim) xpickle
a xml soubor a.xml
<L> <A VAL2="True" VAL3="3">testA</A> <A VAL2="False" VAL3="4">testB</A> </L>
Pak můžeme program vyzkoušet v ghci:
#: ghci test.hs *Main> runX (xunpickleDocument (xpElem "L" $ xpList $ xpA) [(a_validate, v_0)] "a.xml") [[]] ''
Žádné hlášení o chybě, nic. A přitom po malé úpravě dělá kód přesně to, co chceme.
*Main> runX (xunpickleDocument (xpElem "L" $ xpList $ xpA) [(a_validate, v_0),(a_remove_whitespace, v_1)] "a.xml")
[[A {aValue1 = "testA", aValue2 = True, aValue3 = 3},A {aValue1 = "testB", aValue2 = False, aValue3 = 4}]]