3.XML解析

せっかくなんで、取得した取得文字列より最安値を取得します。
最安値の格納位置は「ProductInfo/Item/LowestPrice」に格納されているので、その文字列を取得します。

(1)取得文字列からUNICODE変換

WindowsCEベースのOSでは文字コードはUNICODEで扱ってます。取得した文字列をUNICODEに変換しなければなりません。
取得文字列はencoding属性からutf-8とわかっているので、次のようなコードでUNICODEへ変換できます。
本来は文字コード解析のためにがんばらないと行けないのですが、ここは割愛ということで...

DWORD      _dwMLMode = 0;
UINT       _intReaded = _dwReaded;                               // 前ページより(取得したサイズ)
UINT       _dwDestSize = 2000;
CStringW   _cstrData;
LPTSTR     _lpstrData = _cstrData.GetBuffer(_dwDestSize);        //一応2000文字確保
CComPtr<IMultiLanguage>  m_spML;
m_spML.CoCreateInstance (CLSID_CMultiLanguage);                  // mlang.h をinclude すること
m_spML->ConvertStringToUnicode ( &_dwMLMode , CP_UTF8 , (char*)_bytBuf , &_intReaded , _lpstrData , &_dwDestSize );
_cstrData.ReleaseBufferSetLength(_dwDestSize);
_bstr_t		_bstrResponse;
_bstrResponse = _cstrData;                                       // BSTRで扱えるように変換

文字コードの変換は IMultiLanuage インタフェースを使用します。
デスクトップOSではIMultiLanguage2も実装されており、「DetectInputCodepage」を使用して文字コード解析が可能ですが、
WindowsMobile 5.0にはこのインタフェースは実装されていません。
「This interface is not supported on all Windows CE-based operating systems」とIMultilanguage2インタフェースの説明に記載されている。

(2)XMLパース

HRESULT _hRC;
CComPtr<IXMLDOMDocument>		_spDomdoc;
CComPtr<IXMLDOMParseError> _spDomError;
long							_lngError;
_hRC = _spDomdoc.CoCreateInstance (__uuidof ( DOMDocument) );     // XML DOMを作成
_spDomdoc->put_async(VARIANT_FALSE);
_spDomdoc->put_preserveWhiteSpace(VARIANT_TRUE);
_spDomdoc->put_resolveExternals( VARIANT_FALSE);

VARIANT_BOOL _vtbOK;
_spDomdoc->loadXML (_bstrResponse , &_vtbOK);                     // XMLを読み込み
_spDomdoc->get_parseError( &_spDomError );
_spDomError->get_errorCode( &_lngError );
if ( _lngError != 0 )
{												//?パーサエラー
    long _lngLineNo;
    _bstr_t _bstrReason;
    _spDomError->get_line  ( &_lngLineNo );
    _spDomError->get_reason ( &_bstrReason.GetBSTR() );
    ATLTRACE ( _T("BBS XML解析失敗。\nコード=%04X,位置=%d\n場所=%s") , _lngLineNo , (LPCTSTR)_bstrReason );
}
else                                           //?パース正常
{
    CComPtr <IXMLDOMElement>   _spElmPrice;
    _spDomdoc->selectSingleNode(_bstr_t("ProductInfo/Item/LowestPrice") , (IXMLDOMNode**)&_spElmPrice );
    if (NULL != _spElmPrice )                 //?価格タグあり
    {
        _bstr_t	_bstLowetsPrice;              // 価格取得
        _spElmPrice->get_text( &_bstLowetsPrice.GetBSTR() );
    }
}   

この当たりの処理は定番になってます
XMLDOMDocumentは CoCreateInstance() で作成
asyncプロパティはTrue, preserveWhiteSpaceプロパティはTrueを設定,resolveExternalsはFalseを設定しています。
その後、loadMXLで価格コムから取得したデータを設定しています。

下手なコードですが、サンプルプログラムのアーカイブです

Topへ戻る