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>