Pergunta

Estou tendo alguns problemas com Hxt, embora eu suspeite que seja apenas algo que estou perdendo sobre flechas.

Eu tenho uma estrutura XML como

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

E estrutura interna como

data XmlData = XmlStr String | XmlList XmlData

Existe uma maneira de coletar elementos em uma etapa em uma 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

A chamada recursiva ao getxmldata precisa coletar sua resposta e embrulhar em um construtor xmllist, mas não sei como coletar termos. Atualmente, estou realizando isso com algum pós -processamento na saída (coletando com o mesmo nome), mas gostaria de uma solução melhor.

Foi útil?

Solução

Em geral você pode usar listA a partir de Control.Arrow.ArrowList para fazer isso. Tem tipo (ArrowList a) => a b c -> a b [c] e é um

Combinador para converter uma seta em uma versão determinante com todos os resultados coletados em uma única lista de elementos.

(Veja minhas respostas aqui e aqui para um exemplo concreto.)

Neste caso específico, você pode usar o >. Combinador com o XmlList Construtor como seu segundo argumento para realizar a mesma coisa de maneira mais concisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top