Вопрос

У меня проблемы с некоторыми проблемами HXT., Хотя я подозреваю, что это просто то, что я скучаю по стрелкам.

У меня есть структура XML, как

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

И внутренняя структура, как

data XmlData = XmlStr String | XmlList XmlData

Есть ли способ собирать элементы на шаге в стрелке?

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

Рекурсивный вызов GetXMLDATA должен собирать свой ответ и обернуть в конструкторе XMllist, но я не знаю, как собирать условия. В настоящее время я выполняю это с какой-то после обработки на выходе (сбор на том же имени), но я хотел бы лучшее решение.

Это было полезно?

Решение

В общем вы можете использовать listA от Control.Arrow.ArrowList сделать это. У этого есть тип (ArrowList a) => a b c -> a b [c] и это А.

Комбинатор для преобразования стрелки в определяющую версию со всеми результатами, собранными в одном списке элементов.

(См. Мои ответы здесь и здесь Для конкретного примера.)

В этом конкретном случае вы можете использовать >. комбинатор с XmlList Конструктор как его второй аргумент для достижения того же самого кратко.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top