Exemple #1
0
///////////////////////////////////////////////////////////////
// 功能: 扫描参数结构转换成 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);
}