-- 作者:haomeng1999
-- 发布时间:5/18/2005 4:35:00 PM
--
#pragma once /* Author: 郝猛 Date: 2005-03-25 */ class CXMLWrapper { private: CComPtr<IXMLDOMDocument> spXMLDOM;// 代表配置文件文档指针 public: DWORD loadXMLDoc( const char * pchFilePath // [in]表示文件路径的参数 );// 加载xml配置文件的函数 DWORD findValue( const char * pchType, // [in]类型,请参见xml配置文件,可以取4个值:apdu,file,usat,stat const char * pchId, // [in]xml元素的id值, char * pchValue // [out]需要得到的值 );// 由健取对应值的函数 CXMLWrapper(void); ~CXMLWrapper(void); }; 以上是头文件 #include "StdAfx.h" #include ".\xmlwrapper.h" #define LENGTH_OF_XPATH 50 #define LENGTH_OF_ID 10 /* Author: 郝猛 Date: 2005-03-25 */ CXMLWrapper::CXMLWrapper(void) { HRESULT hr; // 初始化com库 CoInitialize(NULL); // 创建dom文档实例 hr=spXMLDOM.CoCreateInstance(_uuidof(DOMDocument)); } /* Author: 郝猛 Date: 2005-03-25 */ CXMLWrapper::~CXMLWrapper(void) { if( spXMLDOM.p != NULL ) spXMLDOM.Release(); CoUninitialize(); } /* Author: 郝猛 Date: 2005-03-25 */ DWORD CXMLWrapper::loadXMLDoc( const char * pchFilePath ) { HRESULT hr; VARIANT_BOOL bSuccess=false; hr=spXMLDOM->load(CComVariant(pchFilePath),&bSuccess); if( hr == S_OK ) { return 0; } else return 1; } /* Author: 郝猛 Date: 2005-03-25 */ DWORD CXMLWrapper::findValue( const char * pchType, // 输入参数:类型: const char * pchId, // 输入参数:健值 char * pchValue // 输出参数:字符串值 ) { CComQIPtr<IXMLDOMNodeList> spIDOMNodeList; // 结点列表 CComQIPtr<IXMLDOMNodeList> spIDOMElementList; CComQIPtr<IXMLDOMNode> spIDOMNode; // 单个结点 CComQIPtr<IXMLDOMNode> spIDOMChildnode; // 子结点 CComQIPtr<IXMLDOMNode> spIXMLChildNode; // 新的子结点,用于替换 CComQIPtr<IXMLDOMNode> spIDOMChildelement; // 新的元素 CComQIPtr<IXMLDOMElement> spXMLChildElement; CComBSTR bstrValue; long lNumber = 0;// 满足条件的节点数目 long lNumElement = 0; // 满足条件的元素数目 HRESULT hr; // 先查找该结点,如果类型为apdu那么结点名称为apduitem // 如果类型为usat,那么结点名称为usatitem // 先组合一个xpath,如果查询的apduitem节点的id属性为"B0" // 那么xpath表达式为:protocol/apdu/apduitem[@id='B0'] // unsigned char chXPath[LENGTH_OF_XPATH] = "protocol/"; unsigned char chXPath_temp[LENGTH_OF_XPATH] = ""; unsigned char chTemp[LENGTH_OF_ID] = ""; unsigned char chTemp_short[LENGTH_OF_ID] = ""; char chStatvalue[3] = ""; size_t sizeLength = 0; if( pchType == NULL || pchId == NULL ) return 1; try{ // assemble the xpath statement strcat( (char *)chXPath, pchType ); // apdu, usat or file? strcat( (char *)chXPath, "/" ); strcat( (char *)chXPath, pchType ); strcat( (char *)chXPath, "item[@id='" ); strcat( (char *)chXPath, pchId ); strcat( (char *)chXPath, "']" ); CComBSTR bstrXPath((LPCSTR)chXPath);// 转换成BSTR类型 // xml文档已经载入,现在开始查找结点 hr = spXMLDOM->selectNodes( bstrXPath, &spIDOMNodeList ); SUCCEEDED(hr) ? 0 : throw hr; hr = spIDOMNodeList->get_length(&lNumber);// 得到符合要求的节点数目 if( SUCCEEDED( hr ) ) { if( lNumber != 1 ) throw hr; hr = spIDOMNodeList->get_item(0, &spIDOMNode); if( SUCCEEDED( hr ) ) { spIDOMNode->get_text(&bstrValue); USES_CONVERSION; strcpy( pchValue, W2T( bstrValue.m_str ) ); } } } catch(...) { return 1; } return 0; } 以上是cpp文件
|