• ベストアンサー

バイナリ形式のXMLファイルを読み書きしたいです

Denemoというソフトが出力した .denemo ファイルを読み書きしたいのです。 .denemo ファイルは MusicXML という形式のようなのですが、バイナリファイルなのでどのように扱えば良いのかわからず質問しました。 XML parser というものが関係あるようなのですが、よくわかりません。 まずは、バイナリ形式のXMLをテキスト形式で読みたい。 次に、バイナリ形式のXMLをプログラム(C++)で操作して読み書きしたい。 と、思っています。 OS は Windows XP で、コンパイラは g++ を使用しています。 よろしくお願いいたします_(_ _)_

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>MusicXML という形式のようなのですが、バイナリファイルなので 譜面をXMLで記述しているだけで、ただのXMLファイルだと思います。 >まずは、バイナリ形式のXMLをテキスト形式で読みたい。 そもそも、XMLは文字コードを意識しているのですべてテキストで記述されます。つまり、XMLという時点でテキストファイルです。 ということで。 >バイナリ形式のXMLをプログラム(C++)で操作して読み書きしたい。 WindowsにはMSXMLと呼ばれるXMLパーサがIEやOfiiceなどに入っています。IEがほぼ標準で入っているので、最近のWindowsマシンにはほぼ入っているでしょう。COMを使用しているので、少し面倒。 MS.NetにはSystemXMLというXMLパーサがあります。 C++なら後者のほうがいいかもしれません。

その他の回答 (5)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.6

実証する環境がないので心苦しいのですが、 ググッてみたところ、 「(たぶんwin環境において)xmlSaveFormatFile()関数使うと 出力xmlファイルがバイナリになる」 という投稿 http://www.mail-archive.com/xml@gnome.org/msg04463.html を見つけました。 英語力がイマイチ足りないので、この投稿の、この後の 質問者と回答者のたどった経緯がはっきりつかめないのですが。 最終的に解決したっぽい? --- ここで取り上げられているxmlSaveFormatFile()関数というのは、 libxml(というライブラリ)のAPIみたいです。 http://xmlsoft.planetmirror.com/html/libxml-tree.html --- Denemoのソースコードを(ググッて)見てみたのですが、 Denemoで「Denemo XML Format」を選択して XMLファイル出力しようとすると、 最終的に(libxmlの)xmlSaveFile()関数が呼ばれる・・・ ・・・ような気がするのですが。 --- Denemoの「ファイル出力GUI」部分と思われるソースコード。 gtkフレームワークを知らないので、 これまた全くのカンなのですが。 http://www.koders.com/cpp/fid2948DB0B5120E3FD609BAF817C5589C3E45366A5.aspx?s=mdef%3ainsert (filesel_save()周辺)

irija_bari
質問者

お礼

かなり突っ込んで調べていただきありがとうございます。 Denemoのメーリングリストにメールを出したのですが、ちょうど今返事を もらえました。 結局、DenemoはXMLをgzipしてから出力しているということがわかりました。 Denemo XML Formatファイルをgunzipするとテキスト形式のXML (らしきもの。まだ中身をちゃんと見ていません。)になりました。 さらに、gunzipしたものを再びgzipするとDenemoで読み込むことができました。 しかし、ソースコードの中まで読むなんてすごいですね。 私はちょっとそこまではできないです(^^; これで表題の「バイナリ形式のXMLファイルを読み書きしたい」は 解決しましたので締めたいと思います。 皆さんのご援助に感謝します!!ありがとうございました!

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

>Denemo が出力した .denemo ファイル MusicXMLを独自にバイナリ化したんだとしたら困難ですね。 普通ツールは互換性のために他のソフトとやり取りするファイルを出力できたりしますが、MusicXML形式では書き出せないんでしょうか? >XML parser というのはテキスト形式で書かれた XML ファイルを読み込んで、プログラムが扱いやすい形に変換 ほぼ、その認識であってます。 パーサーは構文解析という意味で、よく使われるのは言語のインタプリタやコンパイルの構文解析ですね。 エレメント(タグ)の意味解析などは結局自分でやるしかないので、けっこう面倒だったりします。

irija_bari
質問者

補足

Denemo の保存ダイアログでは Denemo XML Format を選択して保存しています。 Denemo のホームページには「他のソフトと互換性を保つために MusicXML を サポートしている」と書いてあるので、Denemo XML Format が MusicXML では ないかと考えているのですが。。。 しかし、.denemo ファイルがバイナリ形式だということは違うのかもしれません。 このへんのことをフォーラムで質問してみようかと思います。 (初めて「教えて!goo」を利用していますが、予想外に回答が来るので うれしい驚きです。回答してくださる皆さんに感謝!!)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

.denemoファイルがバイナリファイルであればそれはMusicXMLではないということになります。 バイナリの解析はファイルフォーマット等の情報がないと無理でしょう。

irija_bari
質問者

補足

php504さんありがとうございます! やはりバイナリファイルであれば、XML ではないのですね。。。 Denemo はもともと UNIX/Linux 用ソフトのようなので、Windowsで実行して いるために出力ファイルが文字化けすることがあるのかな、とも思ったのですが。 バイナリファイルであるということは、php504さんが言われたように開発元の ファイルフォーマット情報がないとダメですよね。 Denemo のフォーラムに投稿してみます。(英語かぁ。。。頑張るしかない!!)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

ただのテキストじゃないでしょうか? http://ja.wikipedia.org/wiki/MusicXML 開発環境がcygwinのようなので、GPLライセンスでかまわなければかなりありますよ。 http://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA%B7%CF%2FC%2B%2B#Parser_XML 都合よく日本語なのは数少ないと思いますが、MiXとか少しはあります。

irija_bari
質問者

補足

aris_wizさん、zwiさん、早速の回答ありがとうございます!! ただ説明がまずかったようで、Denemo が出力した .denemo ファイルは テキストエディタで開こうとしても文字化けし、バイナリエディタで 開いても中身の意味がわかりません。 Denemo のホームページを見ると MusicXML で出力していると書かれて いたのですが(英語なので確かではありませんが。。。)、 お二人の言われたように XML は本来テキストで書かれるべきものですよね。 それで、XML をバイナリで記述することもあるのかな、と思った次第です。 基本的な質問に戻りますが、XML parser というのはテキスト形式で 書かれた XML ファイルを読み込んで、プログラムが扱いやすい形に変換 (というか解釈)するもの、ということであっているでしょうか?

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>C++なら後者のほうがいいかもしれません。 マネージC++なら前者のほうが良いの間違いです。

関連するQ&A