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.

Past 1

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}]]
knihovny/hxt.txt · Poslední úprava: 2009/04/15 10:41 (external edit)
Nahoru