当前位置: 首页 > news >正文

开发小技巧分享 02:xml解析工具

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;
}

相关文章:

  • 【面试】Java面试频繁问到的题最新整理(附答案)
  • 【深度学习】Transformer技术报告:架构与原理
  • [论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution
  • 零基础学QT、C++(一)安装QT
  • Linux nohup
  • MySQL的聚簇索引与非聚簇索引
  • [M二分] lc2080. 区间内查询数字的频率(模拟+二分+数据结构+Go二分库函数+知识总结)
  • 大数据的特点
  • Java 23和JDK 23详细安装方法,常用命令使用等
  • 2015年下半年试题二:论软件系统架构风格
  • 一周学会Flask3 Python Web开发-post请求与参数获取
  • 【数据结构】队列(Queue)
  • java面试场景问题
  • 【Vue+python】Vue调用python-fastApi接口实现数据(数值、列表类型数据)渲染
  • 探索C语言中判断字符串循环移位关系的实现
  • Python常见面试题的详解9
  • 【Elasticsearch】multi_match查询
  • domain 网络安全
  • OkHttp工具类
  • Spring Boot 示例项目:从零开始构建 Web 应用
  • 中国首颗地质行业小卫星“浙地一号”成功发射
  • 联合国:欢迎俄乌伊斯坦布尔会谈,希望实现全面停火
  • 本周看啥|《歌手》今晚全开麦直播,谁能斩获第一名?
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作
  • 警方通报男子广州南站持刀伤人:造成1人受伤,嫌疑人被控制
  • 人民日报:从“轻微免罚”看涉企执法方式转变