はじめまして。Visual Studio 2003.NETを使用して
VC++のプログラムを書いています。
慣れない状態で参考書片手に始めたため、
最初は配列の作り方などで悩むこともしばしばだったのですが、
XMLを読み込んで要素を入れるに入れることが出来ない
問題にぶつかったので、質問しに来ました。
//XML読み込みボタン
private: System::Void menuItem5_Click(System::Object * sender, System::EventArgs * e)
{
Debug::WriteLine("XMLオープン");
OpenFileDialog *dlg = new OpenFileDialog();
dlg->Filter = "XML形式(*.xml)|*.xml|すべてのファイル(*.*)|*.*";
if(dlg->ShowDialog() == DialogResult::OK){
try
{
String *InputFileName = dlg->FileName;
XmlDocument *doc = new XmlDocument();
XmlTextReader *reader = new XmlTextReader(dlg->FileName);
reader->WhitespaceHandling = WhitespaceHandling::None;
reader->MoveToContent();
doc->Load(dlg->FileName);
return;
}
catch (Exception *ex)
{
MessageBox::Show("ファイル読み込みに失敗しました", "XMLtoTVML", MessageBoxButtons::OK, MessageBoxIcon::Error);
return;
}
}
}
XML読み込みボタンを押すと、このようなメソッドが働くようにしました。
(途中は作りかけです)
しかし、コンパイルは通るのですが、実際にデバッグでファイルを
読み込もうとするとエラーが起きてしまいます。
(ダイアログでファイル名を指定して「開く」を押すと、
「ファイル読み込みに失敗しました」と出る。)
エラーの原因は詳しく分からないのですが、
Debug::WriteLine();などで、どこまでプログラムが動いているか
確認したところ、エラーが起きている部分は、中ほどの
doc->Load(dlg->FileName);
であることが分かりました。
「dlg->FileName」にはちゃんとファイル名が入っていることも確認しています。
なぜdoc->Load(dlg->FileName);は動かないのでしょうか?
using namespace System::Xml;
using namespace System::IO;
などはちゃんと追加しています(後者は関係無いのかも知れませんが…)
ぶしつけな質問で申し訳ありませんが、
ご指摘頂ける所がありましたら、宜しくお願い致します。
例外が発生しているようですので、ex の内容を詳細に出力して検分してみてはいかがでしょう。
ありがとうございます。
読み込むXML側に日本語が含まれていたためにエラーが出ていたようです。
しかし、XMLで日本語を扱うことはできないのでしょうか…?
encodingの指定と文字コードが合っていないのでは?
もしそうならそのXMLはIEでも見れないはずです。
確かにIEでも見れませんでした…。
参考書に書いてある通りに<?xml version="1.0" encoding="UTF-8" ?>
としていたのが間違いだったのかもしれません。
すべて英語で書いた場合は、無事読み込むことができました。
ありがとうございます!
上記の通り
XmlTextReader *reader = new XmlTextReader(dlg->FileName);
として、
while(reader->Read())
の続く限りノードを読み取っているのですが、
if(reader->Name == "agent")
というif文にかけて、ノード名を条件にしようとしたところ、
エラーこそ出ないもののif文にひっかからないようです。
型が違うのでしょうか?何度も質問して申し訳ありません。
ごめんなさい!自分で解決できました!
文字列比較に==を使ってはいけなかったんですね…(汗)
無事解決しました。
本当にありがとうございました!
とりあえず、どうやってXMLファイルを保存しているんでしょうか?
当然文字コードをUTF-8にして保存しているのですよね?
> すべて英語で書いた場合は、無事読み込むことができました。
からどうも、Shift_JIS(CP932)で保存しているように思えるのですけど。
(Shift_JISもUTF-8もASCIIコードの部分の文字コードは同じ)
解決済みになっていますが、蛇足。
文字コードについての認識が抜けているような気がするので
調べてみては如何でしょうか?
ご指摘ありがとうございます。
文字コードについては調べてみることにします。
ご親切にお教えいただきありがとうございました!
ツイート | ![]() |