我装的是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> *///-------------------------------------------- |
| 一下代码出现同样的问题 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; } |
| 没有人啊,自己给自己分行吗 |
| try { 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文件读取正确 { } |
2 2 | too long |
| 以上那些,我一已经解决了,可是当值是汉字的时候,怎么老出错呢,有人知道吗,多谢,分另算 |
| 汉字问题,你的xml文件第一行 <?xml version="1.0"?> 修改为: <?xml version="1.0" encoding="gb2312"?> |
| 不是你说的这个意思,我想知道怎样达到这样的结果,就是用DOM写入XML,使XML文档里有<?xml version="1.0" encoding="gb2312"?>,然后我在读出,可是现在写都写不进去 |
更多勋章 | Create andappend processinstruction element |
| 我调用createProcessingInstruction方法,能够写入,读的时候,只要碰到汉字,就跳到错误处理行,能解释一下吗,期待中 |
| 请到这里来,我又开了一帖 http://community.csdn.net/Expert/topic/3110/3110507.xml?temp=.7014734 |
联系客服