XMLを読み込むには?

解決


THUS  2007-10-18 08:18:37  No: 66620

はじめまして。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;

などはちゃんと追加しています(後者は関係無いのかも知れませんが…)

ぶしつけな質問で申し訳ありませんが、
ご指摘頂ける所がありましたら、宜しくお願い致します。


シャノン  2007-10-18 19:14:07  No: 66621

例外が発生しているようですので、ex の内容を詳細に出力して検分してみてはいかがでしょう。


THUS  2007-10-18 22:06:59  No: 66622

ありがとうございます。
読み込むXML側に日本語が含まれていたためにエラーが出ていたようです。
しかし、XMLで日本語を扱うことはできないのでしょうか…?


subaru  2007-10-18 22:39:48  No: 66623

encodingの指定と文字コードが合っていないのでは?
もしそうならそのXMLはIEでも見れないはずです。


THUS  2007-10-18 22:49:31  No: 66624

確かにIEでも見れませんでした…。
参考書に書いてある通りに<?xml version="1.0" encoding="UTF-8" ?>
としていたのが間違いだったのかもしれません。

すべて英語で書いた場合は、無事読み込むことができました。
ありがとうございます!

上記の通り
XmlTextReader *reader = new XmlTextReader(dlg->FileName);
として、
while(reader->Read())
の続く限りノードを読み取っているのですが、
if(reader->Name == "agent")
というif文にかけて、ノード名を条件にしようとしたところ、
エラーこそ出ないもののif文にひっかからないようです。
型が違うのでしょうか?何度も質問して申し訳ありません。


THUS  2007-10-18 22:57:44  No: 66625

ごめんなさい!自分で解決できました!

文字列比較に==を使ってはいけなかったんですね…(汗)

無事解決しました。
本当にありがとうございました!


Blue  2007-10-18 22:58:01  No: 66626

とりあえず、どうやってXMLファイルを保存しているんでしょうか?
当然文字コードをUTF-8にして保存しているのですよね?

> すべて英語で書いた場合は、無事読み込むことができました。
からどうも、Shift_JIS(CP932)で保存しているように思えるのですけど。
(Shift_JISもUTF-8もASCIIコードの部分の文字コードは同じ)


keichan  2007-10-19 00:53:17  No: 66627

解決済みになっていますが、蛇足。

文字コードについての認識が抜けているような気がするので
調べてみては如何でしょうか?


THUS  2007-10-19 07:59:04  No: 66628

ご指摘ありがとうございます。

文字コードについては調べてみることにします。
ご親切にお教えいただきありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加