我用vc对xml编程,
void CXmlDlg::OnGet()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
//根节点的名称为china
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!");
pDoc->raw_createElement((_bstr_t)(char*)"china",&xmlRoot);
pDoc->raw_appendChild(xmlRoot,NULL);
MSXML2::IXMLDOMElementPtr childNode;
pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("WuHan");//节点值
childNode->setAttribute("population","8,000,000");//属性名,属性值 childNode->setAttribute("area","10000");
xmlRoot->appendChild(childNode);
pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("ShangHai");
childNode->setAttribute("population","12,000,000");
childNode->setAttribute("area","12000");
xmlRoot->appendChild(childNode); //保存到文件
//如果不存在就建立,存在就覆盖
pDoc->save("f:\\he.xml");
}
}
}运行后,老是提示"无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!"我下载了一个msxml4.0后,仍然提示以上错误。请问,这个“ms xml parser运行库”怎样安装?放在那个目录下??
void CXmlDlg::OnGet()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
//根节点的名称为china
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!");
pDoc->raw_createElement((_bstr_t)(char*)"china",&xmlRoot);
pDoc->raw_appendChild(xmlRoot,NULL);
MSXML2::IXMLDOMElementPtr childNode;
pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("WuHan");//节点值
childNode->setAttribute("population","8,000,000");//属性名,属性值 childNode->setAttribute("area","10000");
xmlRoot->appendChild(childNode);
pDoc->raw_createElement((_bstr_t)(char*)"City",&childNode);
childNode->Puttext("ShangHai");
childNode->setAttribute("population","12,000,000");
childNode->setAttribute("area","12000");
xmlRoot->appendChild(childNode); //保存到文件
//如果不存在就建立,存在就覆盖
pDoc->save("f:\\he.xml");
}
}
}运行后,老是提示"无法创建DOMDocument对象,请检查是否安装了MS XML Parser运行库!"我下载了一个msxml4.0后,仍然提示以上错误。请问,这个“ms xml parser运行库”怎样安装?放在那个目录下??
记不清了好像是
#import xxxxml.dll
如果你下载并安装了msxml4.0,则在调用的时候要用CLSID_DOMDocument40,而不是30。
//创建COM对象实例
hrErr = CoCreateInstance(CLSID_DOMDocument40,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument2,
(void**)&pXMLDOMDoc);
if (hrErr == S_OK)
//如果COM对象实例创建成功
{.....
}问题2:
在调用XML解析之前,你需要对COM进行初始化,并在程序结束时进行反初始化:
//初始化
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr))
{
AfxMessageBox("出现意外,请与开发工程师联系 :(");
//exit(hr);
} //反初始化:
CoUninitialize();
谢谢了。
头文件如下:
// XMLEngine.h: interface for the CXMLEngine class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_)
#define AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include "stdio.h"
#import "msxml3.dll"
using namespace MSXML2;inline void EVAL_HR( HRESULT _hr ) { if FAILED(_hr) throw(_hr); }class CXMLEngine
{
public:
CXMLEngine();
virtual ~CXMLEngine(); public:
IXMLDOMDocumentPtr objDOMDoc;
BSTR mXML;
public: int CXMLEngine::Initialize(char *sFileName);
IXMLDOMNodePtr GetNode(BSTR sKey);
HRESULT DeleteNode(BSTR sKey);
VARIANT GetAttribute(IXMLDOMNodePtr oNode,char *sKey);
HRESULT SaveXML_To_File(char *filename);
HRESULT AddNode(char *sParent_Key, char *sKey, char *sElementInformation);
//HRESULT SetAttribute(IXMLDOMElement *oNode,char *sAttributeName, char *sAttributeValue);
void Refresh();};#endif // !defined(AFX_XMLENGINE_H__D90FD963_E91B_4028_94A0_82B96A5EA1B4__INCLUDED_)实现文件如下:// XMLEngine.cpp: implementation of the CXMLEngine class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "SLNRel.h"
#include "XMLEngine.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////#define RELEASE(pInterface)\
{\
pInterface->Release();\
pInterface=NULL;\
}\CXMLEngine::CXMLEngine()
{
}
CXMLEngine::~CXMLEngine()
{
}
int CXMLEngine::Initialize(char *sFileName)
{
char searchPath[200];
try
{
EVAL_HR(CoInitialize(NULL));
//EVAL_HR(objDOMDoc.CreateInstance("Msxml2.DOMDocument.3.0"));
EVAL_HR(objDOMDoc.CreateInstance("microsoft.xmldom"));
// GetCurrentDirectory(200, searchPath);
// strcat(searchPath,"\\");
// strcat(searchPath,sFileName); _variant_t varXml(sFileName);
_variant_t varOut((bool)TRUE); objDOMDoc->async = false;
varOut = objDOMDoc->load(varXml); mXML=objDOMDoc->xml;
// AfxMessageBox(objDOMDoc->xml);//mXML); if ((bool)varOut == FALSE)
throw(0);
return 0;
}
catch(...)
{
AfxMessageBox("Exception occurred");
return -1;
} CoUninitialize();
}
IXMLDOMNodePtr CXMLEngine::GetNode(BSTR sKey)
{
/*
Purpose:locate a specific node in the
xml structure by its "key" value
*/
CString sCriteria; IXMLDOMNodePtr oNode; sCriteria = "//node[@key $eq$ '";
sCriteria += sKey;
sCriteria += "']"; oNode=objDOMDoc->selectSingleNode(_bstr_t(sCriteria)); if (oNode!=NULL)
{
return(oNode);
}
else
{
AfxMessageBox("Node Not Found");
return(NULL);
}
}
HRESULT CXMLEngine::DeleteNode(BSTR sKey)
{
/*
'Purpose: remove a node from the xml tree
'1)Find the node
'2)Find the node's parent
'3)Invoke the parents removeChild method deleting
'the node and its descendants from the xml tree.
*/
IXMLDOMNodePtr oNode;
IXMLDOMNodePtr oParentNode;
VARIANT sParent_Key; oNode = GetNode(sKey); if(oNode != NULL)
{
sParent_Key=GetAttribute(oNode,"parent_key"); //AfxMessageBox(_bstr_t(sParent_Key));
oParentNode = GetNode(_bstr_t(sParent_Key)); if (oParentNode != NULL)
{
oParentNode->removeChild(oNode);
}
}
else
{
return(E_FAIL);
}
return(S_OK);
}VARIANT CXMLEngine::GetAttribute(IXMLDOMNodePtr oNode,char *sKey)
{
IXMLDOMNodePtr oAttribute;
IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;
VARIANT sReturn_Key; DOMNamedNodeMapPtr = oNode->attributes; oAttribute=DOMNamedNodeMapPtr->getNamedItem(_bstr_t(sKey));
oAttribute->get_nodeValue(&sReturn_Key); return(sReturn_Key);
}
HRESULT CXMLEngine::SaveXML_To_File(char *sFilename)
{
char sSaveFile[200]; GetCurrentDirectory(200, sSaveFile);
strcat(sSaveFile,"\\");
strcat(sSaveFile,sFilename); objDOMDoc->save(sSaveFile); return(S_OK);
}
HRESULT CXMLEngine::AddNode(char *sParent_Key, char *sKey, char *sElementInformation)
{
/*
Purpose: Add a node to the xml tree
1)Search for the parent node
2)Assign attribute values to the new node
3)Insert the new node into the xml tree
*/
//IXMLDOMNodePtr oNewNode;
IXMLDOMElementPtr oElementNode;
IXMLDOMNodePtr oParentNode, oProposedNode;
CString sCriteria;
HRESULT hr; //1-Check if the Node already exists
sCriteria = "//node[@key $eq$ '";
sCriteria += sKey;
sCriteria += "']"; oProposedNode = objDOMDoc->selectSingleNode(_bstr_t(sCriteria));
if (oProposedNode!=NULL)
{
return (E_FAIL);
} //2-Search for Parent Node Match
sCriteria = "//node[@key $eq$ '";
sCriteria += sParent_Key;
sCriteria += "']"; oParentNode = objDOMDoc->selectSingleNode(_bstr_t(sCriteria));
//3-Insert new Node into Document Object Model (dom) structure if (oParentNode != NULL)
{
//oNewNode = objDOMDoc->createElement("node");
oElementNode=objDOMDoc->createElement("node");
hr=oElementNode->setAttribute(_bstr_t("parent_key"),_bstr_t(sParent_Key));
hr=oElementNode->setAttribute(_bstr_t("key"),_bstr_t(sKey));
hr=oElementNode->setAttribute(_bstr_t("element_inforamtion"),_bstr_t(sElementInformation));
oParentNode->appendChild(oElementNode);
}
else
{
return(E_FAIL);
}
return(S_OK);
}
/*
HRESULT CXMLEngine::SetAttribute(IXMLDOMElement *oNode,char *sAttributeName, char *sAttributeValue)
{
HRESULT hr;
IXMLDOMAttribute *oAttribute;
IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;
oAttribute=objDOMDoc->createAttribute(_bstr_t(sAttributeName)); if (!oAttribute)
{
AfxMessageBox("Unable to create attribute");
return(E_FAIL);
}
oAttribute->put_value(_variant_t(sAttributeValue)); DOMNamedNodeMapPtr = oNode->attributes; hr=DOMNamedNodeMapPtr->setNamedItem(oAttribute); if(SUCCEEDED(hr) && oAttribute)
{ } return(S_OK);
}
*/
void CXMLEngine::Refresh()
{
mXML=objDOMDoc->xml;
}
link 里面添加:msxml2.lib#include "msxml2.h"try
{
HRESULT hr;
IXMLDOMDocument* pXMLDoc;
IXMLDOMNode* pXDN;
//COM的初始化
hr=CoInitialize(NULL);
//得到关于IXMLDOMDocument接口的指针pXMLDOC
hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument,(void**) &pXMLDoc);
//将XML字符串转换成UNICODE,然后加载
VARIANT_BOOL bSuccess = false;
pXMLDoc->loadXML(L"<?xml version=\"1.0\" encoding=\"GB2312\"?><root><file><time>2003-10-13</time><content>内容</content><title>标题</title></file></root>",&bSuccess);
//得到已加载的XML字符串,并显示
LPWCH tempxml;
//因为此处是输出参数[out][retval],所以不用new一段空间
pXMLDoc->get_xml(&tempxml);
MessageBoxW(NULL,tempxml,L"XML正文",MB_OK);
//取到<time>,<title>以及<content>节点,并显示结点内容
pXMLDoc->selectSingleNode(L"//time",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"time值",MB_OK);
pXMLDoc->selectSingleNode(L"//title",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"title值",MB_OK);
pXMLDoc->selectSingleNode(L"//content",(IXMLDOMNode **)&pXDN);
pXDN->get_text(&tempxml);
MessageBoxW(NULL,tempxml,L"content值",MB_OK); //释放分配的资源
CoUninitialize();
}
catch(...)
{
AfxMessageBox("错误!");
}