Collapse Pfeil Liste
Frage
Ich habe einige Probleme mit HXT , obwohl ich vermute, es ist nur etwas fehlt mir über Pfeile.
Ich habe eine XML-Struktur wie
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
Und interne Struktur wie
data XmlData = XmlStr String | XmlList XmlData
Gibt es eine Möglichkeit zu sammeln Elemente in einem Schritt in einem Pfeil?
getXmlData :: IOSArrow XmlTree (String, XmlData)
getXmlData = (getAttrl >>> getChildren >>> getText) &&&
((filterByType "str" >>> getText >>> arr (\x -> XmlStr x))
<+> (filterByType "lst" >>> getXmlData))
where filterByType t = isElem >>> hasName t >>> getChildren
Der rekursive Aufruf GetXMLData braucht es die Antwort und wickelt in einem XMLList-Konstruktor zu sammeln, aber ich weiß nicht, wie Begriffe zu sammeln. Ich dies zu erreichen zur Zeit mit etwas Nachbearbeitung am Ausgang (auf dem gleichen Namen zu sammeln), aber ich würde eine bessere Lösung gefällt.
Lösung
In der Regel können Sie listA
von Control.Arrow.ArrowList
dies zu tun. Es hat Typ (ArrowList a) => a b c -> a b [c]
und ist ein
combinator zum Umwandeln eines Pfeils in eine determinstic Version mit allen Die Ergebnisse in einem einzigen Element gesammelt Liste.
(Siehe meine Antworten hier und hier für ein konkretes Beispiel.)
In diesem speziellen Fall, dass Sie den >.
combinator mit dem XmlList
Konstruktor als zweites Argument verwenden, um die gleiche Sache prägnanter zu erreichen.