bool GetXmlValue( const IXMLDOMDocumentPtr& pXMLDOMDocument, const CComBSTR& bstrTagName, const CComBSTR& bstrAttributeName, std::vector<CComBSTR>& rvbstrValue ) { // アウトプットの初期化 rvbstrValue.clear(); // インプットのチェック if( 0 == bstrTagName.Length() ) { return false; } HRESULT hResult; // タグ名のノードリストの取得 IXMLDOMNodeListPtr pXMLDOMNodeList = NULL; hResult = pXMLDOMDocument->getElementsByTagName( bstrTagName, &pXMLDOMNodeList ); if( FAILED(hResult) || NULL == pXMLDOMNodeList ) { assert( !"タグ名のノードリストの取得に失敗" ); return false; } // ノードリストのノードの数の取得 long lCountNode = 0; hResult = pXMLDOMNodeList->get_length( &lCountNode ); if( FAILED(hResult) ) { assert( !"ノードリストのノードの数の取得に失敗" ); return false; } // ノードリストのノード一つずつ処理 for( int i = 0; i < lCountNode; ++i ) { // ノードリストのうちの一つのノードの取得 IXMLDOMNodePtr pXMLDOMNode = NULL; hResult = pXMLDOMNodeList->get_item( i, &pXMLDOMNode ); if( FAILED(hResult) ) { assert( !"ノードリストのうちの一つのノードの取得に失敗" ); return false; } // ノードタイプの取得 DOMNodeType eNodeType; hResult = pXMLDOMNode->get_nodeType( &eNodeType ); if( FAILED(hResult) ) { assert( !"ノードタイプの取得に失敗" ); return false; } if( NODE_ELEMENT != eNodeType ) { assert( !"ノードタイプがエレメントでないのはおかしい" ); return false; } // エレメント型への変換 IXMLDOMElementPtr pXMLDOMElement = NULL; hResult = pXMLDOMNode->QueryInterface( IID_IXMLDOMElement, (void**)&pXMLDOMElement ); // スマートポインタ型を利用しているので、pXMLDOMElement = pXMLDOMNode; でも良い。 if( FAILED(hResult) || NULL == pXMLDOMElement ) { assert( !"エレメント型への変換に失敗" ); return false; } // 属性値の取得か、データ値の取得か if( bstrAttributeName.Length() ) { // 属性値の取得 IXMLDOMAttribute* pAttributeNode = NULL; CComVariant varValue; hResult = pXMLDOMElement->getAttribute( bstrAttributeName, &varValue ); if( SUCCEEDED(hResult) && VT_BSTR == varValue.vt ) { rvbstrValue.push_back( varValue.bstrVal ); } } else { // データ値の取得 CComBSTR bstrText; hResult = pXMLDOMElement->get_text( &bstrText ); if( SUCCEEDED(hResult) ) { rvbstrValue.push_back( bstrText ); } } } return true; }