1.百度词条
可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。
2.简述应用场景
上一个章节我们了解了有关json解析的讲解;
开发小技巧分享 01:JSON解析工具-CSDN博客文章浏览阅读239次,点赞8次,收藏2次。对于开发者而言,我们经常会遇到各种各样的配置文件,很多时候开发人员喜欢用较为轻便的json来存储相关的配置信息。因而,如何解析好json文件就成为了我们开发人员的一项基本技能。_json解析工具https://blog.csdn.net/Hellomino_/article/details/144885592?fromshare=blogdetail&sharetype=blogdetail&sharerId=144885592&sharerefer=PC&sharesource=Hellomino_&sharefrom=from_link
类似的,xml功能与json有很多相类是的地方,不同的是,xml比json多了些属性解读,注释等的用途,对于数据存储而言有了更多的可拓展性。
3.xml解析工具
这里推荐pugixml解析工具,非常实用pugixml: pugixml 是一个轻量级的 C++ XML处理库https://gitee.com/mirrors/pugixml.git
简单的只需用到此3个代码文件即可
4.代码简例
test.xml
<?xml version="1.0" encoding="utf-8"?>
<person name="John" age=30><address><street>123 Main St</street><city>New York</city><state>NY</state><zipcode>10001</zipcode></address><phone_numbers><number type="home">555-1234</number><number type="work">555-5678</number></phone_numbers><favorites><favorite>reading</favorite><favorite>swimming</favorite><favorite>cycling</favorite></favorites>
</person>
test.cpp //简单的实现遍历所有节点
//test.cpp
#include <iostream>
#include <fstream>
#include <cstring>
#include "pugixml.hpp"using namespace std;
pugi::xml_document doc;void read_all_nodes(pugi::xml_node node, int depth) {string indent(depth * 2, ' ');// 输出当前节点的名称和内部文本string name = node.name();if ("" != name)cout << indent << node.name() << " : " << node.text().get() << endl;// 遍历属性for (pugi::xml_attribute_iterator it = node.attributes_begin(); it != node.attributes_end(); ++it) {cout << indent << it->name() << " = " << it->value() << endl;}// 递归遍历子节点for (pugi::xml_node_iterator it = node.begin(); it != node.end(); ++it) {//if()read_all_nodes(*it, depth + 1);}
}//查看头部数据
int xml_read(const char* filename)
{ifstream inputFile(filename, ios::binary);if (!inputFile.is_open()) {cerr << "无法打开文件" << endl;return -1;}inputFile.close();if (!doc.load_file(filename)) {cout << "Error loading XML file\n";return 1;}read_nodes(doc.child("person"), 0);//pugi::xml_node root = doc.child(doc.first_child().name()); // 假设XML文件的根节点是<root>return 0;
}int main(int argc, const char* argv[])
{xml_read("test.xml");if (2 == argc) {xml_read(argv[1]);}else{return -1;}return 0;
}