####### 第一次用VC写XML但不知道如何用引用msxml啊######## 在VC中如何像VB那样引用msxml.dll 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.swm.com.cn/rj/2001-1/26.htm 和普通的com组件没有差别。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(); } 多谢各位,但我的意思是说如何MFC中向添加控件一样添加msxml.dll C为什么会比matlab执行更快呢? MFC对话框中如何显示图片 const char*类型的变量,如何转换为LPCWSTR? 怎么创建像属性表单一样的视图 请教组件注册问题!~~~~~~~~~~~ 问几个编辑框小问题 用::SendMessage(phWnd,WM_SETFOCUS,0,0)给EDIT控件设置焦点后,为什么控件不能接受输入了 串口通讯问题。 BCGControlbar的问题。 一个关于窗体句柄的问题 文档究竟应该怎么写? ####### 第一次用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();
}