在VC中如何像VB那样引用msxml.dll
解决方案 »
- vc datagrid 控件单击事件
- 如何设计一个Windows平台下支持L2TP拨号的VPN客户端?
- 关于Button的一个问题噢! 请各位大侠赐教!
- 困惑我一个多星期的api拦截问题,急需高手指点,提供解决问题思路同样给分,不够再给!!(在线等待)
- 关于升级到vc7.0的操作问题
- GetItem一问
- 小妹求救:不让任务栏显示该怎么办啊?
- 为什么用CSocket接连两次发送大量数据会产生错误,高手指教,一定给分!!!!!!!!!!!!
- 微软的 XmlDocument.save 如何设置引号
- QQ里面的那个头像选择是怎么实现的?
- 文档究竟应该怎么写?
- ####### 第一次用VC写XML但不知道如何用引用msxml啊########
CoCreateInstance...
#include < atlbase.h>
//下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
#include "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"
#include < iostream>
void main()
{
// 初始化COM接口
CoInitialize(NULL);
//在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文
//件在同一个目录中。该文件的内容如下:
// < ?xml version="1.0"?>
// < xmldata>
// < xmlnode />
// < xmltext>Hello, World!< / xmltext>
// < /xmldata>
//程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的
//节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显
//示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。
try {
// 通过智能指针创建一个解析器的实例。
CComPtr< IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) throw "不能创建XML Parser对象";
if ( spXMLDOM.p == NULL ) throw "不能创建XML Parser对象";
// 如果对象创建成功的话,就开始装载XML文档
VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
if ( FAILED(hr) ) throw "不能够在解析器中装载XML文档";
if ( !bSuccess ) throw "不能够在解析器中装载XML文档";
// 检查并搜索"xmldata/xmlnode"
CComBSTR bstrSS(L"xmldata/xmlnode");
CComPtr< IXMLDOMNode> spXMLNode;
//用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) throw "不能在XML节点中定位'xmlnode' ";
if ( spXMLNode.p == NULL ) throw "不能在XML节点中定位'xmlnode' ";
//DOM对象“spXMLNode”现在包含了XML节点< xmlnode>,所以我们可以在
//它下面创建一个子节点并把找到的该节点作为它的父节点。
CComPtr< IXMLDOMNode> spXMLChildNode;
//用接口IXMLDOMDocument的方法createNode方法创建一个新节点。
hr = spXMLDOM->createNode(
CComVariant(NODE_ELEMENT),
CComBSTR("xmlchildnode"),
NULL,&spXMLChildNode);
if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
if ( spXMLChildNode.p == NULL )
throw "不能创建'xmlchildnode' 节点";
//添加新节点到spXMLNode节点下去。
CComPtr< IXMLDOMNode> spInsertedNode;
hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
if ( spInsertedNode.p == NULL ) throw "不能移动'xmlchildnode' 节点";
//对新节点添加属性。
CComQIPtr< IXMLDOMElement> spXMLChildElement;
spXMLChildElement = spInsertedNode;
if ( spXMLChildElement.p == NULL )
throw "不能在XML元素接口中查询到'xmlchildnode' ";
//设置新节点的属性
hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
if ( FAILED(hr) ) throw "不能插入新的属性";
//下面的程序段用来寻找一个节点并显示该节点的相关信息
// 查找"xmldata/xmltext"节点
spXMLNode = NULL; // 释放先前的节点
bstrSS = L"xmldata/xmltext";
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) throw "不能定位'xmltext'节点";
if ( spXMLNode.p == NULL ) throw "不能定位'xmltext'节点";
// 得到该节点包含的文本并显示它
CComVariant varValue(VT_EMPTY);
hr = spXMLNode->get_nodeTypedValue(&varValue);
if ( FAILED(hr) ) throw "不能提取'xmltext'文本";
if ( varValue.vt == VT_BSTR ) {
// 显示结果,注意这里要把字符串从形式BSTR转化为ANSI
USES_CONVERSION;
LPTSTR lpstrMsg = W2T(varValue.bstrVal);
std::cout < < lpstrMsg < < std::endl;
} // if
else {
// 如果出现错误
throw "不能提取'xmltext'文本";
} // else
//保存修改过的XML文档到指定的文档名
hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
if ( FAILED(hr) ) throw "不能保存修改过的XML文档";
std::cout < < "处理完成..." < < std::endl < < std::endl;
} // try
catch(char* lpstrErr) {
// 出现错误
std::cout < < lpstrErr < < std::endl < < std::endl;
} // catch
catch(...) {
// 未知错误
std::cout < < "未知错误..." < < std::endl < < std::endl;
} // catch
// 结束对COM的使用
CoUninitialize();
}