一回も披露したことのない豆知識

Denemoというソフトが出力した .denemo ファイルを読み書きしたいのです。
.denemo ファイルは MusicXML という形式のようなのですが、バイナリファイルなのでどのように扱えば良いのかわからず質問しました。
XML parser というものが関係あるようなのですが、よくわかりません。

まずは、バイナリ形式のXMLをテキスト形式で読みたい。
次に、バイナリ形式のXMLをプログラム(C++)で操作して読み書きしたい。
と、思っています。

OS は Windows XP で、コンパイラは g++ を使用しています。
よろしくお願いいたします_(_ _)_

A 回答 (6件)

>MusicXML という形式のようなのですが、バイナリファイルなので


譜面をXMLで記述しているだけで、ただのXMLファイルだと思います。

>まずは、バイナリ形式のXMLをテキスト形式で読みたい。
そもそも、XMLは文字コードを意識しているのですべてテキストで記述されます。つまり、XMLという時点でテキストファイルです。
ということで。

>バイナリ形式のXMLをプログラム(C++)で操作して読み書きしたい。
WindowsにはMSXMLと呼ばれるXMLパーサがIEやOfiiceなどに入っています。IEがほぼ標準で入っているので、最近のWindowsマシンにはほぼ入っているでしょう。COMを使用しているので、少し面倒。
MS.NetにはSystemXMLというXMLパーサがあります。
C++なら後者のほうがいいかもしれません。
    • good
    • 0

実証する環境がないので心苦しいのですが、


ググッてみたところ、

「(たぶんwin環境において)xmlSaveFormatFile()関数使うと
出力xmlファイルがバイナリになる」
という投稿
http://www.mail-archive.com/xml@gnome.org/msg044 …
を見つけました。
英語力がイマイチ足りないので、この投稿の、この後の
質問者と回答者のたどった経緯がはっきりつかめないのですが。
最終的に解決したっぽい?

---

ここで取り上げられているxmlSaveFormatFile()関数というのは、
libxml(というライブラリ)のAPIみたいです。

http://xmlsoft.planetmirror.com/html/libxml-tree …

---
Denemoのソースコードを(ググッて)見てみたのですが、
Denemoで「Denemo XML Format」を選択して
XMLファイル出力しようとすると、
最終的に(libxmlの)xmlSaveFile()関数が呼ばれる・・・
・・・ような気がするのですが。

---
Denemoの「ファイル出力GUI」部分と思われるソースコード。
gtkフレームワークを知らないので、
これまた全くのカンなのですが。
http://www.koders.com/cpp/fid2948DB0B5120E3FD609 …
(filesel_save()周辺)
    • good
    • 0
この回答へのお礼

かなり突っ込んで調べていただきありがとうございます。

Denemoのメーリングリストにメールを出したのですが、ちょうど今返事を
もらえました。
結局、DenemoはXMLをgzipしてから出力しているということがわかりました。
Denemo XML Formatファイルをgunzipするとテキスト形式のXML
(らしきもの。まだ中身をちゃんと見ていません。)になりました。
さらに、gunzipしたものを再びgzipするとDenemoで読み込むことができました。

しかし、ソースコードの中まで読むなんてすごいですね。
私はちょっとそこまではできないです(^^;

これで表題の「バイナリ形式のXMLファイルを読み書きしたい」は
解決しましたので締めたいと思います。
皆さんのご援助に感謝します!!ありがとうございました!

お礼日時:2007/08/31 23:34

>Denemo が出力した .denemo ファイル


MusicXMLを独自にバイナリ化したんだとしたら困難ですね。
普通ツールは互換性のために他のソフトとやり取りするファイルを出力できたりしますが、MusicXML形式では書き出せないんでしょうか?

>XML parser というのはテキスト形式で書かれた XML ファイルを読み込んで、プログラムが扱いやすい形に変換
ほぼ、その認識であってます。
パーサーは構文解析という意味で、よく使われるのは言語のインタプリタやコンパイルの構文解析ですね。
エレメント(タグ)の意味解析などは結局自分でやるしかないので、けっこう面倒だったりします。

この回答への補足

Denemo の保存ダイアログでは Denemo XML Format を選択して保存しています。
Denemo のホームページには「他のソフトと互換性を保つために MusicXML を
サポートしている」と書いてあるので、Denemo XML Format が MusicXML では
ないかと考えているのですが。。。

しかし、.denemo ファイルがバイナリ形式だということは違うのかもしれません。
このへんのことをフォーラムで質問してみようかと思います。

(初めて「教えて!goo」を利用していますが、予想外に回答が来るので
うれしい驚きです。回答してくださる皆さんに感謝!!)

補足日時:2007/08/30 12:39
    • good
    • 0

.denemoファイルがバイナリファイルであればそれはMusicXMLではないということになります。


バイナリの解析はファイルフォーマット等の情報がないと無理でしょう。

この回答への補足

php504さんありがとうございます!

やはりバイナリファイルであれば、XML ではないのですね。。。
Denemo はもともと UNIX/Linux 用ソフトのようなので、Windowsで実行して
いるために出力ファイルが文字化けすることがあるのかな、とも思ったのですが。

バイナリファイルであるということは、php504さんが言われたように開発元の
ファイルフォーマット情報がないとダメですよね。
Denemo のフォーラムに投稿してみます。(英語かぁ。。。頑張るしかない!!)

補足日時:2007/08/30 11:28
    • good
    • 0

ただのテキストじゃないでしょうか?


http://ja.wikipedia.org/wiki/MusicXML

開発環境がcygwinのようなので、GPLライセンスでかまわなければかなりありますよ。
http://www.nbrains.net/php/pukiwiki/index.php?li …
都合よく日本語なのは数少ないと思いますが、MiXとか少しはあります。

この回答への補足

aris_wizさん、zwiさん、早速の回答ありがとうございます!!

ただ説明がまずかったようで、Denemo が出力した .denemo ファイルは
テキストエディタで開こうとしても文字化けし、バイナリエディタで
開いても中身の意味がわかりません。

Denemo のホームページを見ると MusicXML で出力していると書かれて
いたのですが(英語なので確かではありませんが。。。)、
お二人の言われたように XML は本来テキストで書かれるべきものですよね。

それで、XML をバイナリで記述することもあるのかな、と思った次第です。
基本的な質問に戻りますが、XML parser というのはテキスト形式で
書かれた XML ファイルを読み込んで、プログラムが扱いやすい形に変換
(というか解釈)するもの、ということであっているでしょうか?

補足日時:2007/08/30 11:16
    • good
    • 0

>C++なら後者のほうがいいかもしれません。


マネージC++なら前者のほうが良いの間違いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報