WindowsMobile5.0におけるXML読み込みについて

[戻る]
どらどら 2006/10/26(木) 17:04:30
今回MFC スマート デバイス アプリケーションでの開発を
している者です。以下の件が解消できず開発が止まっています。
問題を解決するために、ご教授お願い致します。

■開発環境
・Microsoft Visual Studio 2005(VC++)
・MFCライブラリ
・Windows Mobile 5.0 Pocket PC SDK(CE5.0)
・SDI、フォームビュー

■目的
モバイルのローカルにあるXMLファイルの読み込み・書き込みをする

■問題点
MSXML(※) を使用して C++ から DOM を扱うための処理を実装しましたが
XMLデータ抽出がうまくできません。loadが失敗しているように感じます。

■ロジック(読み出しの例)

#コンストラクタ(COMの初期化)
::CoInitializeEx(NULL,COINIT_MULTITHREADED);

#デストラクタ(COMの終了)
CoUninitialize();

#処理内容 

MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr pNode;

〜中略

pDoc.CreateInstance(MSXML2::CLSID_DOMDocument);
pDoc->put_async(VARIANT_FALSE);
pDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pDoc->appendChild(m_pDoc->createProcessingInstruction("xml", "version='1.0' 
encoding='UTF-8'"));
pDoc->load(_T("test.xml"));

//ルート要素「test1」要素)ノードリスト取得
MSXML2::IXMLDOMNodeListPtr pNodeList = m_pDoc->getElementsByTagName(_T
("test1"));

//ルート要素ノード取得
pNode = pNodeList->Getitem(0);
if(pNode == NULL)
{
    return; ←★ここに入ってしまう
}

//子ノードリスト取得
pNodeList = pNode->GetchildNodes();
long lLen = pNodeList->Getlength();

//子ノード数でループ 
for(LONG lLoop = 0; lLoop < lLen; lLoop++)
{
    CString clStr;
    MSXML2::IXMLDOMNamedNodeMapPtr    pNodeMap;

    //子ノード取得
    pNode = pNodeList->Getitem(lLoop);
        
    //要素名(「test2」)チェック
    if(pNode->GetnodeName() != _bstr_t(_T("test2")))
    {
        //「entry」以外なら次要素
        continue;
    }

}
clStr = static_cast<const char*>(pNode->Gettext());


■その他情報
1.DLLはmsxml3.dllを使用(namespace名はMSXML2)

2.test.xmlの中身
---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<test1>
<test2 xml:lang=" ja">aaaaa</test2>
<test2 xml:lang=" ja">bbbbb</test2>
<test2 xml:lang=" ja">ccccc</test2>
</test1>

---------------------------------------------------------
以上宜しくお願い致します。

PATIO 2006/10/27(金) 09:36:58
一言だけ。

> MSXML(※) を使用して C++ から DOM を扱うための処理を実装しましたが
> XMLデータ抽出がうまくできません。loadが失敗しているように感じます。
「loadが失敗しているように感じます」ではなくてきちんとチェックするべきだと思います。
何故、チェックしていないのでしょう?
loadメソッドは処理ステータスを返却しないのでしょうか?

よく分からない状況であるならしつこい位処理ステータスのチェックをするコードを入れて
何が原因でうまくいっていないのかを探るべきだと思います。
質問するにしても出来うる限りの究明を行った後であるべきです。
また、究明を行ったのであれば、その結果も合わせて公開するべきです。
公開されていない情報は掲示板の読む側には伝わりません。

どらどら 2006/10/28(土) 14:59:24
PATIOさん。返信ありがとうございます。


HRESULT hr = m_pDoc->load( _T("presence.xml") );
if(FAILED(hr)){
// エラー処理
}

上記load起動後、処理ステータスを、S_OK(0x00000000)で返していますが、
DLLの実行中に例外が発生しているようです。

モジュールの読み込み: mlang.dll
RaiseException: Thread=96b9dbc4 Proc=81a96f20 'XMLTEST.exe'
AKY=00004001 PC=03f785b4(coredll.dll+0x000185b4) RA=800773f4
(NK.EXE+0x000073f4) BVA=00000000 FSR=00000000
TLSKERN_NOFAULT set... bypassing kernel debugger.

もう少し追ってみます。

古いスレッドには追加発言できません。