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;
}
- experience in msxml4.0
- 配置MSXML4.0环境
- MSXML4
- PM experience in brief
- Programming experience in C
- working experience in MST
- Experience in creating an Axtivex
- Experience in github (keep updating)
- experience
- Experience
- Experience the computer is kept in repair
- MSXML4操作
- SCEA5.0 part-1 experience
- my experience on evernote<0>
- 51talk-0 experience class
- Tips for a Comfortable Home Relocation Experience in Navi Mumbai
- Discussions in User Experience.pdf 英文原版 免费下载
- VC6.0通过soap3.0和MSXML4.0访问创建的WebService
- 内存学习
- 微软的面试题及答案
- C#验证整数
- 建立Delphi窗体模板
- 禁止软件运行
- experience in msxml4.0
- Windows的CMD个性设置
- TiddlyWiki使用心得
- 内存学习2
- 如何在vs.net里调试脚本
- 标签通用分页详细注释
- 【转】大话西游影评
- 看准再下手 6000以下最值得购买8款本
- 程序员