<data>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
<student><name>张三</name><age>18</age></student>
</data>
文件中记录了所有学生的信息,每一个学生的信息包含在节点student中,信息有名字name和年龄age。我们现在需要做的是,加载这个xml文件,然后将所有学生信息加载到内存使用。至于要如何显示,那就看你怎么用了。我们建立一个结构体类型,存储学生的信息,结构体定义如下:typedef struct
{
string name;
int age;
}STUDENT;
定义结构体可以方便存储一个人的信息,然后所有人的信息就存入一个结构体数组就可以了。这是很普遍的做法,千万不要想着用二维数组哦,不然太麻烦了。我们这里用结构体抵消了一维,简化了数据的使用。在《C++快速实现xml文件的xml节点读写》中,我已经提供了快速读写xml单个节点值的方法的代码。那么这里我们将读取xml列表数据。创建xml文件,请阅读《C++中使用XML文件:生成XML文件》。
我们的思路是,按照名称读取节点,相同名称的节点就形成一个节点列表,然后我们得到节点列表的长度,然后循环遍历节点。在节点下分别有几个子节点,我们读取出来这些子节点的数据,然后存入结构体变量中,然后再将结构体变量存入数组中。如果不确定数据的大小,可以使用STL的vector容器,当然我们也推荐使用vector,使用起来非常简单,和数组一样,但是却是动态增长的。
下面是封装成独立函数的C++读取Xml节点列表的完整代码:
bool GetValueList(vector<STUDENT>& list,string strName,string strPath)
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr XMLDOC;// - XML文档对象
HRESULT HR = XMLDOC.CreateInstance(__uuidof(MSXML2::DOMDocument30));// - 创建XML文档实例
XMLDOC->load(strPath.c_str());// - 加载xml文件
strName = "//"+strName;
//选择记录节点,得到记录列表
MSXML2::IXMLDOMNodeListPtr pNodeList=XMLDOC->selectNodes(strName.c_str());
//遍历记录列表,获取每一条记录的所有信息
int len = pNodeList->length;
MSXML2::IXMLDOMNodePtr pNode,pElement;
list.clear();
STUDENT student;
_variant_t value;
//遍历节点列表
for (int i=0;i<len;i++)
{
//获取节点列表的节点
pNode = pNodeList->item[i];
//获取节点下的子节点age
pElement = pNode->selectSingleNode("age");
pElement->get_nodeTypedValue(&value);
student.age=(int)value;
//获取节点下的子节点name
pElement = pNode->selectSingleNode("name");
pElement->get_nodeTypedValue(&value);
std::string strValue = _bstr_t(value);
student.name = strValue.c_str();
//将节点存入vector容器
list.push_back(student);
pNode.Release();
}
XMLDOC.Release(); // - 释放使用的文档对象
::CoUninitialize(); // - 释放COM组件使用环境
return true;
}
此函数独立可用。函数的基本步骤在代码中注释很清楚了。这个函数就可以满足节点列表的读取了。在协作开发的时候,共同数据列表可以以xml形式使用,而不要使用平台相关的特定格式文件。xml在客户端数据以及web开发中,都很常用。我个人也越来越喜欢将xml作为应用程序的配置文件,有了这些基础函数之后,C++使用xml也更加简单了。如果不是专门研究Xml,这系列文章提供的函数足矣搞定日常开发中的Xml文件的使用了。如果还有新需要,我再分享。我的希望是将日常用到的基本技术无私分享出来,让C++开发的各方面也能够非常的方便。如果你能参与进来,那是最好了。
如果代码有不理解的地方,欢迎留言。