/////////////////////////////////////////////////////////////// // 功能: 扫描参数结构转换成 XML 文档 // 参数: sp [in] 扫描参数结构 // sXMLDocText [out] XML文档的文本 // 返回: true - 成功, false - 失败 bool ScanParamXML::ScanParamToXML( const ScanParameter &sp, string &sXMLDocText ) { try { IXMLDOMDocument *pXmlDoc = NULL; IXMLDOMNode *pXmlDomNode = NULL; // 得到关于IXMLDOMDocument 接口的指针 pXMLDOC HRESULT hr = ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, ( void ** )&pXmlDoc ); if( S_OK != hr ) { return false; } //得到关于IXMLDOMNode接口的指针pXDN hr = pXmlDoc->QueryInterface( IID_IXMLDOMNode, ( void ** )&pXmlDomNode ); if( S_OK != hr ) { return false; } IXMLDOMNode *pNode; IXMLDOMNode *pNodeOut; IXMLDOMNode *pRootNode; _variant_t varNodeType = NODE_ELEMENT; _variant_t varNodeVal; _bstr_t bstrName; _bstr_t bstrDataType = NODE_CDATA_SECTION ; // 创建根结点 bstrName = _T("TopDiscoverParas"); hr = pXmlDoc->createNode( varNodeType , bstrName, 0, &pNode ); pXmlDoc->appendChild( pNode, &pRootNode ); // 创建Depth结点 varNodeVal = sp.nDepth; AddChildNodeWithValue( pRootNode, pXmlDoc, "Depth", varNodeVal ); // 创建Tineout结点 varNodeVal = sp.nTimeout; AddChildNodeWithValue( pRootNode, pXmlDoc, "Timeout", varNodeVal ); // 创建TryTimes结点 varNodeVal = sp.nTryTimes; AddChildNodeWithValue( pRootNode, pXmlDoc, "TryTimes", varNodeVal ); // 创建SubScan结点 varNodeVal = sp.bSubScan ? XML_TRUE : XML_FALSE; AddChildNodeWithValue( pRootNode, pXmlDoc, "SubScan", varNodeVal ); // 创建MaxTreadCount结点 varNodeVal = sp.nMaxTreadCount; AddChildNodeWithValue( pRootNode, pXmlDoc, "MaxTreadCount", varNodeVal ); // 创建DefaultCommunityGet结点 varNodeVal = sp.sDefaultCommunityOfGet.c_str(); AddChildNodeWithValue( pRootNode, pXmlDoc, "DefaultCommunityGet", varNodeVal ); // 创建DefaultCommunitySet结点 varNodeVal = sp.sDefaultCommunityOfSet.c_str(); AddChildNodeWithValue( pRootNode, pXmlDoc, "DefaultCommunitySet", varNodeVal ); // CommunityList 向量操作 if( sp.vcCommunityList.size() > 0 ) { VectorOfCommunity &vComm = const_cast< VectorOfCommunity & >( sp.vcCommunityList ); pNodeOut = AddChildElem( pRootNode, pXmlDoc, "Communitys" ); for( VectorOfCommunity::iterator it = vComm.begin(); pNodeOut != NULL && it != vComm.end(); it++ ) { IXMLDOMNode *pNodeCommunity = AddChildElem( pNodeOut, pXmlDoc, "Community" ); _variant_t varNodeVal = it->sStartIp.c_str(); AddChildNodeWithValue( pNodeCommunity, pXmlDoc, "StartIp", varNodeVal ); varNodeVal = it->sEndIp.c_str(); AddChildNodeWithValue( pNodeCommunity, pXmlDoc, "EndIp", varNodeVal ); varNodeVal = it->sGet.c_str(); AddChildNodeWithValue( pNodeCommunity, pXmlDoc, "Get", varNodeVal ); varNodeVal = it->sSet.c_str(); AddChildNodeWithValue( pNodeCommunity, pXmlDoc, "Set", varNodeVal ); } } // IpScopeList 向量操作 if( sp.viIpScopeList.size() > 0 ) { VectorOfIpScope &vIpScope = const_cast< VectorOfIpScope & >( sp.viIpScopeList ); pNodeOut = AddChildElem( pRootNode, pXmlDoc, "AddStartEnds" ); for( VectorOfIpScope::iterator it = vIpScope.begin(); pNodeOut != NULL && it != vIpScope.end(); it++ ) { IXMLDOMNode *pNodeIpScope = AddChildElem( pNodeOut, pXmlDoc, "AddStartEnd" ); _variant_t varNodeVal = it->sIpBegin.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "StartIp", varNodeVal ); varNodeVal = it->sIpEnd.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "EndIp", varNodeVal ); } } // FilterStartEndList 向量操作 if( sp.viFilterStartEndList.size() > 0 ) { VectorOfIpScope &vIpScope = const_cast< VectorOfIpScope & >( sp.viFilterStartEndList ); pNodeOut = AddChildElem( pRootNode, pXmlDoc, "FilterStartEnds" ); for( VectorOfIpScope::iterator it = vIpScope.begin(); pNodeOut != NULL && it != vIpScope.end(); it++ ) { IXMLDOMNode *pNodeIpScope = AddChildElem( pNodeOut, pXmlDoc, "FilterStartEnd" ); _variant_t varNodeVal = it->sIpBegin.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "StartIp", varNodeVal ); varNodeVal = it->sIpEnd.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "EndIp", varNodeVal ); } } // SubnetList 向量操作 if( sp.viSubnetList.size() > 0 ) { VectorOfIpScope &vIpScope = const_cast< VectorOfIpScope & >( sp.viSubnetList ); pNodeOut = AddChildElem( pRootNode, pXmlDoc, "SubnetList" ); for( VectorOfIpScope::iterator it = vIpScope.begin(); pNodeOut != NULL && it != vIpScope.end(); it++ ) { IXMLDOMNode *pNodeIpScope = AddChildElem( pNodeOut, pXmlDoc, "Subnet" ); _variant_t varNodeVal = it->sIpBegin.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "StartIp", varNodeVal ); varNodeVal = it->sIpEnd.c_str(); AddChildNodeWithValue( pNodeIpScope, pXmlDoc, "EndIp", varNodeVal ); } } // SeedIpList 向量操作 if( sp.vsSeedIpList.size() > 0 ) { VectorOfString &vIpSeed = const_cast< VectorOfString & >( sp.vsSeedIpList ); pNodeOut = AddChildElem( pRootNode, pXmlDoc, "SeedIpList" ); for( VectorOfString::iterator it = vIpSeed.begin(); pNodeOut != NULL && it != vIpSeed.end(); it++ ) { _variant_t varNodeVal = (*it).c_str(); AddChildNodeWithValue( pNodeOut, pXmlDoc, "Seed", varNodeVal ); } } // 处理输出参数 BSTR bstrXml; pXmlDoc->get_xml( &bstrXml ); bstrName = bstrXml; sXMLDocText = bstrName.operator char *(); SysFreeString( bstrXml ); // 保存到文件(用于测试) // _variant_t varString = _T("C:\\sample.xml"); // pXmlDoc->save( varString ); } catch(...) { return false; } return true; }
//-------------------------------------------------------------------------------------- HRESULT CRatingsDB::LoadDB() { // Find resource will pick the right ID_GDF_XML_STR based on the current language HRSRC hrsrc = FindResource( nullptr, MAKEINTRESOURCE(ID_RATINGS_XML), L"DATA" ); if( hrsrc ) { HGLOBAL hgResource = LoadResource( nullptr, hrsrc ); if( hgResource ) { BYTE* pResourceBuffer = (BYTE*)LockResource( hgResource ); if( pResourceBuffer ) { DWORD dwGDFXMLSize = SizeofResource( nullptr, hrsrc ); if( dwGDFXMLSize ) { // HGLOBAL from LoadResource() needs to be copied for CreateStreamOnHGlobal() to work HGLOBAL hgResourceCopy = GlobalAlloc( GMEM_MOVEABLE, dwGDFXMLSize ); if( hgResourceCopy ) { LPVOID pCopy = GlobalLock( hgResourceCopy ); if( pCopy ) { CopyMemory( pCopy, pResourceBuffer, dwGDFXMLSize ); GlobalUnlock( hgResource ); IStream* piStream = nullptr; HRESULT hr = CreateStreamOnHGlobal( hgResourceCopy, TRUE, &piStream ); if( SUCCEEDED(hr) && piStream ) { IXMLDOMDocument *pDoc = nullptr; // Load the XML into a IXMLDOMDocument object hr = CoCreateInstance( CLSID_DOMDocument, nullptr, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pDoc ); if( SUCCEEDED(hr) ) { IPersistStreamInit* pPersistStreamInit = nullptr; hr = pDoc->QueryInterface( IID_IPersistStreamInit, (void**) &pPersistStreamInit ); if( SUCCEEDED(hr) ) { hr = pPersistStreamInit->Load( piStream ); if( SUCCEEDED(hr) ) { // Get the root node to the XML doc and store it pDoc->QueryInterface( IID_IXMLDOMNode, (void**)&m_pRootNode ); } SAFE_RELEASE( pPersistStreamInit ); } SAFE_RELEASE( pDoc ); } SAFE_RELEASE( piStream ); } } GlobalFree( hgResourceCopy ); } } } } } if( m_pRootNode ) return S_OK; else return E_FAIL; }
/////////////////////////////////////////////////////////////// // 功能: XML 文档文本转换成扫描参数结构 // 参数: sXMLDocText [in] XML文档的文本 // sp [out] 扫描参数结构 // 返回: true - 成功, false - 失败 bool ScanParamXML::XMLToScanParam( const string &sXMLDocText, ScanParameter &sp ) { try { IXMLDOMDocument *pXmlDoc = NULL; IXMLDOMNode *pXmlDomNode = NULL; // 得到关于IXMLDOMDocument 接口的指针 pXMLDOC HRESULT hr = ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, ( void ** )&pXmlDoc ); if( S_OK != hr ) { return false; } //得到关于IXMLDOMNode接口的指针pXDN hr = pXmlDoc->QueryInterface( IID_IXMLDOMNode, ( void ** )&pXmlDomNode ); if( S_OK != hr ) { return false; } VARIANT_BOOL bOk; _variant_t varSrc = sXMLDocText.c_str(); IXMLDOMElement *pRootNode; // 根结点 IXMLDOMNode *pNode; IXMLDOMNode *pNodeOut; pXmlDoc->loadXML( varSrc.bstrVal, &bOk ); // 从字符串建立XML文档 // 取得根结点 pXmlDoc->get_documentElement( &pRootNode ); pRootNode->get_nodeName( &varSrc.bstrVal ); // 遍历根结点的子结点 for( pRootNode->get_firstChild( &pNode ); pNode != NULL; pNode->get_nextSibling( &pNode ) ) { pNode->get_nodeName( &varSrc.bstrVal ); // cout << "Node name: " << varSrc.operator _bstr_t().operator char *() << endl; string sNodeName = _bstr_t( varSrc.bstrVal ).operator char *(); if( sNodeName == string( "Depth" ) ) { // 发现 Depth 结点 varSrc = ReadNodeText( pNode ); sp.nDepth = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "Depth value: " << sp.nDepth << endl; } else if( sNodeName == string( "TryTimes" ) ) { // 发现 TryTimes 结点 varSrc = ReadNodeText( pNode ); sp.nTryTimes = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "TryTimes value: " << sp.nTryTimes << endl; } else if( sNodeName == string( "Timeout" ) ) { // 发现 Timeout 结点 varSrc = ReadNodeText( pNode ); sp.nTimeout = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "Timeout value: " << sp.nTimeout << endl; } else if( sNodeName == string( "MaxTreadCount" ) ) { // 发现 MaxTreadCount 结点 varSrc = ReadNodeText( pNode ); sp.nMaxTreadCount = atoi( _bstr_t( varSrc.bstrVal ).operator char *() ); //cout << "MaxTreadCount value: " << sp.nMaxTreadCount << endl; } else if( sNodeName == string( "SubScan" ) ) { // 发现 SubScan 结点 varSrc = ReadNodeText( pNode ); sp.bSubScan = ( string( _bstr_t( varSrc.bstrVal ).operator char *() ) == XML_TRUE ) ; //cout << "SubScan value: " << sp.bSubScan << endl; } else if( sNodeName == string( "DefaultCommunityGet" ) ) { // 发现 DefaultCommunityGet 结点 varSrc = ReadNodeText( pNode ); sp.sDefaultCommunityOfGet = _bstr_t( varSrc.bstrVal ).operator char *(); //cout << "DefaultCommunityGet value: " << sp.sDefaultCommunityOfGet << endl; } else if( sNodeName == string( "DefaultCommunitySet" ) ) { // 发现 DefaultCommunitySet 结点 varSrc = ReadNodeText( pNode ); sp.sDefaultCommunityOfSet = _bstr_t( varSrc.bstrVal ).operator char *(); //cout << "DefaultCommunityOfSet value: " << sp.sDefaultCommunityOfSet << endl; } else if( sNodeName == string( "Communitys" ) ) { // 发现 Communitys 结点 ReadCommunityListNode( pNode, sp.vcCommunityList ); } else if( sNodeName == string( "AddStartEnds" ) ) { // 发现 AddStartEnds 结点 ReadIpScopeListNode( pNode, sp.viIpScopeList ); // 读IpScopeList结点 } else if( sNodeName == string( "FilterStartEnds" ) ) { // 发现 FilterStartEnds 结点 ReadIpScopeListNode( pNode, sp.viFilterStartEndList ); // 读IpScopeList结点 } else if( sNodeName == string( "SubnetList" ) ) { // 发现 SubnetList 结点 ReadIpScopeListNode( pNode, sp.viSubnetList ); // 读IpScopeList结点 } else if( sNodeName == string( "SeedIpList" ) ) { // 发现 SeedIp 结点 ReadStringListNode( pNode, sp.vsSeedIpList ); } } // cout << "XMLToScanParam done successfully!" << endl; } catch(...) { return false; } return true; }