XML文件在C++中的使用

   今天做的任务需要我把一种类似树的数据存储起来并读取,最开始想要使用ini文件,但是一方面由于Ini文件主要用来保存配置,用它来存储大量数据感觉不太好。。。而且我要存储的数据结构是多层的多叉树,用ini存储很难定义结构,最后还是决定使用XML。

一、XML文件结构

XML文件的结构性内容,包括节点关系以及属性内容等等。
元素是组成XML的最基本的单位,它由开始标记,属性和结束标记组成。
就是一个元素的例子,每个元素必须有一个元素名,元素可以若干个属性以及属性值。
一个xml文件的例子
  例

〈?xml version="1.0" encoding="gb2312" ?〉
  〈学生资料〉
   〈学生〉
        〈名字〉李四〈/名字〉
        〈身份〉学生〈/身份〉
        〈年龄 虚实岁="实"〉20.00〈/年龄〉
   〈/学生〉
  〈/学生资料〉
  

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。

下一行描述文档的根元素(像在说:“本文档是一个便签”):学生资料

接下来 描述根的 子元素:学生,最后一行定义根元素的结尾;

XML 文档形成一种树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有元素均可拥有子元素:

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

所有元素均可拥有文本内容和属性(类似 HTML 中)。

二、C++读写XML文件(使用tinyxml库)

使用以下代码之前,需要下载TinyXml库,并包含到工程下,只需要包含tinystr.cpp tinystr.h tinyxml.cpp tinyxml.h tinyxmlerror.cpp tinyxmlparser.cpp  就可以了

https://download.csdn.net/download/ll596214569/10782791  这是个tinyXML库,没有积分的就自己去百度网盘找吧。。。)

https://download.csdn.net/download/ll596214569/10782898  这是我学习的时候写的一个练手的小程序,有兴趣的可以看下)

tinyXML的使用也极为简单,其中封装好了大多数相关的操作,只需要看一下源码直接调用就好了,我上传了一个使用的案例,等审核过了我把链接粘过来。

想了想还是贴下代码吧,毕竟下载也是要积分的。。

int CReadXML::writeXmlFile()
{
    TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针  

    int n = 3;  

    TiXmlElement *RootElement = new TiXmlElement("Factor");//根元素  
    RootElement->SetAttribute("num", n); //属性  
    writeDoc->LinkEndChild(RootElement);

    char* str1[20] = {"股票价格","成交额","成交量","股票涨幅","股票相对涨幅","累计换手率",
        "涨跌停标记","股本和市值","资金净流入","融资融券","港资持股","日内行情","15分钟行情","新股指标"};

    char* str2[20] = {"WQ价格类","WQ量价类","WQ二分类","乖离率","波动率","MA",
        "成交量形态","K线形态","EMA","MACD","TRIX","KDJ","RSI","相对波动率"};

    char* str3[20] = {"估值","清偿能力","资本结构","营利能力","资本效率","营运效率",
        "成长能力","研发投入","每股指标","最近一年合计TTM","市值行业中性","业绩评分"};


    for (int i = 0; i<n; i++)//n个父节点  
    {
        TiXmlElement* StuElement = new TiXmlElement("Tree");
        //设置属性  
        if(i%3 == 0)
        {
            StuElement->SetAttribute("class", "行情");
            StuElement->SetAttribute("id", "GPJG");
            RootElement->LinkEndChild(StuElement);
            for(int i = 0;i != 14;++i)
            {
                const char* ch = str1[i];
                TiXmlElement *scoreElement = new TiXmlElement(ch);
                StuElement->LinkEndChild(scoreElement);
            }

        }
        else if (1 == i%3)
        {
            StuElement->SetAttribute("class", "技术指标");
            StuElement->SetAttribute("id", "WQJGL");
            RootElement->LinkEndChild(StuElement);
            for(int i = 0;i != 14;++i)
            {
                const char* ch = str2[i];
                TiXmlElement *scoreElement = new TiXmlElement(ch);
                StuElement->LinkEndChild(scoreElement);
            }
        }
        else if (2 == i%3)
        {
            StuElement->SetAttribute("class", "财务指标");
            StuElement->SetAttribute("id", "GZ");
            RootElement->LinkEndChild(StuElement);
            for(int i = 0;i != 12;++i)
            {
                const char* ch = str3[i];
                TiXmlElement *scoreElement = new TiXmlElement(ch);
                StuElement->LinkEndChild(scoreElement);
            }
        }

    }
    CString csXmlFileName = _T("");
    csXmlFileName.Format(_T("%s\\%s.xml"), _T("G:"), _T("testt") );
    CStringA tempFile(csXmlFileName);
    writeDoc->SaveFile(tempFile.GetBuffer());
    tempFile.ReleaseBuffer();
    delete writeDoc;

    return 1;
}

上面这段代码,我在G盘创建了一个名为testt.xml的文件,然后把三个字符数组存了进去;

//解析xml文件  
int CReadXML::readXmlFile()
{
    char *path = "G:\\testt.xml";
    TiXmlDocument mydoc(path);//xml文档对象  
    bool loadOk = mydoc.LoadFile();//加载文档  
    if (!loadOk)
    {
        cout << "could not load the test file.Error:" << mydoc.ErrorDesc() << endl;
        exit(1);
    }

    TiXmlElement *RootElement = mydoc.RootElement();  //根元素, Info  
    cout << "[root name]" << RootElement->Value() << "\n";
    TiXmlElement *pEle = RootElement;

    //遍历该结点  
    for (TiXmlElement *StuElement = pEle->FirstChildElement();//第一个子元素  
        StuElement != NULL;
        StuElement = StuElement->NextSiblingElement())//下一个兄弟元素  
    {
        cout << StuElement->Value() << " ";
        TiXmlAttribute *pAttr = StuElement->FirstAttribute();//第一个属性  

        while (NULL != pAttr) //输出所有属性  
        {
            cout << pAttr->Name() << ":" << pAttr->Value() << " ";
            pAttr = pAttr->Next();
        }
        cout << endl;

        //输出子元素的值  
        for (TiXmlElement *sonElement = StuElement->FirstChildElement();
            sonElement;
            sonElement = sonElement->NextSiblingElement())
        {
            cout << sonElement->Value() << endl;
        }
    }

    return 1;
}

上面这段代码是对应读取上上面写好的XML文件。


 

 

还有参考文献:

https://blog.csdn.net/u014080185/article/details/78688328

https://www.cnblogs.com/time-is-life/p/5671872.html

https://www.cnblogs.com/Bo-tree/articles/5071998.html

http://www.w3school.com.cn/xml/xml_tree.asp

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值