XMLDoc.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:9k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. class CXMLNode;
  7. class CXMLDocument;
  8. Warning:
  9. To use these classes, must call AfxOleInit() first.
  10. */
  11. #include "stdafx.h"
  12. #include <afxconv.h>
  13. #include <errno.h>
  14. #include "../Include/Markup.h"
  15. #include "../Include/XMLDoc.h"
  16. #include "strings.h"
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char THIS_FILE[]=__FILE__;
  20. #define new DEBUG_NEW
  21. #endif
  22. static CString FormatTime( CSPTime tm )
  23. {
  24. return (LPCTSTR)tm.Format( "%Y/%m/%d %H:%M:%S" );
  25. }
  26. static BOOL ParseTime( CString strTime, CSPTime &tm )
  27. {
  28. char sepDate = '/';
  29. char sepTime = ':';
  30. char sepDateTime = ' ';
  31. strTime.TrimLeft();
  32. strTime.TrimRight();
  33. if( strTime.IsEmpty() )
  34. return FALSE;
  35. int nYear = 1971, nMonth = 1, nDay = 1;
  36. int nHour = 0, nMinute= 0, nSecond = 0;
  37. CString strTemp;
  38. int nIndex;
  39. // year
  40. nIndex = strTime.Find( sepDate );
  41. if( -1 != nIndex )
  42. {
  43. strTemp = strTime.Left(nIndex);
  44. strTime = strTime.Mid(nIndex+1);
  45. nYear = atol(strTemp);
  46. }
  47. else
  48. {
  49. nYear = atol(strTime);
  50. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  51. return (-1 != tm.GetTime());
  52. }
  53. // month
  54. nIndex = strTime.Find( sepDate );
  55. if( -1 != nIndex )
  56. {
  57. strTemp = strTime.Left(nIndex);
  58. strTime = strTime.Mid(nIndex+1);
  59. nMonth = atol(strTemp);
  60. }
  61. else
  62. {
  63. nMonth = atol(strTime);
  64. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  65. return (-1 != tm.GetTime());
  66. }
  67. // day
  68. nIndex = strTime.Find( sepDateTime );
  69. if( -1 != nIndex )
  70. {
  71. strTemp = strTime.Left(nIndex);
  72. strTime = strTime.Mid(nIndex+1);
  73. nDay = atol(strTemp);
  74. }
  75. else
  76. {
  77. nDay = atol(strTime);
  78. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  79. return (-1 != tm.GetTime());
  80. }
  81. // hour
  82. nIndex = strTime.Find( sepTime );
  83. if( -1 != nIndex )
  84. {
  85. strTemp = strTime.Left(nIndex);
  86. strTime = strTime.Mid(nIndex+1);
  87. nHour = atol(strTemp);
  88. }
  89. else
  90. {
  91. nHour = atol(strTime);
  92. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  93. return (-1 != tm.GetTime());
  94. }
  95. // minute
  96. nIndex = strTime.Find( sepTime );
  97. if( -1 != nIndex )
  98. {
  99. strTemp = strTime.Left(nIndex);
  100. strTime = strTime.Mid(nIndex+1);
  101. nMinute = atol(strTemp);
  102. }
  103. else
  104. {
  105. nMinute = atol(strTime);
  106. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  107. return (-1 != tm.GetTime());
  108. }
  109. // second
  110. nSecond = atol(strTime);
  111. tm = CSPTime( nYear, nMonth, nDay, nHour, nMinute, nSecond );
  112. return (-1 != tm.GetTime());
  113. }
  114. //////////////////////////////////////////////////////////////////////////////////
  115. // class CXMLNode
  116. CXMLNode::CXMLNode( )
  117. {
  118. }
  119. BOOL CXMLNode::SetAttribute( CMarkup & markup )
  120. {
  121. return TRUE;
  122. }
  123. CString CXMLNode::getAttrValue( CMarkup & markup, LPCTSTR lpszName )
  124. {
  125. ASSERT( NULL != lpszName );
  126. return markup.GetAttrib( lpszName );
  127. }
  128. long CXMLNode::getAttrValue_I( CMarkup & markup, LPCTSTR lpszName )
  129. {
  130. ASSERT( NULL != lpszName );
  131. CString strValue = markup.GetAttrib( lpszName );
  132. if( strValue.GetLength() <= 0 )
  133. return 0;
  134. LPTSTR lpstrRet = NULL;
  135. long nRet;
  136. nRet = _tcstoul( (LPCTSTR)strValue, &lpstrRet, 10 );
  137. if( ERANGE == errno || ( lpstrRet && '' != *lpstrRet ) )
  138. return 0;
  139. return nRet;
  140. }
  141. CSPTime CXMLNode::getAttrValue_T( CMarkup & markup, LPCTSTR lpszName )
  142. {
  143. ASSERT( NULL != lpszName );
  144. CString strValue = markup.GetAttrib( lpszName );
  145. CSPTime tmRet;
  146. if( ParseTime( strValue, tmRet ) )
  147. return tmRet;
  148. else
  149. return CSPTime::GetCurrentTime();
  150. }
  151. //////////////////////////////////////////////////////////////////////////////////
  152. // class CXMLDocument
  153. CXMLDocument::CXMLDocument()
  154. {
  155. }
  156. CXMLDocument::~CXMLDocument()
  157. {
  158. }
  159. BOOL CXMLDocument::Initialize()
  160. {
  161. return TRUE;
  162. }
  163. void CXMLDocument::Release()
  164. {
  165. m_markup.SetDoc( _T("") );
  166. }
  167. BOOL CXMLDocument::SetRawDocument( CString &strDoc )
  168. {
  169. return m_markup.SetDoc( strDoc );
  170. }
  171. void CXMLDocument::SetLastErrorMessage(LPCTSTR lpszError)
  172. {
  173. if( NULL != lpszError )
  174. m_strLastErrorMessage = lpszError;
  175. }
  176. BOOL CXMLDocument::GetLastErrorMessage(LPTSTR lpszError, UINT nMaxError )
  177. {
  178. if( m_strLastErrorMessage.IsEmpty() )
  179. m_strLastErrorMessage = szErrXMLDefault;
  180. strncpy( lpszError, m_strLastErrorMessage.GetBuffer(m_strLastErrorMessage.GetLength()+1), nMaxError );
  181. m_strLastErrorMessage.ReleaseBuffer();
  182. return strlen(lpszError)>0;
  183. }
  184. /////////////////////////////////////////////////////////////////////////////////////
  185. // The Old XMLDoc using msxml.dll 2.5(gb2312) or above
  186. /* 
  187. //////////////////////////////////////////////////////////////////////////////////
  188. // class CXMLNode
  189. CXMLNode::CXMLNode( )
  190. {
  191. }
  192. BOOL CXMLNode::SetAttribute( MSXML::IXMLDOMNodePtr pNode )
  193. {
  194. MSXML::IXMLDOMNamedNodeMapPtr pMap = pNode->Getattributes( );
  195. if( NULL == pMap )
  196. return FALSE;
  197. return TRUE;
  198. }
  199. BOOL CXMLNode::getAttrValue( MSXML::IXMLDOMNamedNodeMapPtr pMap, 
  200. LPCTSTR lpcszName, _bstr_t& bstrValue )
  201. {
  202. ASSERT( NULL != pMap );
  203. ASSERT( NULL != lpcszName );
  204. _bstr_t bstrName = lpcszName;
  205. MSXML::IXMLDOMNodePtr pNode = pMap->getNamedItem( bstrName );
  206. if( NULL == pNode )
  207. {
  208. return FALSE;
  209. }
  210. bstrValue = pNode->Gettext( );
  211. return TRUE;
  212. }
  213. CString CXMLNode::getAttrValue( MSXML::IXMLDOMNamedNodeMapPtr pMap, 
  214. LPCTSTR lpcszName )
  215. {
  216. ASSERT( NULL != pMap );
  217. ASSERT( NULL != lpcszName );
  218. _bstr_t bstrName = lpcszName;
  219. MSXML::IXMLDOMNodePtr pNode = pMap->getNamedItem( bstrName );
  220. if( NULL == pNode )
  221. {
  222. return "";
  223. }
  224. return (LPCTSTR)pNode->Gettext( );
  225. }
  226. long CXMLNode::getAttrValue_I( MSXML::IXMLDOMNamedNodeMapPtr pMap, LPCTSTR lpcszName )
  227. {
  228. LPTSTR lpstrRet = NULL;
  229. long nRet;
  230. CString strValue = getAttrValue( pMap, lpcszName );
  231. nRet = _tcstoul( (LPCTSTR)strValue, &lpstrRet, 10 );
  232. if( ERANGE == errno || ( lpstrRet && '' != *lpstrRet ) )
  233. return 0;
  234. return nRet;
  235. }
  236. CSPTime CXMLNode::getAttrValue_T( MSXML::IXMLDOMNamedNodeMapPtr pMap, LPCTSTR lpcszName )
  237. {
  238. CSPTime tmRet;
  239. CString strValue = getAttrValue( pMap, lpcszName );
  240. if( ParseTime( strValue, tmRet ) )
  241. return tmRet;
  242. else
  243. return CSPTime::GetCurrentTime();
  244. }
  245. //////////////////////////////////////////////////////////////////////////////////
  246. // class CXMLDocument
  247. CXMLDocument::CXMLDocument()
  248. {
  249. m_pDOMDoc = NULL;
  250. }
  251. CXMLDocument::~CXMLDocument()
  252. {
  253. }
  254. BOOL CXMLDocument::Initialize()
  255. {
  256. if( m_pDOMDoc )
  257. return TRUE;
  258. try
  259. {
  260. MSXML::IXMLDOMDocumentPtr pDOMDoc(__uuidof(MSXML::DOMDocument));
  261. m_pDOMDoc = pDOMDoc;
  262. }
  263. catch(_com_error e)
  264. {
  265. TRACE(_T("Caught Exception: OnOpenURL"));
  266. }
  267. catch(...)
  268. {
  269. TRACE(_T("Caught Exception: OnOpenURL"));
  270. }
  271. return ( NULL != m_pDOMDoc );
  272. }
  273. void CXMLDocument::Release()
  274. {
  275. }
  276. //Synchronously create a stream on a URL.
  277. //
  278. // hr = URLOpenBlockingStream(0, pszURL, &pStm, 0,0);    
  279. // CHECK_ERROR(SUCCEEDED(hr) && pStm, "Couldn't open stream on URL")
  280. //
  281. //Get the IPersistStreamInit interface to the XML doc.
  282. //
  283. // hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
  284. // CHECK_ERROR(SUCCEEDED(hr), "QI for IPersistStreamInit failed");
  285. //
  286. //Init the XML doc from the stream.
  287. // hr = pPSI->Load(pStm);
  288. BOOL CXMLDocument::Load(LPCTSTR lpcszURL)
  289. {
  290. USES_CONVERSION;
  291. if( NULL == m_pDOMDoc || NULL == lpcszURL )
  292. return FALSE;
  293. try
  294. {
  295. m_pDOMDoc->put_async(VARIANT_FALSE);
  296. _bstr_t bstrURL = lpcszURL;
  297. VARIANT_BOOL varResult = m_pDOMDoc->load(_variant_t(bstrURL));
  298. if (VARIANT_FALSE == varResult)
  299. {
  300. // Load failed
  301. MSXML::IXMLDOMParseErrorPtr pParseError = m_pDOMDoc->GetparseError();
  302. long dwError = pParseError->GeterrorCode();
  303. _bstr_t bstrReason = pParseError->Getreason();
  304. CString strError;
  305. strError.Format(_T("XML Parse Error 0x%x : %s"), dwError, W2T(bstrReason));
  306. m_strLastErrorMessage = strError;
  307. return FALSE;
  308. }
  309. }
  310. catch( ... )
  311. {
  312. return FALSE;
  313. }
  314. return TRUE;
  315. }
  316. BOOL CXMLDocument::SetRawDocument( CString &strDoc )
  317. {
  318. USES_CONVERSION;
  319. if( NULL == m_pDOMDoc )
  320. return FALSE;
  321. try
  322. {
  323. m_pDOMDoc->put_async(VARIANT_FALSE);
  324. VARIANT_BOOL varResult = m_pDOMDoc->loadXML( _bstr_t(strDoc) );
  325. if (VARIANT_FALSE == varResult)
  326. {
  327. // Load failed
  328. MSXML::IXMLDOMParseErrorPtr pParseError = m_pDOMDoc->GetparseError();
  329. long dwError = pParseError->GeterrorCode();
  330. _bstr_t bstrReason = pParseError->Getreason();
  331. CString strError;
  332. strError.Format(_T("XML Parse Error 0x%x : %s"), dwError, W2T(bstrReason));
  333. m_strLastErrorMessage = strError;
  334. return FALSE;
  335. }
  336. }
  337. catch( ... )
  338. {
  339. return FALSE;
  340. }
  341. return TRUE;
  342. }
  343. void CXMLDocument::SetLastErrorMessage(LPCTSTR lpszError)
  344. {
  345. if( NULL != lpszError )
  346. m_strLastErrorMessage = lpszError;
  347. }
  348. BOOL CXMLDocument::GetLastErrorMessage(LPTSTR lpszError, UINT nMaxError )
  349. {
  350. if( m_strLastErrorMessage.IsEmpty() )
  351. m_strLastErrorMessage = szErrXMLDefault;
  352. strncpy( lpszError, m_strLastErrorMessage.GetBuffer(m_strLastErrorMessage.GetLength()+1), nMaxError );
  353. m_strLastErrorMessage.ReleaseBuffer();
  354. return strlen(lpszError)>0;
  355. }
  356. */
  357. // The Old XMLDoc using msxml.dll 2.5(gb2312) or above
  358. /////////////////////////////////////////////////////////////////////////////////////