Анализировать файл.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, и все прошло нормально!

Другие вопросы по тегам