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\t" << 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\t" << 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>

 

posted @ 2018-11-09 17:07  BiaoGe  阅读(12549)  评论(0编辑  收藏  举报