寝ても覚めてもゲーム製作 - ウェブログ-ログ

ニコニコのブロマガで書いてたやつの保守。更新予定ほぼなし。

C#DXアーカイブで暗号化したファイルからXmlファイルを読み込む


DXライブラリをお使いの皆さんは
大抵C++でプログラミングしていると(私は勝手に)思ってますが

わたしはC#でつかっているのでそれ向きの解説です。

DXアーカイブで作ったファイルから読み込むということは
DXライブラリの関数でしかファイルを開けません。
そのため、XmlTextReaderXmlファイルを直接読み込むことはできません

なんとかしてXmlTextReaderで読み込める形に変換しなきゃ……!
(当然ですが参照設定にSystem.Xmlを追加するのを忘れずに。)

私が取った方法はこれです。

1.DXライブラリ標準の関数 FileReadOpen(str Filename)で読み込む。

2.読み込んだファイルを文字列に書き出す

3.文字列をXmlDocumentとして読み込む

4.読み込んだXmlDocumentをメモリストリーム(MemoryStream)に保存

5.メモリストリームをXmlTextReaderで読み込む

という面倒なことをしてます。
XmlDocumentをそのまま扱えれば
もう少しスマートになりそうなんですけど
このあたり知ってる人いますか?

まあいいや。詳しい説明を書いておきましょう。

1.DXライブラリ標準の関数 FileReadOpen(str Filename)で読み込む。
特に言う事はありません。
次に文字列に書き出すのでファイルサイズも取得しておきましょう。

//Xmlファイル読み込み
int
File_handle = DX.FileRead_open(File_name);
long File_size = DX.FileRead_size(File_name);

2.読み込んだファイル文字列に書き出す
XmlDocumentで読み込むための下準備。
さっき読み込んだファイルを文字列にします。

System.Text.StringBuilder data_str = new StringBuilder(65535);

while
(DX.FileRead_eof(File_handle) == 0)
{
DX.FileRead_gets(data_str, 1024, File_handle)
Xmltxt += data_str.ToString();
}

DX.FileRead_close(File_handle);

3.文字列をXmlDocumentとして読み込む
XmlファイルやメモリストリームにあるXmlデータは
XmlTextReaderクラスを使うのに対して
文字列データをXmlとして扱うのがXmlDocumentクラスです。
これでXmlとしてやっと扱ってくれます。

//文字列をXml
XmlDocument
document = new XmlDocument();
document.LoadXml(Xmltxt);

4.読み込んだXmlDocumentをメモリストリーム(MemoryStream)に保存
XmlTextReaderが対応している形式にするために
一旦MemoryStream型にします。

//メモリストリーム領域に保存
MemoryStream mem = new MemoryStream();
document.Save(mem);
mem.Seek(0, SeekOrigin.Begin);

5.メモリストリームをXmlTextReaderで読み込む
XmlTextReaderクラスで読み込めるようにすれば後は
自由に読み込めます。お疲れ様でした。

//メモリストリームから読み込み
XmlTextReader reader = new XmlTextReader(mem);


はい、コピペ用。
//Xmlファイル読み込み
int
File_handle = DX.FileRead_open(File_name);
long File_size = DX.FileRead_size(File_name);

System.Text.StringBuilder data_str = new StringBuilder(65535);

while
(DX.FileRead_eof(File_handle) == 0)
{
DX.FileRead_gets(data_str, 1024, File_handle)
Xmltxt += data_str.ToString();
}

DX.FileRead_close(File_handle);

//文字列をXml
XmlDocument
document = new XmlDocument();
document.LoadXml(Xmltxt);

//メモリストリーム領域に保存
MemoryStream mem = new MemoryStream();
document.Save(mem);
mem.Seek(0, SeekOrigin.Begin);

//メモリストリームから読み込み
XmlTextReader reader = new XmlTextReader(mem);


これでTiledとか使うのが捗りますね。
まあ他でXml使う用事は特にないんですけど。
//Xmlファイル読み込み
int
File_handle = DX.FileRead_open(File_name);
long File_size = DX.FileRead_size(File_name);