热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VC对xml文件的读写

一、用微软的DOM,MSXML4引入msxml4.dll#importC:WINNT.0system32msxml4.dll

一、

用微软的   DOM,  
  MSXML4  
  //引入msxml4.dll  
  #import   "C:/WINNT.0/system32/msxml4.dll"  
   
  //创建XMLDOMDocument指针  
  MSXML2::IXMLDOMDocumentPtr       pXMLDoc;  
   
  //   初始化COM接口  
  ::CoInitialize(NULL);  
  //   通过智能指针创建一个解析器的实例  
  HRESULT   hr;  
  hr   =pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));  
  //加载文件  
  pXMLDoc->load("f://he.xml");  
  //在树中查找名为City的节点,"//"表示在任意一层查找  
  MSXML2::IXMLDOMElementPtr     childNode   ;  
  childNode   =   (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//AUTHOR"));  
  //得到节点类型  
  MSXML2::DOMNodeType   nodeType;  
  childNode->get_nodeType(&nodeType);  
  //节点名称  
  BSTR   var;  
  CString   name;  
  childNode->get_nodeName(&var);  
  name   =   (char*)(_bstr_t)var;  
  //节点值  
  VARIANT   varVal;  
  childNode->get_nodeTypedValue(&varVal);  
  CString   strValue   =   (char*)(_bstr_t)varVal;  
  读属性:  
  //节点属性,放在链表中  
  MSXML2::IXMLDOMNamedNodeMapPtr   pAttrs   =   NULL;    
  MSXML2::IXMLDOMNodePtr   pAttrItem;  
  childNode   =   (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//NUM"));  
   
  childNode->get_attributes(&pAttrs);  
  long   nCount   ;  
  pAttrs->get_length(&nCount);  
  for(int   i   =   0   ;   i   <   nCount   ;   i++)  
  {                                    
  pAttrs->get_item(i,&pAttrItem);  
  //我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值  
  //也可以直接得到  
  CString   strAttrName       =   (char*)(_bstr_t)pAttrItem->nodeName;  
  CString   strAttrValue     =   (char*)(_bstr_t)pAttrItem->nodeTypedValue;  
  }


另外
可以用MSXML   DOM    
   
  创建一个文档对象的过程。    
  HRESULT   hr;    
  IXMLDomDocument*   pXMLDoc;    
  IXMLDOMNode*   pXDN;    
  Hr=CoInitialize(NULL);   //COM的初始化    
   
  hr=CoCreateInstance(CLSID_DOM   Document,NULL,CLSCTX_INPPROC_SERVER,    
  IID_IXMLDOMDocument,(void**)   &pXMLDoc);    
  hr=pXMLDoc->QueryInterface   (IID_IXMLDOMNode,(void**)&pXDN);    
  使用文档中的createElement方法来创建一个节点装载和保存XML文件。通过load或者是loadXML方法可以从一个指定的URL来装载一个XML文档Save方法是用来把文档保存到一个指定的位置,用getElementsByTagName获得制定节点数据

 

 

二、

// 创建对象
CoInitialize(NULL); // 初始化COM
// 创建解析器实例
CComPtr spXMLDOM;   
BSTR bstrItemText;
//    long value;
CString strbuf;
HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
spXMLDOM->put_async(VARIANT_FALSE);
spXMLDOM->put_validateOnParse(VARIANT_FALSE);
spXMLDOM->put_resolveExternals(VARIANT_FALSE);
spXMLDOM->put_preserveWhiteSpace(VARIANT_TRUE);

_bstr_t path = _bstr_t(xmlPath);
// 装载XML文档。
hr=spXMLDOM->load(path);

// 1、读取里面全部文本
spXMLDOM->get_text(&bstrItemText); // new
strbuf = bstrItemText;             // new
// 2、读取一个节点
_bstr_t bstrSS("paragraph");
CComPtr spParagraphs;

spParagraphs=spXMLDOM->getElementsByTagName(bstrSS); //搜索"Paragrah"
//是否正确的得到了指向IDOMNodeList的指针。
hr = spParagraphs->get_length(&value); //得到所包含的NODE节点的个数
if(SUCCEEDED(hr))
...{
    spParagraphs->reset();
    for(int ii=0; ii    ...{
        CComPtr spParagraph;
        //得到具体的一个NODE节点
        //    hr = spParagraphs->get_item(ii,&spParagraph);
       
        spParagraph = spParagraphs->nextNode();
        if(SUCCEEDED(hr))
        ...{
            spParagraph->get_text(&bstrItemText); //得到该节点相关的文本信息
            strbuf += bstrItemText;
            strbuf += " ";
        }
    }      
}

 

 

VC读取XML简单例子

XML最近被吹的神乎其神,很多数据的交换,包括很多中间件系统,WebService,软件的配置文件,都是在用XML这个技术,的确是个好东西,我手痒,写了个读取XML的代码片段,用的是MSXML的一些接口。

我读的是BT软件的配置文件,XML内容如下:

          

                      E:/电子书

                      8497

                      3072

                      13104

                      16547

                      303008

                      1180107

                      1132203124

          

代码如下:

#include "stdafx.h"

#include

using namespace std;

#include

#include

#import "msxml.dll" raw_interfaces_only

int _tmain(int argc, _TCHAR* argv[])

{

     ::CoInitialize(NULL);

     CComPtr spDoc;

     HRESULT hr = spDoc.CoCreateInstance(__uuidof(MSXML::DOMDocument));   //创建文档对象

     VARIANT_BOOL bFlag;

     hr = spDoc->load(CComVariant(L"BitComet.xml"), &bFlag);                //load xml文件

     CComPtr spElement;

     hr = spDoc->get_documentElement(&spElement);  //获取根结点

     CComBSTR strTagName;

     hr = spElement->get_tagName(&strTagName);

     cout <<"------TagName------" <

     cout <

     CComPtr spNodeList;

     hr = spElement->get_childNodes(&spNodeList);  //获取子结点列表

     long lCount;                                           

     hr = spNodeList->get_length(&lCount);

     for (long i=0; i

     {

          CComVariant varNodeValue;

          CComPtr spNode;

          MSXML::DOMNodeType NodeType;

          CComPtr spChildNodeList;

          hr = spNodeList->get_item(i, &spNode);        //获取结点

          hr = spNode->get_nodeType(&NodeType);         //获取结点信息的类型

          if (NODE_ELEMENT == NodeType)

          {

               hr = spNode->get_childNodes(&spChildNodeList);

               long childLen;

               hr = spChildNodeList->get_length(&childLen);

               cout <<"------NodeList------" <

               for (int j=0; j

               {

                    CComPtr spChildNode;

                    CComBSTR value;

                    hr = spChildNodeList->get_item(j, &spChildNode);

                    hr = spChildNode->get_nodeName(&value);            //获取结点名字

                    cout <

                    hr = spChildNode->get_text(&value);                //获取结点的值

                    cout <

                    spChildNode.Release();

               }

          }

          spNode.Release();

          spChildNodeList.Release();

     }

     spNodeList.Release();

     spElement.Release();

     spDoc.Release();

     ::CoUninitialize();

     return 0;

}

输出结果如下:

------TagName------

BitComet

------NodeList------

LastSaveLocation

E:/电子书

ListenPort

8497

GlobalMaxUploadRate

3072

LastAdCacheClearDate

13104

LastTrackerKey

16547

TotalUpload

303008

TotalDownload

1180107

LastExitTime

1132203124

这是一个最简单的demo,下次软件的配置信息,可以考虑用XML


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 视图分区_组复制常规操作网络分区amp;混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication...
    网络分区对于常规事务而言,每当组内有事务数据需要被复制时,组内的成员需要达成共识(要么都提交,要么都回滚)。对于组成员资格的变更也和保持组 ... [详细]
  • KVM配置调整
    一内存CPU调整1.1增大虚拟机内存[root@k8s-01~]#virshshutdownvm01-centos7域vm01-centos7被关闭[root@k8s-01~]#v ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 1.dd命令dd命令的全称为diskdump,对系统所有用户开放。该命令用于复制磁盘的数据块,且可在复制文件的同时指定转换的文件格式。命令选项参数说明ifFILE:输入文件名称,默 ... [详细]
  • 明明上一篇还说着打包好了,这一个又出现了问题,真是让人揪心呀!错误如下:Traceback(mostrecentcalllast):Filemacc.py,line7,in& ... [详细]
  • linux分区文件信息,Linux中国 文件分区
    在这篇文章中,我们来了解一些用来检查你的系统分区的一些命令,这些命令将检查每个磁盘的分区情况和其它细节,例如总空间容量,已用 ... [详细]
author-avatar
平凡小迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有