zoukankan      html  css  js  c++  java
  • 【原创】C++利用IXMLDOM解析XML文件。

    项目是在wince平台下做的,但是解析过程和代码却别不大,贴出代码,留做备份。

    // TestIXML.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <comutil.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <MsXml2.h>
    
    #pragma comment(lib, "ole32.lib")
    #pragma comment(lib, "oleaut32.lib")
    
    void TestXML();
    void TestSound();
    
    
    #define TIROSLIB_DBG_FILE "\\Test_Pro.log"
    
    void dbgprintf(const char *str, ...)
    {
    	va_list ap;
    	FILE *fh = NULL;
    
    	if(fh = fopen(TIROSLIB_DBG_FILE, "a"))
    	{
    		va_start(ap, str);
    		vfprintf(fh, str, ap);
    		fprintf(fh, "\n");
    		va_end(ap);	
    		fclose(fh);
    		fh = NULL;
    	}
    }
    
    
    typedef struct _weather_info_node
    {
    	char szDate[32];
    	char szCondition[5];
    	char szWind[32];
    	float fLowTemp;
    	float fHighTemp;
    	int nReserved;
    	struct _weather_info_node *lpNext;	
    }weather_info_node;
    
    weather_info_node *m_lpWeatherNode = NULL;
    
    weather_info_node *NewWeatherNode()
    {
    	weather_info_node *newNode = (weather_info_node *)malloc(sizeof(weather_info_node));
    
    	memset(newNode, 0, sizeof(weather_info_node));
    
    	newNode->lpNext = NULL;
    
    	return newNode;
    }
    
    void DestoryWeatherList(weather_info_node **weatherList)
    {
    	weather_info_node *DElem, *next;
    
    	DElem = *weatherList;
    
    	while(DElem)
    	{
    		next = DElem->lpNext;
    		free(DElem);
    		DElem = next;     
    	}
    
    	*weatherList = NULL;
    }
    
    BOOL ParseWeatherXml(const char *lpXmlPath)
    {
    	//xml节点名的枚举
    	enum node_Names{xml_day, xml_low, xml_high, xml_condition, xml_wind};
    
    	IXMLDOMDocument *pXMLDocument= NULL;
    	IXMLDOMNode *pNode = NULL;
    	IXMLDOMNodeList *pNodeList = NULL;
    	IXMLDOMNodeList *pChildNodeList = NULL;
    	IXMLDOMParseError * pObjError = NULL;
    	IXMLDOMNamedNodeMap *pNodeMap = NULL;
    	//DOMNodeType nodeType;
    
    	VARIANT vXmlPath;
    	VARIANT vValue;
    	VARIANT_BOOL vbStatus;
    	BSTR bstr = NULL;
    	long lLength = 0;
    
    	weather_info_node *lpTemp = NULL;
    
    	int nLen = strlen(lpXmlPath) + 1; 
    	int nwLen  = MultiByteToWideChar(CP_ACP, 0, lpXmlPath, nLen, NULL, 0); 
    
    	TCHAR lpSzXmlPath[256]; 
    	MultiByteToWideChar(CP_ACP, 0, lpXmlPath, nLen, lpSzXmlPath, nwLen); 
    
    	VariantInit(&vXmlPath);
    	V_BSTR(&vXmlPath) = SysAllocString(lpSzXmlPath);
    	V_VT(&vXmlPath) = VT_BSTR;
    
    	CoInitializeEx(NULL, COINIT_MULTITHREADED);
    	HRESULT hr  = CoCreateInstance(CLSID_DOMDocument, 
    		NULL, 
    		CLSCTX_INPROC_SERVER, 
    		IID_IXMLDOMDocument2,
    		(void**)&pXMLDocument);
    
    	hr = pXMLDocument->put_async(VARIANT_FALSE);
    	if (FAILED(hr)) 
    	{
    		printf("Failed to set async property\n");
    	}
    
    	hr = pXMLDocument->put_validateOnParse(VARIANT_FALSE);
    	if (FAILED(hr))
    	{
    		printf("Failed to set validateOnParse\n");
    	}
    
    	hr = pXMLDocument->put_resolveExternals(VARIANT_FALSE);
    	if (FAILED(hr))
    	{
    		printf("Failed to disable resolving externals.\n");	
    	}
    
    	hr = pXMLDocument->load(vXmlPath, &vbStatus);
    	if (vbStatus != VARIANT_TRUE) 
    	{
    		hr = pXMLDocument->get_parseError(&pObjError);
    		hr = pObjError->get_reason(&bstr);
    		printf("Failed to load DOM from books.xml. %S\n",bstr);
    	}
    
    	hr = pXMLDocument->get_xml(&bstr);
    	if(FAILED(hr))
    	{
    		printf("xml 的内容:\n%S\n", bstr);
    		SysFreeString(bstr);
    	}
    
    	hr = pXMLDocument->selectSingleNode(L"//weather", &pNode);
    
    	//hr = pNode->get_nodeName(&bstr);
    
    	hr = pNode->get_childNodes(&pNodeList);
    
    	hr = pNodeList->get_length(&lLength);
    
    	for (int nIndex = 0; nIndex != lLength; ++nIndex)
    	{
    		if (0 == nIndex)
    		{
    			m_lpWeatherNode = NewWeatherNode();
    			lpTemp = m_lpWeatherNode;
    		}
    		else
    		{
    			lpTemp->lpNext = NewWeatherNode();
    			lpTemp = lpTemp->lpNext;
    		}
    
    		hr = pNodeList->get_item(nIndex, &pNode);
    		hr = pNode->get_childNodes(&pChildNodeList);
    		long lChildLength = 0;
    		hr = pChildNodeList->get_length(&lChildLength);
    
    		for (int nChildIndex = 0; nChildIndex != lChildLength; ++nChildIndex)
    		{
    			//hr = pNode->get_nodeName(&bstr);
    
    			switch(nChildIndex)
    			{
    			case xml_day:
    				hr = pChildNodeList->get_item(nChildIndex, &pNode);
    				hr = pNode->get_attributes(&pNodeMap);
    				hr = pNodeMap->get_item(0, &pNode);
    				hr = pNode->get_nodeTypedValue(&vValue);
    
    				memcpy(lpTemp->szDate, (char *)(_bstr_t)vValue.bstrVal, strlen((char *)(_bstr_t)vValue.bstrVal));
    
    				break;
    
    			case xml_low:
    				hr = pChildNodeList->get_item(nChildIndex, &pNode);
    				hr = pNode->get_attributes(&pNodeMap);
    				hr = pNodeMap->get_item(0, &pNode);
    				hr = pNode->get_nodeTypedValue(&vValue);
    
    				lpTemp->fLowTemp = atof((char *)(_bstr_t)vValue.bstrVal);
    
    				break;
    
    			case xml_high:
    				hr = pChildNodeList->get_item(nChildIndex, &pNode);
    				hr = pNode->get_attributes(&pNodeMap);
    				hr = pNodeMap->get_item(0, &pNode);
    				hr = pNode->get_nodeTypedValue(&vValue);
    
    				lpTemp->fHighTemp = atof((char *)(_bstr_t)vValue.bstrVal);
    
    				break;
    
    			case xml_condition:
    				hr = pChildNodeList->get_item(nChildIndex, &pNode);
    				hr = pNode->get_attributes(&pNodeMap);
    				hr = pNodeMap->get_item(0, &pNode);
    				hr = pNode->get_nodeTypedValue(&vValue);
    
    				memcpy(lpTemp->szCondition, (char *)(_bstr_t)vValue.bstrVal, strlen((char *)(_bstr_t)vValue.bstrVal));
    
    				break;
    
    			case xml_wind:
    				hr = pChildNodeList->get_item(nChildIndex, &pNode);
    				hr = pNode->get_attributes(&pNodeMap);
    				hr = pNodeMap->get_item(0, &pNode);
    				hr = pNode->get_nodeTypedValue(&vValue);
    
    				memcpy(lpTemp->szWind, (char *)(_bstr_t)vValue.bstrVal, strlen((char *)(_bstr_t)vValue.bstrVal));
    
    				break;
    
    			default:
    				break;
    			}
    
    		}
    	}
    
    	pChildNodeList->Release();
    	pNodeMap->Release();
    	pNodeList->Release();
    	pNode->Release();
    	pXMLDocument->Release();
    	/*
    	hr = pNodeList->get_item(3,&pNode);
    
    	hr = pNode->get_attributes(&pMap);
    
    	hr = pMap->get_item(0, &pNode);
    
    	hr = pNode->get_nodeTypedValue(&vValue);
    	*/
    	return TRUE;
    }
    void TestMyXml()
    {
    	char *lpTempPath = "\\Storage Card\\WeatherXML20101122150441.txt";
    	ParseWeatherXml(lpTempPath);
    	while(m_lpWeatherNode != NULL)
    	{
    		dbgprintf("Date = %s,Low = %f, High = %f, Condition = %s, Wind = %s", 
    			m_lpWeatherNode->szDate, 
    			m_lpWeatherNode->fLowTemp, 
    			m_lpWeatherNode->fHighTemp, 
    			m_lpWeatherNode->szCondition, 
    			m_lpWeatherNode->szWind);
    
    		m_lpWeatherNode = m_lpWeatherNode->lpNext;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TestMyXml();
    	//TestXML();
    	return 0;
    }
    
    
    void TestXML()
    {
    	IXMLDOMDocument *pXMLDocument= NULL;
    	IXMLDOMNode *pNode = NULL;
    	IXMLDOMNodeList *pNodeList = NULL;
    	IXMLDOMParseError * pObjError = NULL;
    	DOMNodeType nodeType;
    	IXMLDOMNamedNodeMap *pMap = NULL;
    	VARIANT v1;
    	VARIANT variantvalue;
    	VARIANT_BOOL status;
    	BSTR bstr = NULL;
    	VariantInit(&v1);
    	V_BSTR(&v1) = SysAllocString(L"D:\\WeatherXML20101122150441.txt");
    	V_VT(&v1) = VT_BSTR;
    
    	// 首先必须调用CoInitialize
    	CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
    	// 创建一msxml 文档实例,返回IXMLDOMDocument2接口。
    	HRESULT hr  = CoCreateInstance(CLSID_DOMDocument, 
    		NULL, 
    		CLSCTX_INPROC_SERVER, 
    		IID_IXMLDOMDocument2,
    		(void**)&pXMLDocument);
    
    	hr = pXMLDocument->put_async(VARIANT_FALSE);
    	if (FAILED(hr)) {
    		printf("Failed to set async property\n");
    		//goto clean;
    	}
    
    	hr = pXMLDocument->put_validateOnParse(VARIANT_FALSE);
    	if (FAILED(hr)) {
    		printf("Failed to set validateOnParse\n");
    		//goto clean;
    	}
    
    	hr = pXMLDocument->put_resolveExternals(VARIANT_FALSE);
    	if (FAILED(hr)) {
    		printf("Failed to disable resolving externals.\n");
    		//goto clean;
    	}
    
    	hr = pXMLDocument->load(v1, &status);
    
    	if (status!=VARIANT_TRUE) {
    		hr = pXMLDocument->get_parseError(&pObjError);
    		hr = pObjError->get_reason(&bstr);
    		printf("Failed to load DOM from books.xml. %S\n",bstr);
    		//goto clean;
    	}
    
    	hr = pXMLDocument->get_xml(&bstr);
    	printf("foo.xml 的内容:\n%S\n", bstr);
    	SysFreeString(bstr);
    
    	hr = pXMLDocument->selectSingleNode(L"//fc", &pNode);
    	hr = pNode->get_nodeName(&bstr);
    
    	hr = pNode->get_childNodes(&pNodeList);
    
    	long length;
    	hr = pNodeList->get_length(&length);
    	hr = pNodeList->get_item(3,&pNode);
    
    	hr = pNode->get_attributes(&pMap);
    
    	hr = pMap->get_item(0, &pNode);
    
    	hr = pNode->get_nodeTypedValue(&variantvalue);
    
    	//hr = pNode->get_childNodes(&pNodeList);
    
    	//hr = pNodeList->get_item(0, &pNode);
    
    	//hr = pNode->get_nodeType(&nodeType);
    
    	//hr = pNode->get_nodeValue(&variantvalue);
    
    	//hr = pNode->get_dataType(&variantvalue);
    
    
    
    
    	//	hr = pNode->get_xml(&bstr);
    
    	//hr = pNode->get_nodeType(&nodeType);
    
    	//	variantvalue.vt = nodeType;
    
    	//	hr = pNode->get_dataType(&variantvalue);
    
    	//	hr = pNode->get_nodeValue(&variantvalue);
    
    	//hr = pNode->get_nodeTypedValue(&variantvalue);
    
    	// 	hr = pNode->get_
    	// 	if (FAILED(hr)) {
    	// 		hr = pXMLDocument->get_parseError(&pObjError);
    	// 		hr = pObjError->get_reason(&bstr);
    	// 		printf("Failed to load DOM from books.xml. %S\n",bstr);
    	// 		//goto clean;
    	// 	}
    	//hr = pNode->get_nodeName(&bstr);
    	//DOMNodeType nodeType; 
    
    	//得到节点类型 
    	//pNode->get_nodeType(&nodeType); 
    
    	//节点名称 
    	// 
    	// 	BSTR nodeName;
    	// 
    	// 	hr = pNode->get_nodeName(&nodeName);
    	// 
    	// 	char *cNodeName = (char *)nodeName;
    
    	//cNodeName = ConvertBSTRToString(nodeName);
    	//strName=(char *)pNode->GetnodeName();
    
    	//节点属性,放在链表中 
    	// 			MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;
    	// 			MSXML2::IXMLDOMNodePtr   pAttrItem;
    	// 			_variant_t variantvalue;
    	// 			pNode->get_attributes(&pAttrMap);
    	// 
    	// 			long count;
    	// 			count=pAttrMap->get_length(&count);
    	// 
    	// 			pAttrMap->get_item(0,&pAttrItem);
    	// 			//取得节点的值
    	// 			pAttrItem->get_nodeTypedvalue(&variantvalue);
    	// 			m_strId=(char *)(_bstr_t)variantvalue;
    	// 
    	// 			UpdateData(FALSE);
    
    
    	//hr = pXMLDocument->getProperty(L"<day data/>", &v2);
    	//hr = pXMLDocument->save(v1);
    	//pXMLDocument->Release();
    
    	CoUninitialize();
    }
    
    

    xml文件:

    <weather pd="2010-11-22 08:00:00" xmlns="http://www.xxx.com">
      <fc>
        <day data="2010-11-22 08:00:00"/>
        <low data="-2.0"/>
        <high data="9.0"/>
        <condition data="晴"/>
        <wind data="静风、小于3级"/>
        <indexes>
          <index type="3" data="6"/>
          <index type="4" data="6"/>
          <index type="1" data="1"/>
          <index type="2" data="2"/>
        </indexes>
      </fc>
      <fc>
        <day data="2010-11-23 08:00:00"/>
        <low data="1.0"/>
        <high data="9.0"/>
        <condition data="阴"/>
        <wind data="静风、小于3级"/>
      </fc>
      <fc>
        <day data="2010-11-24 08:00:00"/>
        <low data="-4.0"/>
        <high data="6.0"/>
        <condition data="晴"/>
        <wind data="北风转静风、3级转小于3级"/>
      </fc>
    </weather>
    

  • 相关阅读:
    基础练习 龟兔赛跑预测
    SQL查询
    通讯录管理系统
    信号分解
    开源框架 openFrameworks
    开博了
    AES加密原理和AOE工程实践
    一文读懂AOE到底是什么!
    AoE 搭档 TensorFlow Lite ,让终端侧 AI 开发变得更加简单。
    AOE工程实践-银行卡OCR里的图像处理
  • 原文地址:https://www.cnblogs.com/lebronjames/p/1886703.html
Copyright © 2011-2022 走看看