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>