/////////////////////////////////////////////////////////////// // 功能: 扫描参数结构转换成 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; }
void dynamDOM() { HRESULT hr = S_OK; IXMLDOMDocument *pXMLDom = NULL; IXMLDOMElement *pRoot = NULL; IXMLDOMElement *pNode = NULL; IXMLDOMElement *pSubNode = NULL; IXMLDOMDocumentFragment *pDF = NULL; BSTR bstrXML = NULL; VARIANT varFileName; VariantInit(&varFileName); CHK_HR(CreateAndInitDOM(&pXMLDom)); // Create a processing instruction element. CHK_HR(CreateAndAddPINode(pXMLDom, L"xml", L"version='1.0'")); // Create a comment element. CHK_HR(CreateAndAddCommentNode(pXMLDom, L"sample xml file created using XML DOM object.")); // Create the root element. CHK_HR(CreateElement(pXMLDom, L"root", &pRoot)); // Create an attribute for the <root> element, with name "created" and value "using dom". CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"created", L"using dom", pRoot)); // Next, we will create and add three nodes to the <root> element. // Create a <node1> to hold text content. CHK_HR(CreateAndAddElementNode(pXMLDom, L"node1", L"\n\t", pRoot, &pNode)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"some character data", pNode)); SAFE_RELEASE(pNode); // Create a <node2> to hold a CDATA section. CHK_HR(CreateAndAddElementNode(pXMLDom, L"node2", L"\n\t", pRoot, &pNode)); CHK_HR(CreateAndAddCDATANode(pXMLDom, L"<some mark-up text>", pNode)); SAFE_RELEASE(pNode); // Create <node3> to hold a doc fragment with three sub-elements. CHK_HR(CreateAndAddElementNode(pXMLDom, L"node3", L"\n\t", pRoot, &pNode)); // Create a document fragment to hold three sub-elements. CHK_HR(pXMLDom->createDocumentFragment(&pDF)); // Create 3 subnodes. CHK_HR(CreateAndAddElementNode(pXMLDom, L"subNode1", L"\n\t\t", pDF)); CHK_HR(CreateAndAddElementNode(pXMLDom, L"subNode2", L"\n\t\t", pDF)); CHK_HR(CreateAndAddElementNode(pXMLDom, L"subNode3", L"\n\t\t", pDF)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n\t", pDF)); // Append pDF to <node3>. CHK_HR(AppendChildToParent(pDF, pNode)); SAFE_RELEASE(pNode); // Add NEWLINE for identation before </root>. CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n", pRoot)); // add <root> to document CHK_HR(AppendChildToParent(pRoot, pXMLDom)); CHK_HR(pXMLDom->get_xml(&bstrXML)); wprintf(L"Dynamically created DOM:\n%s\n", bstrXML); CHK_HR(VariantFromString(L"dynamDOM.xml", varFileName)); CHK_HR(pXMLDom->save(varFileName)); wprintf(L"DOM saved to dynamDOM.xml\n"); CleanUp: SAFE_RELEASE(pXMLDom); SAFE_RELEASE(pRoot); SAFE_RELEASE(pNode); SAFE_RELEASE(pDF); SAFE_RELEASE(pSubNode); SysFreeString(bstrXML); VariantClear(&varFileName); }