# composite-xml A simple xml parser/printer type using composite records. RecXML is defined like ``` data RecXML :: Symbol -> [Type] -> [Type] -> Type where RNode :: Rec Maybe xs -> [Field ys] -> RecXML s xs ys ``` An `RNode` is typed indexed by it's node name, an index of attributes it may contain, and list of child node types of which it may contain any number or multiplicity. The child nodes will typically also be RecXMLs, but this is not enforced. ``` withLensesAndProxies [d| type A = "a" :-> Text type B = "b" :-> Int type C = "c" :-> Bool type D = "d" :-> Text type E = "e" :-> Int |] type Child1 = RecXML "Child1" '[C] '[] type Child2 = RecXML "Child2" '[D, E] '[] type Root = RecXML "Root" '[A, B] '[Child1, Child2] child1 :: Child1 child1 = RNode (Just True :^: RNil) [] child2 :: Child2 child2 = RNode (Just "bar" :^: Just 7 :^: RNil) [] child2b :: Child2 child2b = RNode (Just "quux" :^: Just 8 :^: RNil) [] root :: Root root = RNode (Just "foo" :^: Just 5 :^: RNil) $ [field child1, field child2, field child2b] ``` corresponds to the xml ``` ```