VC 6.0中读取XML文件

来源:互联网 发布:延时摄影后期软件 编辑:程序博客网 时间:2024/04/30 01:09

搞了一天 总算在VC 6.0中可以读取XML文件, 哎呀就是麻烦啊  我的天   搞了一整天头都大了

在百度上参考了 许多VC代码 但是不管我怎么调试都没成功 比如哦 http://hi.baidu.com/walfer/blog/item/0a548a44a113e24c500ffe37.html    就是编译不过去(自己做了修改,因为自己机子上没有atlstr.h头文件,而且也不想在此控制台程序中使用MFC) 提示什么7788的错误(fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
但百度再找一番此错误   说VC 6.0编译器的BUG, 不管了   后面又在百度上找其他的例子 http://blog.csdn.net/liuxiaoyi666/archive/2007/04/02/1549720.aspx   这回这个例子改改总算可以写XML文件了  但是读取呢? 哦,参考现在这个csdn上可行代码, 改改最先的那个baidu上的代码:

 

  1. //readxml.cpp
  2. #include <windows.h>
  3. #include <msxml.h>
  4. #include <iostream>
  5. #import "msxml.dll" rename_namespace("xml")
  6. using namespace std ;
  7. int main()  
  8. {  
  9.     CoInitialize(NULL) ;  
  10.     xml::IXMLDOMDocumentPtr pDoc ;
  11.     xml::IXMLDOMElementPtr  pElem ;
  12.     xml::IXMLDOMNodePtr     pNode ;
  13.     xml::IXMLDOMNodeListPtr pNodeList ;
  14.     HRESULT hr = pDoc.CreateInstance(__uuidof(xml::DOMDocument)) ; //创建文档对象
  15.     if(!SUCCEEDED(hr))
  16.     {
  17.         cout<<"无法创建DM对象!"<<endl ;
  18.         return 0 ;
  19.     }
  20.     VARIANT_BOOL bFlag;
  21.     bFlag = pDoc->load(L"BitComet.xml") ; //load xml文件
  22.     if(bFlag == S_FALSE)
  23.     {
  24.         cout<<"打开BitComet.xml出错!"<<endl ;
  25.         return 0 ;
  26.     }
  27.     hr = pDoc->get_documentElement(&pElem) ; //获取根结点
  28.     if(pElem == NULL)
  29.     {
  30.         cout<<"获取根结点失败!"<<endl ;
  31.         return 0 ;
  32.     }
  33.     BSTR strTagName = NULL;
  34.     hr = pElem->get_tagName(&strTagName) ;
  35.     cout<<"------TagName------"<<endl ;
  36.     wcout <<strTagName<<endl ;
  37.     SysFreeString(strTagName) ;
  38.     hr = pElem->get_childNodes(&pNodeList) ; //获取子结点列表
  39.     long lCount;
  40.     hr = pNodeList->get_length(&lCount) ;  
  41.     for(long i=0; i<lCount; ++i)  
  42.     {  
  43.         xml::DOMNodeType NodeType ;
  44.         xml::IXMLDOMNodeListPtr pChildNodeList ;
  45.         hr = pNodeList->get_item(i, &pNode) ; //获取结点
  46.         hr = pNode->get_nodeType(&NodeType) ; //获取结点信息的类型      
  47.         if(xml::NODE_ELEMENT == NodeType)  
  48.         {
  49.             hr = pNode->get_childNodes(&pChildNodeList) ;
  50.             long childLen ;
  51.             pChildNodeList->get_length(&childLen) ;
  52.             //设置宽字符区域(类似于国域)chs代表简体中文..可以在msdn上查询
  53.             wcout.imbue(locale("chs")) ; 
  54.             cout << "------NodeList------" << endl ;
  55.             for (int j=0; j<childLen; ++j)
  56.             {
  57.                 xml::IXMLDOMNodePtr pChildNode ;
  58.                 BSTR strValue ;
  59.                 hr = pChildNodeList->get_item(j, &pChildNode) ;
  60.                 hr = pChildNode->get_nodeName(&strValue) ; //获取结点名字
  61.                 wcout<<strValue<<endl ;
  62.                 SysFreeString(strValue) ;
  63.                 hr = pChildNode->get_text(&strValue) ; //获取结点的值
  64.                 wcout <<strValue<<endl<<endl ;
  65.                 SysFreeString(strValue) ;
  66.                 pChildNode.Release() ;
  67.             }
  68.         }
  69.         pNode.Release() ;
  70.         pChildNodeList.Release() ;  
  71.     }
  72.     pNodeList.Release() ;
  73.     pElem.Release() ;
  74.     pDoc.Release() ; 
  75.     CoUninitialize() ;
  76.     return 0 ;
  77. }

if(pElem == NULL)
{
    cout<<"获取根结点失败!"<<endl ;
    return 0 ;
}

刚开始没加上这个if语句的时候 老出错 以为是pElem->get_tagName(&strTagName) ;   参数strTagName

因为刚开始不知道 存储空间由系统分配 以为对strTagName写操作导致崩溃   后面又到MSDN查了查 不是这个问题

然后就加上了这个if语句。    运行程序 提示:获取根结点失败! 为什么会失败?怪事?XML文档的问题?

再看了看那个http://hi.baidu.com/walfer/blog/item/0a548a44a113e24c500ffe37.html提供的XML文档   发现“序元码”<?xml version="1.0"?> 的问题   改成<?xml version="1.0" encoding="GB2312" ?>  获取根节点成功了

但是输出又出问题了(在没加wcout.imbue(locale("chs")) ; 之前)  怎么会输出不完全?输出“E:/” 就结束了 “电子书”死活显示不出来   看来用wcout汉字不能显示 又到百度找了找 加上了wcout.imbue(locale("chs")) ;   这回总算能完整的显示了:

 

------TagName------
BitComet
------NodeList------
LastSaveLocation
E:/电子书

ListenPort
8497

GlobalMaxUploadRate
3072

LastAdCacheClearDate
13104

LastTrackerKey
16547

TotalUpload
303008

TotalDownload
1180107

LastExitTime
1132203124

原创粉丝点击