【C++】XML解析总结

6 篇文章 0 订阅
1 篇文章 0 订阅

XML(Extensible MarkupLanguage)是可扩展标记语言的缩写,它是由万维网协会(WorldWide Web Consortium)工作组定义的一种标记语言。

XML编程接口,目前比较流行的有文档对象模型DOM(Document Object Model)、用于XML的简单API SAX(Simple API forXML)、JDOM和DOM4J。

文档对象模型(DOM)为XML文档的解析定义了一组接口。解析器读入整个文档,然后构建一个驻留内存树结构,然后代码就可以使用DOM接口来操作这个树结构。通过可以遍历树以获取来自不同位置的数据,可以删除、重新排列树和新的分支,还可以根据不同类型的数据源来创建XML文档。

XML DOM包括4个主要对象:XMLDOMDocument、XMLDOMNode、XMLDOMNodeList和XMLDOMNamedNodeMap。同时,每个XML DOM对象有其自己的特性和方法。

为了进一步了解如何解析XML文档,因而,使用MFC设计模拟用户登录,通过读取XML文档中用户名与密码来实现用户登录验证。

VC主要通过MSXML技术来解析XML文档,以下代码是读取user.xml文档中的username和password来实现用户验证:

#include <MsXml.h>      //包括msxml头文件

#import "msxml.dll"          //引入msxml动态链接库

MSXML::IXMLDOMDocumentPtr pDoc = NULL;    //定义XML Dom模型文档指针

         MSXML::IXMLDOMNodeListPtr   pNodeList= NULL; //定义XML Dom模型节点列表指针

         MSXML::IXMLDOMElementPtr    pElement= NULL; //定义XML Dom模型元素指针

         longcount;

         HRESULThr; //定义函数返回值,相关返回值与说明可查看HRESULT返回值说明

         BSTRbstrItemText;

         BSTRstrTageName;

        

         BOOL flag = TRUE;

         BOOL IsUser = TRUE;

 

         hr= CoInitialize(NULL); //初始化COM库,调用前必须初始化

         hr= pDoc.CreateInstance(__uuidof(MSXML::DOMDocument)); //创建并实例化DOMDocumnet

         if(FAILED(hr))

         {

                   //无法创建DOMDocument对象,可能未安装msxml parset库

                   MessageBox("登录验证失败!请联系管理员!");

                   returnFALSE;

         }

         pDoc->load(".\\user.xml");//连接xml文档

         pElement= pDoc->GetdocumentElement();  //获取xml文档树的根

         strTageName= pElement->GettagName();   //

         pNodeList= pElement->GetchildNodes();    //获取xml节点列表

        

         pNodeList->get_length(&count);   //获取节点个数,即user个数

                   pNodeList->reset();

//以下是遍历整个xml文档,读取相关数据,实现用户登录验证

                   for(inti = 0; i < count  && flag;i++)

                   {

                            _variant_tvarNodeValue;

                            MSXML::IXMLDOMNodePtrpNode = NULL; //定义xml节点指针

                            MSXML::DOMNodeTypeNodeType; //定义xml节点类型

                            MSXML::IXMLDOMNodeListPtrpChildNodeList = NULL; //定义xml节点列表指针

                            pNodeList->get_item(i,&pNode);//获取第i个user节点

                            pNode->get_nodeType(&NodeType);

                            if(NODE_ELEMENT== NodeType)

                            {

                                     pChildNodeList= pNode->GetchildNodes(); //获取第i个节点下的子节点列表

                                     longchildLen;

                                     pChildNodeList->get_length(&childLen);

                                     IsUser= TRUE;

                                     for(intj = 0; j < childLen && IsUser ;j++)

                                     {

                                               MSXML::IXMLDOMNodePtrpChildNode;

                                               BSTRstrName;

                                               BSTRstrValue;

                                               pChildNodeList->get_item(j,&pChildNode);//获取第i个节点下第j个节点

                                               pChildNode->get_nodeName(&strName);

                                               pChildNode->get_text(&strValue);//获取第i个节点下第j个节点的值

                                               CStringstrKey(strName);

                                               CStringstrKeyValue(strValue);

                                               pChildNode= NULL;

                                               if(strKey== "userid")

                                               {

                                                        if(strKeyValue!= username)

                                                        {

                                                                 IsUser= FALSE;

                                                                 break;

                                                        }

                                               }

                                               if(strKey== "username")

                                               {

                                                        m_UserName= strKeyValue;

                                               }

                                               if(strKey== "password")

                                               {

                                                        if(strKeyValue!= password)

                                                        {

                                                                 IsUser= FALSE;

                                                                 break;

                                                        }

                                               }

                                     if(IsUser)

                                               flag= FALSE;

                                     }

                            }

 

                            pNode= NULL;

                            pChildNodeList= NULL;

                   }

                   pNodeList= NULL;

                   pElement= NULL;

                   pDoc= NULL;

                   CoUninitialize();

个人小结:由于XML文档是一种通用的数据存储文件,所以对解析XML的技术也相当成熟,我仅是通过MFC简单的模拟XML的读取,以便进一步加强对XML文档的了解。从上述的读取过程中可以看出XML文档的存储是树型结构,因此在遍历过程中,我采取了FOR循环嵌套的方式来读取数据。当然,在这当中最主要是使用了MSXML解析技术,MSXML是微软为解析XML文档封装的API。

附user.xml文档测试数据:

<?xml version="1.0"encoding="GBK" ?>

<users>

  <user>

         <userid>001</userid>

         <username>001</username>

         <password>001</password>

  </user>

  <user>

         <userid>002</userid>

         <username>002</username>

         <password>002</password>

  </user>

  <user>

         <userid>003</userid>

         <username>003</username>

         <password>003</password>

  </user>

  <user>

         <userid>004</userid>

         <username>004</username>

         <password>004</password>

  </user>

</users>

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值