我装的是msxml4,vc6.0
编译没有错误
当我执行一下代码时,老是装载不上XML文档// 错误处 hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);// xmllearn.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <atlbase.h>
//下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
#include "C:\Program Files\MSXML 4.0\inc\msxml2.h"
#include <iostream>int main(int argc, char* argv[])
{
// 初始化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(); return 0;
}
/*---------------------------------------------
// 其中 XML 文档为// 名称 xmldata.xml
// 路径 同可执行程序// 内容:
<?xml version="1.0"?>
<xmldata>
<xmlnode />
<xmltext>Hello, World!</ xmltext>
</xmldata>*///--------------------------------------------
编译没有错误
当我执行一下代码时,老是装载不上XML文档// 错误处 hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);// xmllearn.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <atlbase.h>
//下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
#include "C:\Program Files\MSXML 4.0\inc\msxml2.h"
#include <iostream>int main(int argc, char* argv[])
{
// 初始化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(); return 0;
}
/*---------------------------------------------
// 其中 XML 文档为// 名称 xmldata.xml
// 路径 同可执行程序// 内容:
<?xml version="1.0"?>
<xmldata>
<xmlnode />
<xmltext>Hello, World!</ xmltext>
</xmldata>*///--------------------------------------------
解决方案 »
- 用EVC或VC编一个 想IP设置的对话框??
- 遍历目录下的文件,检测是否为目录,有的子目录是一点或两点“.”这个是什么?
- 关于共享MFC动态链接库,PreTranslateMessage问题
- 怎么获取本地 图片的 创建时间,修改日期等信息
- 如何check 当前 windows用户名
- 代理服务器域
- [求助]如何在一个对话框打开时设置焦点?
- 实时控制软件的一个周期性大循环怎么实现比较好?
- 35分请解:我如何在每个PropertySheet页面中重载“上一步”“下一步”的按扭事件??
- 窗口 重绘
- CDateTimeCtrl控件怎么知道当前光标(即当前高亮选择)是年月日小时分钟的哪项?
- 我是新手,希望大家能帮忙!!
HRCALL(pXMLDom->load(var, &status), "");装载不上xml文档//-----------------------------------------------------
#include <stdio.h>
#include <windows.h>
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;// Macro that calls a COM method returning HRESULT value:
#define HRCALL(a, errmsg) do { hr = (a); if (FAILED(hr)) { dprintf( "%s:%d HRCALL Failed: %s\n 0x%.8x = %s\n", __FILE__, __LINE__, errmsg, hr, #a ); goto clean; } } while (0)// Helper function that put output in stdout and debug window
// in Visual Studio:
void dprintf( char * format, ...)
{
static char buf[1024];
va_list args;
va_start( args, format );
vsprintf( buf, format, args );
va_end( args);
OutputDebugStringA( buf);
printf("%s", buf);
}// Helper function to create a DOM instance:
IXMLDOMDocument * DomFromCOM()
{
HRESULT hr;
IXMLDOMDocument *pxmldoc = NULL; HRCALL( CoCreateInstance(__uuidof(DOMDocument40),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IXMLDOMDocument),
(void**)&pxmldoc),
"Create a new DOMDocument"); HRCALL( pxmldoc->put_async(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE),
"should never fail"); return pxmldoc;
clean:
if (pxmldoc)
{
pxmldoc->Release();
}
return NULL;
}
int main(int argc, char* argv[])
{
IXMLDOMDocument *pXMLDom=NULL;
IXMLDOMParseError *pXMLErr=NULL;
BSTR bstr = NULL;
VARIANT_BOOL status;
VARIANT var;
HRESULT hr; CoInitialize(NULL); pXMLDom = DomFromCOM();
if (!pXMLDom) goto clean; VariantInit(&var);
V_BSTR(&var) = SysAllocString(L"stocks.xml");
V_VT(&var) = VT_BSTR;
HRCALL(pXMLDom->load(var, &status), ""); if (status!=VARIANT_TRUE) {
HRCALL(pXMLDom->get_parseError(&pXMLErr),"");
HRCALL(pXMLErr->get_reason(&bstr),"");
dprintf("Failed to load DOM from stocks.xml. %S\n",
bstr);
goto clean;
}
HRCALL(pXMLDom->get_xml(&bstr), "");
dprintf("XML DOM loaded from stocks.xml:\n%S\n",bstr);clean:
if (bstr) SysFreeString(bstr);
if (&var) VariantClear(&var);
if (pXMLErr) pXMLErr->Release();
if (pXMLDom) pXMLDom->Release(); CoUninitialize();
return 0;
}
{
MSXML2::IXMLDOMDocumentPtr pXmldoc = NULL ;
HRESULT _hr = pXmldoc.CreateInstance("Msxml2.DOMDocument.4.0");
if(FAILED(_hr))
{
throw(_hr);
} //加载XML文件
_variant_t varXml(strFileName);
_variant_t varOut((bool)TRUE);
pXmldoc->preserveWhiteSpace = true ;
varOut = pXmldoc->load(varXml);
if ((bool)varOut == FALSE)
{
//错误处理
MSXML2::IXMLDOMParseErrorPtr errPtr = pXmldoc->GetparseError();
_bstr_t bstrErr(errPtr->reason);
m_Log.StatusOut(_T("载入 %s 出错!\n"), strFileName);
CString strTemp;
strTemp.Format(IDS_DTXMLDOMERROR, errPtr->errorCode,errPtr->line,errPtr->linepos,(LPTSTR)bstrErr);
m_Log.StatusOut(_T("%s"), strTemp);
return FALSE;
}
else
{
//解析代码省略。
return TRUE;
}
}
catch (_com_error &e)
{
CString strTemp;
strTemp.Format(IDS_DTCOMERROR, e.Error(),(LPTSTR)e.ErrorMessage(),(LPTSTR)e.Source(),(LPTSTR)e.Description());
m_Log.StatusOut(_T("%s"), strTemp);
return FALSE;
}
catch(...)
{
//捕获未知错误
m_Log.StatusOut(_T("未知错误"));
return FALSE;
}
4、卸载com
CoUninitialize();
//创建COM对象实例
hrErr = CoCreateInstance(CLSID_DOMDocument40,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument2,
(void**)&pXMLDOMDoc);
if (hrErr == S_OK)
//如果COM对象实例创建成功
{
}然后使用下面的方法调用打开文件:
strSourceFile指向文件名
VARIANT_BOOL bLoadSuccess;
BSTR bstr = NULL;
bstr = strSourceFile.AllocSysString();
//读取源文件
//如果有DTD则也进行有效性检查,否则不进行有效性检查
hrErr = pXMLDOMDoc->load (_variant_t(bstr),&bLoadSuccess);
SysFreeString(bstr); if (hrErr == S_OK)
//如果XML文件读取正确
{
}
<?xml version="1.0"?>
修改为:
<?xml version="1.0" encoding="gb2312"?>
http://community.csdn.net/Expert/topic/3110/3110507.xml?temp=.7014734