使用Clojure解析.mxl文件

3
我希望您能用Clojure解析.MXL文件(MusicXML)。
到目前为止,我已经看到了许多处理.XML文件的工具,但是我找不到处理.MXL文件的方法。也许我应该先将MXL转换为XML,但我不知道如何操作。

你尝试过将文件解析为XML吗?根据维基百科的例子,看起来是可行的。 - ponzao
我遇到了这个异常:SAXParseException 内容不允许在 prolog 中。com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException (ErrorHandlerWrapper.java:195) - szymanowski
这个异常可能与XML解析代码无关,而是与文件有关,请查看 SO问题,以获取有关您遇到的异常的可能解决方案。 - juan.facorro
3个回答

4
从MusicXML的维基百科页面上可以看出,上面列出的文本表示方式很冗长;MusicXML v2.0通过添加一个带有.mxl后缀的压缩zip格式来解决这个问题,可以使文件大小约为未压缩版本的1/20。我猜你的.mxl文件是已经被压缩的XML文件,这就是为什么你会收到解析错误的原因。据我所知,压缩算法是zip算法,因此您应该能够使用Java的zip功能来访问它。
编辑
我刚刚尝试了一下在网上找到的一个样本.mxl文件。一旦解压缩,.mxl文件就包含其中的xml文件。然后,我就能够使用以下代码(受this answer启发)来获取原始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)))

我在测试一个找到的 .mxl 文件后进行了编辑...之前的代码不起作用,对此我很抱歉! - Daniel Neal
文件名 => "inv1" 压缩文件 => #<ZipFile java.util.zip.ZipFile@5070b2f8> 压缩条目 => 无 NullPointerException java.util.zip.ZipFile.getInputStream (ZipFile.java:194) - szymanowski
这个 .xml 文件是自动生成的还是需要手动创建?很抱歉,我不太了解 Java Zip 相关的内容。 - szymanowski
尝试手动解压文件并查看其中的内容。上述代码假定<filename>.mxl在解压时包含<filename>.xml。 - Daniel Neal
好的,我知道了...在尝试你的代码之前,我已经更改了文件名:)现在它可以工作了!感谢您的耐心。 - szymanowski
显示剩余2条评论

1

0

如果有人偶然发现这个问题,无法解压缩的mxl文件:

在Mac上,我只需将其重命名为.zip,就可以成功解压缩了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接