experience in msxml4.0

来源:互联网 发布:mysql c3p0连接池配置 编辑:程序博客网 时间:2024/05/17 03:24

1.引入DLL文件

#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;

如果你没系统没有msxml4.dll文件,下载并且先把msxml4.dll放到系统目录下(windows/system32)下。

2.载入,生成xml文档的代码

#define CHECKHR(hr) if(FAILED(hr)) goto clean;
#define CHECK_NULL(p) if(p == NULL) goto clean;

bool CreateSubElement(const MSXML2::IXMLDOMDocument2Ptr& pXmlDoc
           , MSXML2::IXMLDOMNode* pParent
           , const OLECHAR* name
           , BSTR value)

 bool bRet = false;
 using MSXML2::IXMLDOMElement;
 using MSXML2::IXMLDOMNode;
 IXMLDOMElement* pe = NULL;
 IXMLDOMNode *pNode = NULL;
 BSTR bstr = NULL;
 bstr = ::SysAllocString(name);
 HRESULT hr = pXmlDoc->createElement(bstr, &pe);
 CHECKHR(hr);

 //pe = pXmlDoc->createElement(bstr);
 //CHECK_NULL(pe);
 ::SysFreeString(bstr);
 bstr = NULL;
 hr = pe->put_text(value);
 CHECKHR(hr);
 ::SysFreeString(value);
 value = NULL;
 hr = pParent->appendChild(pe, &pNode);
 CHECKHR(hr);
 //pNode = pParent->appendChild(pe);
 //CHECK_NULL(pNode);
 bRet = true;
clean:
 if(pNode)pNode->Release();
 pNode = NULL;
 if(pe)pe->Release();
 pe = NULL;
 return true;
}

void CPatternXMLGeneratorDlg::OnBnClickedOk()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);

 using MSXML2::IXMLDOMElement;
 using MSXML2::IXMLDOMProcessingInstruction;
 using MSXML2::IXMLDOMNode;
 HRESULT hr;
 IXMLDOMDocument2Ptr pXmlDoc;
 IXMLDOMProcessingInstruction *pi=NULL;
 BSTR bstr1, bstr2;
 IXMLDOMNode *pNode = NULL;
 IXMLDOMElement *pRoot=NULL;
 IXMLDOMElement *pe=NULL;
 VARIANT var;
  CString strTrans;


 hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument40));
 CHECKHR(hr);
 pXmlDoc->put_async(VARIANT_FALSE);

 //create instruction
 bstr1 = ::SysAllocString(L"xml");
 bstr2 = ::SysAllocString(L"version='1.0'");
 hr = pXmlDoc->createProcessingInstruction(bstr1, bstr2, &pi);
 CHECKHR(hr);
 //pi = pXmlDoc->createProcessingInstruction(bstr1, bstr2);
 CHECK_NULL(pi);
 hr = pXmlDoc->appendChild(pi, &pNode);
 CHECKHR(hr);
 //pNode = pXmlDoc->appendChild(pi);
 CHECK_NULL(pNode);
 if(pNode)
  pNode->Release();
 pNode = NULL;
 pi->Release();
 pi = NULL;
 ::SysFreeString(bstr1);
 bstr1 = NULL;
 ::SysFreeString(bstr2);
 bstr2 = NULL;

 //create root node <webpattern>
 bstr1 = ::SysAllocString(L"webpattern");
 hr = pXmlDoc->createElement(bstr1, &pRoot);
 CHECKHR(hr);
 //pRoot = pXmlDoc->createElement(bstr1);
 //CHECK_NULL(pRoot);
 hr = pXmlDoc->appendChild(pRoot, &pNode);
 CHECKHR(hr);
 //pNode = pXmlDoc->appendChild(pRoot);
 //CHECK_NULL(pNode);
 if(pNode)pNode->Release();
 pNode = NULL;
 ::SysFreeString(bstr1);
 bstr1 = NULL;

 //add element
 CreateSubElement(pXmlDoc, pRoot, BSTR_RECORDPATTERN, m_strRecordPattern.AllocSysString());

/*......*/ 

 VariantClear(&var);
 VariantInit(&var);
 V_VT(&var) =VT_BSTR;
 V_BSTR(&var) = m_strFileName.AllocSysString();
 hr = pXmlDoc->save(var);
 CHECKHR(hr);
 MessageBox(_T("generating successfully"));
clean:
 if(pi)pi->Release();
 if(pNode)pNode->Release();
 if(pe)pe->Release();
 if(pRoot)pRoot->Release();
}

CString QueryXmlNode(MSXML2::IXMLDOMNode* pParent, const OLECHAR* name)
{
 MSXML2::IXMLDOMNode *pNode=NULL;
 BSTR bstr = ::SysAllocString(name);
 HRESULT hr = pParent->selectSingleNode(bstr, &pNode);
 //pNode = pParent->selectSingleNode(bstr);
 ::SysFreeString(bstr);
 bstr = NULL;
 if(pNode)
 {
  pNode->get_text(&bstr);
  CString strRet = bstr;
  pNode->Release();
  pNode = NULL;
  ::SysFreeString(bstr);
  bstr = NULL;
  return strRet;
 }
 return CString();
}

void CPatternXMLGeneratorDlg::OnBnClickedButtonLoad()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);

 HRESULT hr;
 IXMLDOMDocument2Ptr pXmlDoc = NULL;
 MSXML2::IXMLDOMNode* pRoot = NULL;
 VARIANT var;
 VARIANT_BOOL status;
 BSTR bstr;

 hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument40));
 CHECKHR(hr);
 pXmlDoc->put_async(VARIANT_FALSE);

 VariantInit(&var);
 V_VT(&var) = VT_BSTR;
 V_BSTR(&var) = m_strFileName.AllocSysString();

 hr = pXmlDoc->load(var, &status);
 //status = pXmlDoc->load(var);
 if(FAILED(hr) && status != VARIANT_TRUE)
  goto clean;
 bstr = ::SysAllocString(L"webpattern");
 hr = pXmlDoc->selectSingleNode(bstr, &pRoot);
 //pRoot = pXmlDoc->selectSingleNode(bstr);
 ::SysFreeString(bstr);
 bstr = NULL;
 CHECKHR(hr);
 //CHECK_NULL(pRoot);
 m_strRecordPattern = QueryXmlNode(pRoot, BSTR_RECORDPATTERN);

/*......*/

clean:
 return;
 if(pXmlDoc)pXmlDoc->Release();
 //if(pRoot)pRoot->Release();
}

3.在融入到一个大的已经包含了msxml4.0库的环境中出了问题,由于这个大的环境中没有用raw_interfaces_only,所以需要对程序作改动,主要是用只能指针替代了传统指针。代码如下:

static bool CreateSubElement(const MSXML2::IXMLDOMDocument2Ptr pXmlDoc
           , MSXML2::IXMLDOMNodePtr pParent
           , const OLECHAR* name
           , BSTR value)
{
 bool bRet = false;
 using MSXML2::IXMLDOMElementPtr;
 using MSXML2::IXMLDOMNodePtr;
 IXMLDOMElementPtr pe = NULL;
 IXMLDOMNodePtr pNode = NULL;
 BSTR bstr = NULL;
 bstr = ::SysAllocString(name);
 pe = pXmlDoc->createElement(bstr);
 if(pe == NULL)goto clean;
 ::SysFreeString(bstr);
 bstr = NULL;
 HRESULT hr = pe->put_text(value);
 if(FAILED(hr))goto clean;
 ::SysFreeString(value);
 value = NULL;
 pNode = pParent->appendChild(pe);
 if(pNode == NULL)goto clean;
 bRet = true;
clean:
 //if(pNode)pNode->Release();
 //pNode = NULL;
 //if(pe)pe->Release();
 //pe = NULL;
 return true;
}

#define CHECK_NULL(p) if(p == NULL)goto clean;
#define CHECK_HR(hr) if(FAILED(hr))goto clean;

bool WebSitePattern::SavePatternToXml(const CString &strFileName)
{
 if(!IsLoaded())
  return false;

 bool bRet = false;
 using MSXML2::IXMLDOMElementPtr;
 using MSXML2::IXMLDOMProcessingInstructionPtr;
 using MSXML2::IXMLDOMNodePtr;
 HRESULT hr;
 IXMLDOMDocument2Ptr pXmlDoc;
 IXMLDOMProcessingInstructionPtr pi=NULL;
 BSTR bstr1, bstr2;
 IXMLDOMNodePtr pNode = NULL;
 IXMLDOMElementPtr pRoot=NULL;
 IXMLDOMElementPtr pe=NULL;
 VARIANT var;
 CString strTrans;

 

 hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument40));
 CHECK_HR(hr);
 pXmlDoc->put_async(VARIANT_FALSE);

 //create instruction
 bstr1 = ::SysAllocString(L"xml");
 bstr2 = ::SysAllocString(L"version='1.0'");
 pi = pXmlDoc->createProcessingInstruction(bstr1, bstr2);
 CHECK_NULL(pi);
 pNode = pXmlDoc->appendChild(pi);
 CHECK_NULL(pNode);
 //if(pNode)
  //pNode->Release();
 //pNode = NULL;
 //pi->Release();
 //pi = NULL;
 ::SysFreeString(bstr1);
 bstr1 = NULL;
 ::SysFreeString(bstr2);
 bstr2 = NULL;

 //create root node <webpattern>
 bstr1 = ::SysAllocString(L"webpattern");
 pRoot = pXmlDoc->createElement(bstr1);
 CHECK_NULL(pRoot);
 pNode = pXmlDoc->appendChild(pRoot);
 CHECK_NULL(pNode);
 //if(pNode)pNode->Release();
 //pNode = NULL;
 ::SysFreeString(bstr1);
 bstr1 = NULL;

 //add element
 CreateSubElement(pXmlDoc, pRoot, BSTR_RECORDPATTERN, m_strRecordPattern.AllocSysString());
/*..........*/

 VariantClear(&var);
 VariantInit(&var);
 V_VT(&var) =VT_BSTR;
 V_BSTR(&var) = strFileName.AllocSysString();// ::SysAllocString(L"save.xml");
 hr = pXmlDoc->save(var);
 CHECK_HR(hr);
 bRet = true;
clean:
 return bRet;
}static CString QueryXmlNode(MSXML2::IXMLDOMNodePtr pParent, const OLECHAR* name)
{
 MSXML2::IXMLDOMNodePtr pNode=NULL;
 BSTR bstr = ::SysAllocString(name);
 pNode = pParent->selectSingleNode(bstr);
 ::SysFreeString(bstr);
 bstr = NULL;
 if(pNode)
 {
  pNode->get_text(&bstr);
  CString strRet = bstr;
  ::SysFreeString(bstr);
  bstr = NULL;
  return strRet;
 }
 return CString();
}

bool WebSitePattern::LoadPatternFromXml(const CString& strFileName)
{
 m_bPatternLoaded = false;
 HRESULT hr;
 IXMLDOMDocument2Ptr pXmlDoc = NULL;
 MSXML2::IXMLDOMNodePtr pRoot = NULL;
 VARIANT var;
 VARIANT_BOOL status;
 BSTR bstr;
 CString strTime;

 hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument40));
 CHECK_HR(hr);
 pXmlDoc->put_async(VARIANT_FALSE);

 VariantInit(&var);
 V_VT(&var) = VT_BSTR;
 V_BSTR(&var) = strFileName.AllocSysString();

 status = pXmlDoc->load(var);
 if(status != VARIANT_TRUE)
  goto clean;
 bstr = ::SysAllocString(BSTR_WEBPATTERN);
 pRoot = pXmlDoc->selectSingleNode(bstr);
 ::SysFreeString(bstr);
 bstr = NULL;
 if(pRoot == NULL)
  goto clean;
 m_strRecordPattern = QueryXmlNode(pRoot, BSTR_RECORDPATTERN);
 /*......*/

 m_bPatternLoaded = true;
clean:
 //if(pXmlDoc)pXmlDoc->Release();
 //if(pRoot)pRoot->Release();
 m_strFileName = strFileName;
 return m_bPatternLoaded;
}

原创粉丝点击