今回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>
---------------------------------------------------------
以上宜しくお願い致します。
一言だけ。
> MSXML(※) を使用して C++ から DOM を扱うための処理を実装しましたが
> XMLデータ抽出がうまくできません。loadが失敗しているように感じます。
「loadが失敗しているように感じます」ではなくてきちんとチェックするべきだと思います。
何故、チェックしていないのでしょう?
loadメソッドは処理ステータスを返却しないのでしょうか?
よく分からない状況であるならしつこい位処理ステータスのチェックをするコードを入れて
何が原因でうまくいっていないのかを探るべきだと思います。
質問するにしても出来うる限りの究明を行った後であるべきです。
また、究明を行ったのであれば、その結果も合わせて公開するべきです。
公開されていない情報は掲示板の読む側には伝わりません。
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.
もう少し追ってみます。