Я хочу использовать модуль Haskell Text.XML.Cursor для анализа XML-документа.
Сначала я конвертирую документ в курсоры с помощью fromDocument, затем применяю фильтр. Теперь я хочу вернуть документ. Я думаю, что должна быть функция toDocument, но, похоже, нет. Как я могу преобразовать измененные курсоры обратно?





Вот функция filterDocument, которая должна делать то, что вы хотите:
import Text.XML (Document(..), Node(..))
import Text.XML.Cursor (Cursor, fromDocument, node)
filterDocument :: (Cursor -> Cursor) -> Document -> Maybe Document
filterDocument f doc = case node (f (fromDocument doc)) of
NodeElement root -> Just doc{ documentRoot = root }
_ -> Nothing
По сути, я просто посмотрел на определение fromDocument и перевернул то, что он делал. Два примечания:
Document, потому что fromDocument отбрасывает пролог и эпилог.Maybe, потому что возвращаемый Cursor может указывать на узел, не являющийся элементом (например, комментарий или текстовый узел), но XML-документу нужен элемент в качестве корня.
В некоторых случаях это может сработать, но имейте в виду, что при этом теряется довольно много информации, доступной в
Cursor.Cursor— это указатель на конкретный узел где-то глубоко в документе, но он также содержит информацию обо всех предках и братьях и сестрах, которую эта функция отбрасывает. (Хорошо это или нет, я подозреваю, во многом зависит от приложения!)