VC使用MSXML解析XML文档

利用VC++与MSXML解析XML文档 一、文档对象模型(DOM)  DOM是Document Object Model(文档对象模型)的简称,是对XML文档进行应用开发、编程的应用程序接口(API)。作为W3C公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。  DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。这种对象模型实现的基本功能包括: 阅读详情
第一部分:DOM解析:


      概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。



    1、如何加载xml文件:

         //创建DOM,加载XML文档
         MSXML::IXMLDOMDocumentPtr pCommandDoc;
         pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
          pCommandDoc->put_async(VARIANT_FALSE);
          pCommandDoc->put_validateOnParse(VARIANT_FALSE);
          pCommandDoc->put_resolveExternals(VARIANT_FALSE);
          pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
          pCommandDoc->load(file.GetBuffer(0));

     2、在XML文档中查找指定的结点:

      //找到
     MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
       if (pRootNode==NULL)
     {
          return ;
      }

    3、得到XML文档中,结点的属性

        CString strTemp;
     MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
     pRootNode->get_attributes(&pAttrs);
     if (pAttrs==NULL)
     {
          return;
     }
     MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
     _bstr_t strRequestType=pRequestTypeAttr->Gettext();
     strTemp=strRequestType.operator char *();

    4、得到结点的内容

    _bstr_t strVisiPort=pNode->Gettext();

    5、设置结点的内容

     HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));


   6、设置一个属性内容
    IXMLDOMAttribute *pa=NULL;
    bstr = SysAllocString(L"属性1");
    pXMLDom->createAttribute(bstr,&pNode);
    var = VariantString(L"strin");
    pa->put_value(var);
    pRoot->setAttributeNode(pa, &pa1);
   

第二部分、如何使用SAX解析

        概述:SAX使用的是加载式的,将会把XML文档分断,加载到内存中。使用事件通知的方式,来表示找到结点。好像没有写文档的能力吧。它的速度要比DOM快不少。

       使用SAX的时候,就需要重载MSXML4.0中的一个接口ISAXContentHandler。

      有几个函数重载了之后,当找到了结点之后,就会回调这一些函数。
  
对于这一种SAX解析的模式有一些不太了解如何应用。只是感觉这种方式可能不太好用于那种
对结构很重要的xml文档的解析 。

vc中操作Xml--使用CMarkup类

DotNet中使用xml相对比较轻松,在vc中操作xml,有些繁琐。最近在网络上得知CMarkup比较好用,于是试了下,还好,就把部分例子写出来。以后有时间的话,再写清楚点
//----------UserInfo.xml--------------
<?xml version="1.0" encoding="UTF-8" ?>
 <UserInfo>
  <UserID>luo</UserID>
  <UserID>lin</UserID>
  </UserInfo>
1。生成UserInfo.xml
CMarkup xml;
xml.SetDoc("<?xml version=/"1.0/" encoding=/"UTF-8/"?>/r/n");
xml.AddElem("UserInfo");
xml.IntoElem();
xml.AddElem("UserID","luo");
xml.AddElem("UserID","lin");
xml.OutOfElem();
xml.Save("UserInfo.xml");
2。浏览特定元素
//----查看所有UserID----
CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();
while (xml.FindChildElem("UserID");)
{
       //此时接点还是父接点
        CString strTagName = _T("");
        CString strData = _T("");
        strTagName = xml.GetChildTagName();
        strData = xml.GetChildData();
        TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
}
       /********************这样也可以******************
       CMarkup xml;
       xml.Load("UserInfo.xml");
       BOOL bFind = true;
       xml.ResetMainPos();
      
       while (xml.FindChildElem("UserID");)
       {
                     xml.IntoElem();
                     CString strTagName = _T("");
                     CString strData = _T("");
                     strTagName = xml.GetTagName();
                     strData = xml.GetData();
                     TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
                     xml.OutOfElem();
       }*/
       /**************这样也可以**********************
       CMarkup xml;
       xml.Load("UserInfo.xml");
       BOOL bFind = true;
       xml.ResetMainPos();
       xml.FindElem(); //UserInfo
       xml.IntoElem();
       while (xml.FindElem("UserID");)
       {
                     CString strTagName = _T("");
                     CString strData = _T("");
                     strTagName = xml.GetTagName();
                     strData = xml.GetData();
                     TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
       }
       */
//-------------结果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—
3。修改
//--------把UserID为”luo”改为”flypigluo”-----------
BOOL bLoadXml = false;
CMarkup xml;
bLoadXml = xml.Load("UserInfo.xml");
       if (bLoadXml)
       {
              CString strUserID = _T("");
              xml.ResetMainPos();
              xml.FindElem();
              xml.IntoElem();
              while (xml.FindElem("UserID"))
              {
                     strUserID = xml.GetData();
                     if (strUserID=="luo")
                     {
                            xml.SetData(CString("flypig")+strUserID);
                            xml.Save("UserInfo.xml");
                            break;
                     }
              }
       }
4。添加
4。1   添在最后面(使用的是AddElem)
//加在最后面
       BOOL bLoadXml = false;
       CMarkup xml;
       bLoadXml = xml.Load("UserInfo.xml");
       if (bLoadXml)
       {
              xml.ResetMainPos();
              xml.FindElem();
              xml.IntoElem();
              xml.AddElem("UserID","luoluo");
              xml.OutOfElem();
              xml.Save("UserInfo.xml");
       }
//--------原来为------
<?xml version="1.0" encoding="UTF-8" ?>
 <UserInfo>
  <UserID>luo</UserID>
  <UserID>lin</UserID>
  </UserInfo>
//---------添加后为-------------
<?xml version="1.0" encoding="UTF-8" ?>
< UserInfo >
  <UserID>luo</UserID>
  <UserID>lin</UserID>
  <UserID>luoluo</UserID>
  </UserInfo>
4。2  加在最前面(使用InsertElem)
BOOL bLoadXml = false;
CMarkup xml;
bLoadXml = xml.Load("UserInfo.xml");
if (bLoadXml)
{
       xml.ResetMainPos();
       xml.FindElem();
       xml.IntoElem();
       xml.InsertElem("UserID","AddUserIDHead");
       xml.OutOfElem();
       xml.Save("UserInfo.xml");
}
//----原来为—
<?xml version="1.0" encoding="UTF-8" ?>
 <UserInfo>
  <UserID>luo</UserID>
  <UserID>lin</UserID>
  </UserInfo>
//------修改后-----
<?xml version="1.0" encoding="UTF-8" ?>
< UserInfo >
  <UserID>AddUserIDHead</UserID>
  <UserID>luo</UserID>
  <UserID>lin</UserID>
  </UserInfo>
5。删除
CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();      
while (bFind)
{
       bFind = xml.FindChildElem("UserID");
       if (bFind)
       {
              //此时接点还是父接点
              CString strData = _T("");
              strData = xml.GetChildData();
              if (strData=="luo")
              {
                     xml.RemoveChildElem();
                     xml.Save("UserInfo.xml");
                     break;
              }
       }
}
6。查找
见第二点浏览。类似
上面的例子里面没有属性这些东西,下面的一个例子是有属性的
//UserInfo1.xml
<?xml version="1.0" encoding="UTF-8" ?>
< UserInfo >
  <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" />
  <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" />
  <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" />
  <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" />
  <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" />
  <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" />
  <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" />
  <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" />
  <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" />
  <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" />
  </UserInfo>
7。产生
CString strID = _T("");
       CString strPwd = _T("");
       CMarkup xml;
       xml.SetDoc("<?xml version=/"1.0/" encoding=/"UTF-8/"?>");
       xml.AddElem("UserInfo");
       xml.IntoElem();
       for (int i=0; i<10; i++)
       {
              //产生一个随机数,作为权限
              srand(UINT(time(NULL)+i));
              int nLevel = rand()%256;
              strID.Format("UserID%02d",i);
              strPwd.Format("UserPwd%02d",i);
              xml.AddElem("User");
              xml.AddAttrib("UserID",strID);
              xml.AddAttrib("UserPwd",strPwd);
              xml.AddAttrib("UserLevel",nLevel);
       }
       xml.OutOfElem();
       xml.Save("UserInfo1.xml");
8。查找
CMarkup xml;
BOOL bLoad = false;
BOOL bFind = false;
bLoad = xml.Load("UserInfo1.xml");
       if (bLoad)
       {
              CString strID;
              CString strPwd;
              xml.ResetMainPos();
              xml.FindElem();    //UserInfo
              while (xml.FindChildElem("User"))
              {
                     strID = xml.GetChildAttrib("UserID");
                     strPwd = xml.GetChildAttrib("UserPwd");
                     TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);
                     if (strID=="UserID00"&&strPwd=="UserPwd00")
                     {
                            bFind = true;
                            break;
                     }
              }
       }
       if (bFind)
       {
              TRACE("/n---- find------/n");
       }
       else
       {
              TRACE("/n----no find------/n");
       }
9。修改
CMarkup xml;
       BOOL bLoad = false;
       BOOL bFind = false;
       bLoad = xml.Load("UserInfo1.xml");
       if (bLoad)
       {
              CString strID;
              CString strPwd;
              xml.ResetMainPos();
              xml.FindElem();    //UserInfo
              while (xml.FindChildElem("User"))
              {
                     strID = xml.GetChildAttrib("UserID");
                     strPwd = xml.GetChildAttrib("UserPwd");
                     TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);
                     if (strID=="UserID00"&&strPwd=="UserPwd00")
                     {
                            bFind = true;
                            xml.SetChildAttrib("UserID",strID+CString("Modify"));
                            xml.Save("UserInfo1.xml");
                            break;
                     }
              }
       }
       if (bFind)
       {
              TRACE("/n---- find------/n");
       }
       else
       {
              TRACE("/n----no find------/n");
       }
 
VC++中使用MSXML组件解析XML文件 本文还有配套的精品资源,点击获取 简介:在VC++开发环境中,使用MSXML组件可以有效地读取和操作XML文件。MSXML组件允许开发者通过COM接口与XML文档交互,支持创建 IXMLDOMDocument 对象来加载和解析XML数据。本文介绍如何通过包含 msxml2.h 头文件,链接 msxml2.lib 或 msxm... 阅读详情

相关推荐

VC++解析XML完整文件,包括创建,读取,添加,删除

本例通过MFC建立对话,一步一步实现了VC++对XML文件的解析,包括XML文件的创建,数据的添加,读取,删除等一系列完整操作,并附注释

VC++中利用MSXML解析XML文档

文章标题:VC++中利用MSXML解析XML文档原 作 者:侯 小 云原 出 处:不详发 布 者:loose_went发布类型:转载发布日期:2004-04-23今日浏览:11总 浏 览:2140  摘 要:XML文档是近年来比较流行的结构化文档形式,其主要用途不只适用于开发网页,而且在其他场合也有很广泛的应用。本文主要介绍用VC++开发应用程序时对XML文档的解析

小坏的专栏 1410

vc++实现读取和解析xml

前段时间,由于工作的需要,利用到了XML,所以对其进行了一些简单的研究。在此愿把一些心得写出来,与各位分享,不对的地方还望多多包涵。

VC使用MSXML解析XML文档,例子代码

现在XML文档应用的方面特别的多.我把以前写过的一个例子帖出来,以备以后使用.第一部分:DOM解析:      概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。    1、如何加载xml文件:         //创建DOM,加载XML文档         MSXML::IXMLDOMDocumentPtr p

阿彪的Blog 3271

VC xml文件解析类

C++编写的xml文件解析的类,能够读取xml文件,解析关键字段

VC读取并解析XML文件.并以树型控件显示其内容.zip

VC读取并解析XML文件.并以树型控件显示其内容.zip

vc使用msxml解析xml文档

vc使用msxml解析xml文档,例子代码 【字体:小 大】 vc使用msxml解析xml文档,例子代码 作者:佚名 文章来源:不详 点击数: 更新时间:2007-7-1 现在XML文档应用的方面特别的多. 我把以前写过的一个例子帖出来,以备以后使用.

johns78的专栏 685

PCB测试点

PCB测试点

qq_31444421的博客 1万+

vc中操作Xml--使用CMarkup类 - VC使用MSXML解析XML文档

VC使用MSXML解析XML文档 第一部分:DOM解析:       概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。     1、如何加载xml文件:          //创建DOM,加载XML文档          MSXML::IXMLDOMDocumentPtr

jasone123的专栏 712

mipi协议中的calibration和scramble模式

在MIPI(Mobile Industry Processor Interface)协议中,calibration(校准)和scramble(加扰)模式是两个重要的特性,它们分别用于优化数据传输的准确性和减少信号干扰。

flomingo1的专栏 2401

XCP_Basic 移植步骤

XCP_Basic 移植步骤

ggzzc的博客 2316

VC++和MSXML解析XML文档

最近研究起了使用VC6.0进行解析XML文档,而对于XML文档的解析目前网上主要使用了两种方法:MSXML和CMarkUp类。而我就先从最基本的DOM研究起了。而对于DOM主要采用微软提供的MSXML库,另外好像还有第三方库TinyXML,咱就不研究了。而对于MSXML的使用,网上别人提供的东西都比较零碎,而且还比较乱,在论坛上问反而被一堆人鄙视,得到的解答少之又少。于是我专门花了一天的时间研究了下,现在小有成果,就感觉整理了一些,以供和我一样初级选手作为入门的资料。当然,在整理过程中还是会出现错误,望大家

韵苑23栋工作室 2965

U8备份提示“远程组件初始化失败”

问题现象: SQL出现问题后重装,U8没有重装,之后直接附加数据库,U8可以正常登陆,但是在备份的时候提示远程组件初始化失败。 问题原因: 因为重装了SQL,没有进行U8数据源初始化,导致Master库中丢失了存储过程储 解决办法:在Master库重建存储过程 USE [master] GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROCEDURE [dbo].[U8FileServerExtendProc] @cmdLi.

SamYux 2473

利用MSXML解析XML文本(五)

最后我们讨论一下如何来创建新的节点,实际上可以通过方法createNode来创建一个新的节点。CreateNode包括四个参数,第一个参数Type表示要创建的节点的类型,第二个参数name表示新节点的nodeName的值,第三个参数namespaceURI表示该节点相关的名字空间,第四个参数node表示新创建的节点。注意可以通过使用已经提供的类型(Type),名称(name)和名字空间(nodeN

fivedoumi的专栏 664

PyCharm 2024最新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

PyCharm 2024新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

Code_流苏:在代码中寻诗意,在实践中觅真知 4万+

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

利用MSXML解析XML文本

利用MSXML解析XML文本(转) XML DOM (文档对象模型)对象提供了一个标准的方法来操作存储在XML文档中的信息,这就是DOM应用编程接口(API)函数。它是应用程序和XML文档之间的桥梁。DOM包含两个关键的抽象概念:一个是树状的层次结构,另一个是用来表示文档内容和结构的节点集合。树状层次包括了所有节点,节点本身

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1746

GEE案例:计算区域生态总体脆弱性分析

计算区域生态总体脆弱性分析需要考虑多个指标和因素。下面是一个基本的方法:选择指标:选择一组能够反映区域生态系统脆弱性的指标。这些指标可以包括生物多样性指数、森林覆盖率、湿地保护率、土地退化程度等。为每个指标分配权重:为了使得各指标在计算中的重要性相对均衡,可以为每个指标分配一个权重。权重可以根据各指标的重要性和可利用的数据进行确定。数据收集和处理:收集每个指标的数据,并对其进行处理,确保数据的准确性和一致性。如果有需要,可以对数据进行归一化处理。计算指标值:根据收集的数据和权重,计算每个指标的值。

此星光明博客 466

利用MSXML解析XML文本(1)

利用MSXML解析XML文本(1)XML DOM (文档对象模型)对象提供了一个标准的方法来操作存储在XML文档中的信息,这就是DOM应用编程接口(API)函数。它是应用程序和XML文档之间的桥梁。DOM包含两个关键的抽象概念:一个是树状的层次结构,另一个是用来表示文档内容和结构的节点集合。树状层次包括了所有节点,节点本身也可以包含其他的节点。这样的好处是可以通过这个层次结构来找到并修改某一特定节...

weixin_34150224的博客 209

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 使用WinInet API 进行异步编程
下一篇: 程序中控件实现随xp风格的改变而改变
c0ffee1982
博客等级 码龄20年 9粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值