VARIANT XMLDoc::getVariant(const XMLNodePtr &node, const TCHAR *tagName, int instans) { VARIANT result; result.vt = NULL; if(node!=NULL) { int i=0; for(XMLNodePtr p = node->firstChild; p != NULL; p = p->nextSibling) { if(p->nodeType==NODE_ELEMENT && _tcsicmp(((XMLElementPtr)p)->tagName,tagName) == 0 && i++ == instans) { IXMLDOMNodeListPtr childList = p->childNodes; LONG length; childList->get_length(&length); for(int j = 0; j < length; j++) { IXMLDOMNodePtr item; childList->get_item(j, &item); DOMNodeType itemType; item->get_nodeType(&itemType); if(itemType == NODE_TEXT) { item->get_nodeValue(&result); return result; } } return result; } } } return result; }
BOOL CSkinClass::LoadPropertyFromXml(IXMLDOMNodePtr ptrNode) { IXMLDOMNodePtr pNode = NULL; IXMLDOMNamedNodeMapPtr pNamedNodeMap = NULL; DOMNodeType nodeType = NODE_INVALID; long len = 0; BOOL allSuc = TRUE; ptrNode->get_attributes(&pNamedNodeMap); pNamedNodeMap->get_length(&len); for (int i=0; i<len; i++){ pNamedNodeMap->get_item(i, &pNode); pNode->get_nodeType(&nodeType); if (nodeType != NODE_ATTRIBUTE) continue; CComBSTR bstrName; CComVariant varValue; pNode->get_nodeName(&bstrName); pNode->get_nodeValue(&varValue); if (varValue.vt != VT_BSTR) continue; CString strName = bstrName; CString strValue = varValue.bstrVal; if (strName.CompareNoCase(_T("name")) != 0) { SetProp(strName, strValue); } else { ASSERT(m_strClassName.IsEmpty()); SetClassName(strValue); } } return allSuc; }
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; }