• C++解析XML


    1.介绍

      读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。  

      下载TinyXML的网址:http://www.grinninglizard.com/tinyxml/

      使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

    原文链接:https://www.cnblogs.com/xudong-bupt/p/3733306.html#undefined
    XML用的人挺多,所以我也想看下怎么用C++解析生成XML。
    准备用C++&GDIPlus仿个爱奇艺图片查看功能,发现自绘界面的话,各个坐标太多太乱了。
    可以考虑将其坐标事先写到XML中,然后运行时将其读取出来,也方便以后的改写。

    下面是我抄过来加了注释的代码:

      1 #include <iostream>
      2 #include "tinyxml.h"
      3 #include <string>
      4 
      5 using namespace std;
      6 
      7 enum SuccessEnum {FAILURE,SUCCESS};
      8 
      9 SuccessEnum loadXML(void)
     10 {
     11     // XML文档
     12     TiXmlDocument doc;
     13     // 加载XML文档
     14     if (!doc.LoadFile("a.xml"))
     15     {
     16         cerr << doc.ErrorDesc() << endl;
     17         return FAILURE;
     18     }
     19 
     20     // 定义根节点变量并赋值为文档的第一个根节点
     21     TiXmlElement *root = doc.FirstChildElement();
     22     // 如果没有找到根节点,说明是空XML文档或者非XML文档
     23     if (root == NULL)
     24     {
     25         cerr << "Failed to load file: No root element." << endl;
     26         // 清理内存
     27         doc.Clear();
     28         return FAILURE;
     29     }
     30 
     31     // 遍历子节点
     32     for (TiXmlElement *elem = root->FirstChildElement(); elem != NULL; elem=elem->NextSiblingElement())
     33     {
     34         // 获取元素名
     35         string elemName = elem->Value();
     36         const char *attr;
     37         // 获取元素属性值
     38         attr = elem->Attribute("priority");
     39         if (strcmp(attr,"1") == 0)
     40         {
     41             // 还有子节点bold,bold下还有一段文本
     42             TiXmlElement *e1 = elem->FirstChildElement("bold");
     43             // bold下只有一段文本元素,所以,只获取一次子元素就好
     44             TiXmlNode *e2 = e1->FirstChild();
     45             // 输出子文本元素值
     46             cout << "priority=1	" << e2->ToText()->Value() << endl;
     47         }
     48         else if (strcmp(attr,"2") == 0)
     49         {
     50             // 属性值为"2"的下面只有一段文本
     51             TiXmlNode *e1 = elem->FirstChild();
     52             // 取出来并输出
     53             cout << "priority=2	" << e1->ToText()->Value() << endl;
     54         }
     55     }
     56     // 清理内存
     57     doc.Clear();
     58     return SUCCESS;
     59 }
     60 
     61 SuccessEnum saveXML(void)
     62 {
     63     // XML文档
     64     TiXmlDocument doc;
     65 
     66     // 根节点(根节点名字随意)
     67     TiXmlElement *root = new TiXmlElement("root");
     68     // 在文档中加入一个根节点
     69     doc.LinkEndChild(root);
     70     
     71     // 第一个元素
     72     TiXmlElement *element1 = new TiXmlElement("Element1");
     73     // 在根节点下加入子元素
     74     root->LinkEndChild(element1);
     75     // 添加子元素属性
     76     element1->SetAttribute("attribute1","some value");
     77 
     78     // 第二个元素
     79     TiXmlElement *element2 = new TiXmlElement("Element2");
     80     // 在根节点下再次加入元素
     81     root->LinkEndChild(element2);
     82     // 设置该元素第一个属性值
     83     element2->SetAttribute("attribute2","2");
     84     // 设置该元素第二个属性值
     85     element2->SetAttribute("attribute3","3");
     86 
     87     // 第三个元素
     88     TiXmlElement *element3 = new TiXmlElement("Element3");
     89     // 注意:这是在第二个元素(element2)下加入元素(element3)
     90     element2->LinkEndChild(element3);
     91     // 设置该元素属性值
     92     element3->SetAttribute("attribute4","4");
     93 
     94     // 文本元素
     95     TiXmlText *text = new TiXmlText("Some text.");
     96     // 在第二个元素下加入文本
     97     element2->LinkEndChild(text);
     98 
     99     // 保存文档
    100     bool sucess = doc.SaveFile("b.xml");
    101     // 清理内存
    102     doc.Clear();
    103 
    104     if (sucess)
    105         return SUCCESS;
    106     else
    107         return FAILURE;
    108 }
    109 
    110 int main(void)
    111 {
    112     cout << "Hello XML!" << endl;
    113 
    114     if (loadXML() == FAILURE)
    115         cout << "XML 加载失败!" << endl;
    116     else
    117         cout << "XML 加载成功!" << endl;
    118 
    119     if (saveXML() == FAILURE)
    120         cout << "XML 保存失败!" << endl;
    121     else
    122         cout << "XML 保存成功!" << endl;
    123 
    124     return 0;
    125 }

     项目中用到的a.xml文档:

     1 <ToDo>
     2     <Item priority="1"> 
     3         <bold>
     4             Book store!
     5         </bold>
     6     </Item>
     7     <Item priority="2"> 
     8         book1
     9     </Item>
    10     <Item priority="2"> 
    11         book2
    12     </Item>
    13 </ToDo>
  • 相关阅读:
    JavaScript全局属性和全局函数
    bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋
    视觉有难,八方点赞。
    北上广等一线城市IT岗位已接近饱和?
    做大数据分析的怎么可以不会这个?
    当用户管理系统遇上python和mongodb后……
    一篇文章看懂大数据分析就业前景及职能定位
    是程序员,就用python导出pdf
    上次被人说TK不好咯,这次给你整个高大上的
    别再说Python没有枚举类型了,好好看看
  • 原文地址:https://www.cnblogs.com/biaoge140/p/9936100.html
Copyright © 2020-2023  润新知