我想用 clojure 解析一个 .mxl 文件(MusicXML)
到目前为止,我已经看到了很多使用 .xml 文件的工具,但我找不到使用 .mxl 的方法,也许我应该先将 mxl 转换为 xml,但我也不知道该怎么做。
从 MusicXML 的维基百科页面:
上面列出的文本表示是冗长的;MusicXML v2.0 通过添加带有 .mxl 后缀的压缩 zip 格式来解决这个问题,该格式可以使文件大小约为未压缩版本的二十分之一。 [16]
我猜您的 .mxl 文件是一个已压缩的 XML 文件,这就是您遇到解析错误的原因。据我所知,压缩算法是一种 zip 算法,因此您应该能够使用 java 的 zip 功能来实现它。
编辑
我刚刚在网上找到了一个示例 .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)))
MusicXML 的 .mxl 文件的 zip 结构类似于 EPUB 格式。请参阅MusicXML 教程中的http://www.musicxml.com/tutorial/compressed-mxl-files/zip-archive-structure/,了解有关在 MXL 存档中何处查找 XML 乐谱数据的更多信息。
如果有人偶然发现这一点,并且无法弄清楚如何解压缩压缩的 mxl 文件:
在 Mac 上,我只是将其重命名为 .zip 并且效果很好!