Анализировать файл.mxl с помощью Clojure
Я хотел бы проанализировать файл.mxl (MusicXML) с помощью clojure
До сих пор я видел много инструментов для работы с файлами.xml, но я не могу найти способ работать с.mxl, возможно, мне сначала нужно преобразовать mxl в xml, но я не знаю, как это сделать.
2 ответа
Со страницы Википедии на MusicXML:
Текстовое представление, перечисленное выше, является многословным; MusicXML v2.0 решает эту проблему путем добавления сжатого формата zip с суффиксом.mxl, который может сделать файлы примерно на одну двадцатую размера несжатой версии.[16]
Я предполагаю, что ваш файл.mxl является сжатым файлом XML, и именно поэтому вы получаете ошибки синтаксического анализа. Насколько я могу судить, алгоритм сжатия является алгоритмом zip, так что вы должны быть в состоянии использовать zav-функциональность java, чтобы добраться до него.
РЕДАКТИРОВАТЬ
Я только что попробовал это с примером файла.mxl, который я нашел онлайн. Разархивированный файл.mxl содержал внутри него файл XML. Затем я смог использовать следующий (вдохновленный этим ответом), чтобы получить сырой XML...
(defn extract-mxl [path]
(let [[_ filename] (re-matches #"(.*)\.mxl$" (.getName (java.io.File. path)))
zipfile (java.util.zip.ZipFile. path)
zipentry (.getEntry zipfile (str filename ".xml"))
in (.getInputStream zipfile zipentry)]
(slurp in)))
Структура zip в MusicXML для файлов.mxl аналогична структуре формата EPUB. См. http://www.musicxml.com/tutorial/compressed-mxl-files/zip-archive-structure/ в учебнике MusicXML для получения дополнительной информации о том, где можно найти данные оценки XML в архиве MXL.
Если кто-то наткнется на это и не сможет понять, как распаковать сжатый файл mxl:
на Mac я просто переименовал его в.zip, и все прошло нормально!