C#DXアーカイブで暗号化したファイルからXmlファイルを読み込む
DXライブラリをお使いの皆さんは
大抵C++でプログラミングしていると(私は勝手に)思ってますが
わたしはC#でつかっているのでそれ向きの解説です。
DXアーカイブで作ったファイルから読み込むということは
DXライブラリの関数でしかファイルを開けません。
そのため、XmlTextReaderでXmlファイルを直接読み込むことはできません。
なんとかしてXmlTextReaderで読み込める形に変換しなきゃ……!
(当然ですが参照設定にSystem.Xmlを追加するのを忘れずに。)
私が取った方法はこれです。
1.DXライブラリ標準の関数 FileReadOpen(str Filename)で読み込む。
↓
2.読み込んだファイルを文字列に書き出す
↓
3.文字列をXmlDocumentとして読み込む
↓
4.読み込んだXmlDocumentをメモリストリーム(MemoryStream)に保存
↓
5.メモリストリームをXmlTextReaderで読み込む
という面倒なことをしてます。
XmlDocumentをそのまま扱えれば
もう少しスマートになりそうなんですけど
このあたり知ってる人いますか?
まあいいや。詳しい説明を書いておきましょう。
1.DXライブラリ標準の関数 FileReadOpen(str Filename)で読み込む。
特に言う事はありません。
次に文字列に書き出すのでファイルサイズも取得しておきましょう。
2.読み込んだファイルを文字列に書き出す//Xmlファイル読み込み
int File_handle = DX.FileRead_open(File_name);
long File_size = DX.FileRead_size(File_name);
XmlDocumentで読み込むための下準備。
さっき読み込んだファイルを文字列にします。
3.文字列を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);
XmlファイルやメモリストリームにあるXmlデータは
XmlTextReaderクラスを使うのに対して
文字列データをXmlとして扱うのがXmlDocumentクラスです。
これでXmlとしてやっと扱ってくれます。
4.読み込んだXmlDocumentをメモリストリーム(MemoryStream)に保存//文字列をXmlに
XmlDocument document = new XmlDocument();
document.LoadXml(Xmltxt);
XmlTextReaderが対応している形式にするために
一旦MemoryStream型にします。
5.メモリストリームをXmlTextReaderで読み込む//メモリストリーム領域に保存
MemoryStream mem = new MemoryStream();
document.Save(mem);
mem.Seek(0, SeekOrigin.Begin);
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使う用事は特にないんですけど。