none
XMLを使って、データ読み書きする方法を教えてください。 RRS feed

  • 質問

  • どうも、こんにちわ。

    VC++の初心者です。

     

    マイクロソフト社が推奨するXMLを使った、データ読み書きを

    する方法を模索しています。

     

    環境は、

    WinXP

    VC++2005 Ver 8.0

    MFCアプリケーション/ダイアログベースを選択。

    単純に変数の数値や文字列をXMLに書き込み、読み出すことを

    実現しようとしています。

     

    MSXMLを活用する話をWebで見たのですが、

    糸口が見えずにいます。

     

    ご教授のほど、よろしくお願いします。

    2007年5月14日 8:20

回答

  •  japan8200 さんからの引用
    今は、SaveしたデータをLoadするコードを模索しています。

     

    trial.xmlを読んでみた。

    Code Snippet

      XmlDocument^ document = gcnew XmlDocument();
       document->Load(L"trial.xml");
       XmlElement^ root = document->DocumentElement;
       for each ( XmlElement^ element in root->GetElementsByTagName(L"variable") ) {
         Console::WriteLine(L"{0} = {1}", element->Attributes[L"name"]->Value, element->InnerText);
       }

     

    2007年5月16日 14:15

すべての返信

  •  japan8200 さんからの引用

    MSXMLを活用する話をWebで見たのですが、

    糸口が見えずにいます。

     

    MFC アプリケーションでしたら、MSXML を使用することになると思いますが、MS が推奨している

    かどうかは不明です(ちなみに C++ で使用できる XML パーサでは Xerces C++ などもあります)。

     

    糸口が見えないとのことですが、どのあたりの糸口が見えないのかを詳しく書かれた方が良いですよ。

    さすがに、この場所で MSXML の使い方をいちからお教えすることはできませんので・・・

     

    一応、糸口と思われるリンクを張っておきます。

     

    MSXML SDK - How Do I Use DOM?

    http://msdn2.microsoft.com/en-us/library/ms756005.aspx

     

    C++ アプリケーションから MSXML を使う

    http://www.utj.co.jp/xml/dev/dom/dxdom1_1.html

     

    それと、MSXML を使用するには、多少なりとも ATL COM プログラミングの知識も必要です。

    2007年5月14日 9:25
  • 早速のご回答、ありがとうございます。

     

    XMLを使用するには、DOMやATL COMを使う必要があるのですね。

    ここら辺の知識も必要とは、知りませんでした。

    助かりました。

    なかなか奥が深そうなので、時間をかけてチャレンジしてみたいと思います。

     

     

     

     

     

    2007年5月14日 11:44
  • XMLをインポートする必要があるとのことなので、

    #import "msxml.dll" named_guidsを

    ソースコードに記述してみました。

     

    すると、下記のエラーが出ました。

    : fatal error C1083: タイプ ライブラリ ファイルを開けません。'msxml.dll': No such file or directory

     

    なにかライブラリファイルをインストールする必要があるのでしょうか?

    色々と模索中ですが、

    なにかご指摘があれば、ご教授のほど、よろしくお願いします。

    2007年5月14日 13:58
  •  japan8200 さんからの引用

    #import "msxml.dll" named_guidsを

    ソースコードに記述してみました。

     

    下記の記述内容はちょっと古いです。

     

    C++ アプリケーションから MSXML を使う

    http://www.utj.co.jp/xml/dev/dom/dxdom1_1.html

     

    環境が Windows Vista, Windows XP, Windows 2000 SP4 以降なら、以下のように msxml3.dll を試してみてください。

     

    Code Snippet

    #import "msxml3.dll" raw_interfaces_only

    using namespace MSXML2;

     

    BOOL LoadXml(LPCTSTR lpszSrcFilePath)

    {

      try

      {

        HRESULT hr;

        // MSXML インスタンス生成

        IXMLDOMDocument2Ptr pDoc;

        hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));

        _ASSERT(SUCCEEDED(hr));

     

        if (FAILED(hr))

          _com_raise_error(hr);

     

        // XML ファイルのロード

        VARIANT_BOOL f;

        hr = pDoc->load(_variant_t(lpszSrcFilePath), &f);

        _ASSERT(SUCCEEDED(hr));

        if (FAILED(hr))

          _com_raise_error(hr);

     

        if (f == VARIANT_FALSE)

        {

          return FALSE;

        }

      }

      catch (_com_error& e)

      {

        return FALSE;

      }

     

      return TRUE;

    }

     

    一応サンプルを書きましたが、即席で未確認ですのであくまでもご参考までに。。。。 

     

    ちなみに、MSXML は OS の環境によってさまざまなバージョンが含まれています(かなり複雑)。

    下記の MSXML のバージョンチェックの方法を参照して、一度ご自身のシステムにインストールされている

    バージョンをチェックしておくといいかもしれません。

     

    コンピュータにインストールされた MSXML パーサーのバージョンを判別する

    http://support.microsoft.com/kb/278674/ja

     

    2007年5月15日 1:22
  • ご教授くださり、ありがとうございます。

     

    ご掲示くださったサンプルを試したのですが、やはり前と同じように下記のエラーが出ました。

     fatal error C1083: タイプ ライブラリ ファイルを開けません。'msxml3.dll': No such file or directory

     

    msxmlでCドライブ内を検索してみました。

    msxml3.dll

    msxml5.dll

    などがC:\Program Files\Common Files\Microsoft Shared\SFPCA Cacheのパス先にあるようです。

     

    他に

    msxml3.dll

    msxml4.dll

    msxml5.dll

    などがC:\WINDOWS\system32のパス先にあるようです。

     

    VCのインクルードフォルダにMsXml.hがあるようです。

    インクルードはできるのですが、サンプルプログラムでエラーが出ます。

    myxmldlg.cpp(113) : error C2065: 'IXMLDOMDocument2Ptr' : 定義されていない識別子です。
    myxmldlg.cpp(113) : error C2146: 構文エラー : ';' が、識別子 'pDoc' の前に必要です。
    myxmldlg.cpp(113) : error C2065: 'pDoc' : 定義されていない識別子です。
    myxmldlg.cpp(115) : error C2228: '.CreateInstance' の左側はクラス、構造体、共用体でなければなりません
            型は ''unknown-type'' です。
    myxmldlg.cpp(115) : error C2653: 'MSXML2' : 識別子がクラス名でも名前空間名でもありません。
    myxmldlg.cpp(115) : error C2065: 'DOMDocument30' : 定義されていない識別子です。
    myxmldlg.cpp(123) : error C3861: '_com_raise_error': 識別子が見つかりませんでした
    myxmldlg.cpp(131) : error C2227: '->load' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
            型は ''unknown-type'' です。
    myxmldlg.cpp(131) : error C3861: '_variant_t': 識別子が見つかりませんでした
    myxmldlg.cpp(137) : error C3861: '_com_raise_error': 識別子が見つかりませんでした
    myxmldlg.cpp(151) : error C2061: 構文エラー : 識別子 '_com_error'
    myxmldlg.cpp(151) : error C2310: catch ハンドラは型を明確にしてください。
    myxmldlg.cpp(161) : error C2317: '107' 行目で始まっている 'try' ブロックには catch ハンドラがありません。

     

    今のところ、問題解決の模索中です。

    なにかアドバイスがあれば、よろしくお願いします。

     

    2007年5月15日 5:37
  • OSって、WindowsXP SP2ですか?
    それなら C:\Windows\system32 に msxml.dllもあるはずなんですが。

    さらに
    >msxml3.dll
    >msxml4.dll
    >msxml5.dll
    >などがC:\WINDOWS\system32のパス先にあるようです。
    という状態で、
    >'msxml3.dll': No such file or directory
    となるようなことはないと思うのですけど。
    (%SystemRoot%system32はパスがデフォルトで通っているはず)

    もしかして、環境変数やレジストリをいじったりしていませんよね?



    最悪 #import でフルパスを指定するとか。
    2007年5月15日 6:16
  • ご回答くださって、ありがとうございます。

     

    環境変数やレジストリは、怖くていじってはいないのですが、

    フルパスでimportするというご提案で、なんとかビルドをすることができました。

    //ソースコード

    #import "C:\Windows\system32\msxml3.dll" raw_interfaces_only

    using namespace MSXML2;

     

    この後、Akira Inoueさんが教えていただいたXMLを処理するコードを追加しまして、

    ビルドまで問題なく行けました。

     

    この後、どのようにしてデータをSave/Loadするのか模索している段階です。

     

    Save/Loadする方法について、ご教授くだされば、幸いです。

    よろしくお願いします。

     

     

    2007年5月15日 7:57
  • フルパス指定しないとダメということは、環境変数のパスが正しく設定されていないのでしょうか?

    一度、C:\Windows\System32 にパスが通っているか確認してみてください。

     

    さて、Save/Loadする方法ですが、Load はサンプルに記したとおりです。

     

    Save は、MSXML で手っ取り早いのは

     

    hr = pDoc->save(_variant_t(lpszFilePath));

     

    です(下記参照)。

     

    IXMLDOMDocument/DOMDocument Members

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/5996c682-3472-4b03-9fb0-1e08fcccdf35.asp

     

     

    あとは、エレメント(要素)の挿入とかテキストの設定とか属性の追加などの方法が必要になるんでしょうけれど、前に記したWebサイトなどを参考に、試行錯誤してみてください。勉強になるとおもいます。

     

    で、どうしてもわからないことが出てきたときに、また具体的に質問してみてください。

    2007年5月15日 8:48
  • C++/CLIで構わんのやったら .NET Framework に助けてもらうのがいちばん楽かも。


    Code Snippet

    using namespace System;
     using namespace System::Xml;

     

    int main() {
      XmlDocument^ document = gcnew XmlDocument();
      XmlElement^ root = document->CreateElement(L"root");
      document->AppendChild(root);


      XmlElement^ item;

     item = document->CreateElement(L"variable");
      item->SetAttribute(L"name",L"apple");
      item->AppendChild(document->CreateTextNode(L"りんご"));
      root->AppendChild(item);

     

     item = document->CreateElement(L"variable");
      item->SetAttribute(L"name",L"orange");
      item->AppendChild(document->CreateTextNode(L"みかん"));
      root->AppendChild(item);

     

     document->Save("trial.xml");
      return 0;
    }

     ↑これ実行すると↓こんなんができます。

    Code Snippet
    <root>
      <variable name="apple">りんご</variable>
      <variable name="orange">みかん</variable>
    </root>

     

    2007年5月15日 15:15
  • ご教授くださって、ありがとうございます。

     

    Windowsフォームアプリケーションを選択して、

    上記のコードを追加して、ビルドしてみました。

    ビルドは成功しまして、trial.xmlも生成され、

    データも記録されていました。

     

    マネージコードでのxml作成はなんとかわかりました。

    ありがとうございました。たいへん、助かりました。

     

    今は、SaveしたデータをLoadするコードを模索しています。

    また、よきアドバイスがあれば、ご教授のほど、よろしくお願いします。

     

     

     

    2007年5月16日 13:39
  •  japan8200 さんからの引用
    今は、SaveしたデータをLoadするコードを模索しています。

     

    trial.xmlを読んでみた。

    Code Snippet

      XmlDocument^ document = gcnew XmlDocument();
       document->Load(L"trial.xml");
       XmlElement^ root = document->DocumentElement;
       for each ( XmlElement^ element in root->GetElementsByTagName(L"variable") ) {
         Console::WriteLine(L"{0} = {1}", element->Attributes[L"name"]->Value, element->InnerText);
       }

     

    2007年5月16日 14:15
  • というか、少しは自分で探しましょうよ。
    Googleとか探せばすぐ見つかるとおもうし。

    ただ、C++/CLIのコードそのものを求めるのは厳しいかもしれません。
    C#やVB.NETでは同じ.NET Frameworkを使うので、どのクラスを使うのか
    どのメソッドを使うのかは同じなので、C++/CLIに限定せずに検索すると良いでしょう。


    ちゅうか、MSDNに載っているやんけ!
    http://msdn2.microsoft.com/ja-jp/library/ce3x426k(VS.80).aspx
    最低限やることやって質問しようよ。 ヤレヤレ<(´ロ`')o
    2007年5月16日 14:28
  • うん、模索するよなもんじゃありませんな。

    XmlDocument:Tongue Tiedave できたんだから Load もできんでないかと

    マニュアルのメンバ一覧上から舐めるくらいのことはできるやろ。

     

    # …絵文字を殺すのはどうやんですか? 教えて > だれぞ

     

    2007年5月16日 14:33
  •  

    さまざまな、ご指摘、痛み入ります。

     

    あれこれ試しまして、Save/Loadがうまくできました。

     

    あとはもっとXMLを細かく操作できるように試していこうと思います。

     

    ご教授くださって、ありがとうございました。

    大いに助かりました。

    2007年5月16日 23:00

  • さらっと読み込んで,さらっと書き込む程度の機能でよいのなら
    XmlLite というものができてるよう(Microsoft SDKs)ですけどね。
    (ADOで言うところの前方専用カーソルのような位置づけのようなので
    XMLファイルがでかい時に有効かもしれません)


    ネイティブ C++ 用の小さくて高速な XML パーサー


    XmlLite Programmer's Guide

     

    2007年5月17日 0:54