我是靠谱客的博主 柔弱导师,最近开发中收集的这篇文章主要介绍VC对xml文件的读写,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、

用微软的   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<IXMLDOMDocument> 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<IXMLDOMNodeList> spParagraphs;

spParagraphs=spXMLDOM->getElementsByTagName(bstrSS); //搜索"Paragrah"
//是否正确的得到了指向IDOMNodeList的指针。
hr = spParagraphs->get_length(&value); //得到所包含的NODE节点的个数
if(SUCCEEDED(hr))
...{
    spParagraphs->reset();
    for(int ii=0; ii<value; ii++)
    ...{
        CComPtr<IXMLDOMNode> 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内容如下:

<?xml version="1.0"?>

<BitComet Author="RnySmile" Version="0.1">

           <Settings>

                      <LastSaveLocation>E:/电子书</LastSaveLocation>

                      <ListenPort>8497</ListenPort>

                      <GlobalMaxUploadRate>3072</GlobalMaxUploadRate>

                      <LastAdCacheClearDate>13104</LastAdCacheClearDate>

                      <LastTrackerKey>16547</LastTrackerKey>

                      <TotalUpload>303008</TotalUpload>

                      <TotalDownload>1180107</TotalDownload>

                      <LastExitTime>1132203124</LastExitTime>

           </Settings>

</BitComet>

代码如下:

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <msxml.h>

#include <atlstr.h>

#import "msxml.dll" raw_interfaces_only

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

{

     ::CoInitialize(NULL);

     CComPtr<MSXML::IXMLDOMDocument> spDoc;

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

     VARIANT_BOOL bFlag;

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

     CComPtr<MSXML::IXMLDOMElement> spElement;

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

     CComBSTR strTagName;

     hr = spElement->get_tagName(&strTagName);

     cout << "------TagName------" << endl;

     cout << CString(strTagName) << endl;

     CComPtr<MSXML::IXMLDOMNodeList> spNodeList;

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

     long lCount;                                           

     hr = spNodeList->get_length(&lCount);

     for (long i=0; i<lCount; ++i)

     {

          CComVariant varNodeValue;

          CComPtr<MSXML::IXMLDOMNode> spNode;

          MSXML::DOMNodeType NodeType;

          CComPtr<MSXML::IXMLDOMNodeList> 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------" << endl;

               for (int j=0; j<childLen; ++j)

               {

                    CComPtr<MSXML::IXMLDOMNode> spChildNode;

                    CComBSTR value;

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

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

                    cout << CString(value) << endl;

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

                    cout << CString(value) << endl << endl;

                    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

最后

以上就是柔弱导师为你收集整理的VC对xml文件的读写的全部内容,希望文章能够帮你解决VC对xml文件的读写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部