当前位置:C++技术网 > 资讯 > C++快速实现读取xml文件的节点列表

C++快速实现读取xml文件的节点列表

更新时间:2016-06-06 14:05:35浏览次数:1+次

    假如我们有下面这样的xml文件:
<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++开发的各方面也能够非常的方便。如果你能参与进来,那是最好了。

    如果代码有不理解的地方,欢迎留言。