Pregunta

Estoy teniendo algunos problemas con HXT , aunque sospecho que es sólo algo me falta sobre flechas.

Tengo una estructura XML como

<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>

Y estructura interna como

data XmlData = XmlStr String | XmlList XmlData

¿Hay una manera de elementos de cobro revertido a un paso en una flecha?

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

La llamada recursiva a getXmlData tiene que recogerla de respuesta y envolver en una constructora XMLLIST, pero no sé cómo recolectar términos. Actualmente estoy lograr esto con un poco de post-procesamiento en la salida (la recogida en el mismo nombre), pero me gustaría una solución mejor.

¿Fue útil?

Solución

En general se puede utilizar listA de Control.Arrow.ArrowList para hacer esto. Tiene tipo (ArrowList a) => a b c -> a b [c] y es un

  

combinador para convertir una flecha   en una versión con todas determinstic   resultados recogidos en un solo elemento   lista.

(Ver mis respuestas aquí y aquí para un ejemplo concreto.)

En este caso específico se puede utilizar el combinador >. con el constructor XmlList como segundo argumento a lograr lo mismo de manera más concisa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top