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

【C++】如何使用RapidXML读取和创建XML文件

2023年10月11日,周三下午


目录

  • RapidXML的官网
  • 使用rapidXML读取XML文件中的元素的属性和值
  • 此次要读取的XML文件:ReadExample.xml
  • 用于读取此XML文件的C++代码
  • 运行结果
  • 使用rapidXML创建XML文件
  • 用于创建XML文件的C++代码
  •  如果上面的代码无法运行
  • 运行结果
  • ​编辑 

RapidXML的官网

https://rapidxml.sourceforge.net/

RapidXML只有头文件,不需要编译和配置。


使用rapidXML读取XML文件中的元素的属性和值

此次要读取的XML文件:ReadExample.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- XML声明,指定版本和编码 --> 
<root> <!-- 根元素 --> 
    <Connector connectionTimeout="20000" maxParameterCount="1000" port="8088" protocol="HTTP/1.1" redirectPort="8443"/><!--子元素Connector-->
    <book> <!-- 子元素book -->
        <name>C++ Primer</name>
        <author>Stanley B. Lippman</author>
        <price>59.00</price>
    </book> 
    <book>
        <name>Head First Java</name>
        <author>Kathy Sierra</author>
        <price>35.99</price>
    </book> 
</root>

用于读取此XML文件的C++代码

#include "rapidxml.hpp"
#include <iostream>
#include <fstream>

int main() {
    rapidxml::xml_document<> doc;

    // 打开XML文件
    std::ifstream file("ReadExample.xml");
    if (!file) {
        std::cerr << "Failed to open the XML file." << std::endl;
        return 1;
    }

    // 读取XML文件内容到内存
    std::string xml_contents((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
    file.close();

    // 解析XML文档
    doc.parse<rapidxml::parse_default>(&xml_contents[0]);

    // 获取根元素
    rapidxml::xml_node<>* root = doc.first_node("root");

    // 遍历子元素book
    for (rapidxml::xml_node<>* book = root->first_node("book"); book; book = book->next_sibling("book")) {
        // 获取书名
        rapidxml::xml_node<>* name = book->first_node("name");
        if (name) {
            std::cout << "Book Name: " << name->value() << std::endl;
        }

        // 获取作者
        rapidxml::xml_node<>* author = book->first_node("author");
        if (author) {
            std::cout << "Author: " << author->value() << std::endl;
        }

        // 获取价格
        rapidxml::xml_node<>* price = book->first_node("price");
        if (price) {
            std::cout << "Price: " << price->value() << std::endl;
        }

        std::cout << std::endl;
    }

    // 获取Connector元素的属性
    rapidxml::xml_node<>* connector = root->first_node("Connector");
    if (connector) {
        std::cout << "Connector Attributes:" << std::endl;
        for (rapidxml::xml_attribute<>* attr = connector->first_attribute(); attr; attr = attr->next_attribute()) {
            std::cout << "Attribute Name: " << attr->name() << ", Value: " << attr->value() << std::endl;
        }
    }

    return 0;
}

运行结果

使用rapidXML创建XML文件

用于创建XML文件的C++代码

#include "rapidxml.hpp"
#include "rapidxml_print.hpp" // 用于格式化输出XML
#include <iostream>
#include <fstream>

int main() {
    rapidxml::xml_document<> doc;

    // 创建根元素
    rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "root");
    doc.append_node(root);

    // 创建一个元素book
    rapidxml::xml_node<>* book = doc.allocate_node(rapidxml::node_element, "book");
    root->append_node(book);

    // 创建book元素的子元素
    rapidxml::xml_node<>* name = doc.allocate_node(rapidxml::node_element, "name", "C++ Primer");
    book->append_node(name);

    rapidxml::xml_node<>* author = doc.allocate_node(rapidxml::node_element, "author", "Stanley B. Lippman");
    book->append_node(author);

    rapidxml::xml_node<>* price = doc.allocate_node(rapidxml::node_element, "price", "59.00");
    book->append_node(price);

    // 创建第二个book元素
    book = doc.allocate_node(rapidxml::node_element, "book");
    root->append_node(book);

    name = doc.allocate_node(rapidxml::node_element, "name", "Head First Java");
    book->append_node(name);

    author = doc.allocate_node(rapidxml::node_element, "author", "Kathy Sierra");
    book->append_node(author);

    price = doc.allocate_node(rapidxml::node_element, "price", "35.99");
    book->append_node(price);

    // 输出XML到文件
    std::ofstream file("created.xml");
    file << doc;
    file.close();

    return 0;
}

 如果上面的代码无法运行

如果你也遇到了如下这样的错误

那么可以按照下面这两篇文章来创建一个rapidxml_ext.hpp文件

c++ - RapidXML:无法打印 - 编译时错误 - IT工具网 (coder.work)

c++ - RapidXML: Unable to print - Compile-time Error - Stack Overflow 

rapidxml_ext.hpp文件的代码如下 

//rapidxml_ext.hpp
#pragma once

#include "rapidxml.hpp"

// Adding declarations to make it compatible with gcc 4.7 and greater
// See https://stackoverflow.com/a/55408678
namespace rapidxml {
    namespace internal {
        template <class OutIt, class Ch>
        inline OutIt print_children(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_attributes(OutIt out, const xml_node<Ch>* node, int flags);

        template <class OutIt, class Ch>
        inline OutIt print_data_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_cdata_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_element_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_declaration_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_comment_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_doctype_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

        template <class OutIt, class Ch>
        inline OutIt print_pi_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
    }
}

#include "rapidxml_print.hpp"

 然后在原来的代码的基础上,引入头文件rapidxml_ext.hpp

注意头文件的顺序,rapidxml_ext.hpp的引入必须先于rapidxml_print.hpp

改正的代码后如下

#include "rapidxml.hpp"
#include "rapidxml_ext.hpp"  //只多了这一行
#include "rapidxml_print.hpp" // 用于格式化输出XML
#include <iostream>
#include <fstream>

int main() {
    rapidxml::xml_document<> doc;

    // 创建根元素
    rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "root");
    doc.append_node(root);

    // 创建一个元素book
    rapidxml::xml_node<>* book = doc.allocate_node(rapidxml::node_element, "book");
    root->append_node(book);

    // 创建book元素的子元素
    rapidxml::xml_node<>* name = doc.allocate_node(rapidxml::node_element, "name", "C++ Primer");
    book->append_node(name);

    rapidxml::xml_node<>* author = doc.allocate_node(rapidxml::node_element, "author", "Stanley B. Lippman");
    book->append_node(author);

    rapidxml::xml_node<>* price = doc.allocate_node(rapidxml::node_element, "price", "59.00");
    book->append_node(price);

    // 创建第二个book元素
    book = doc.allocate_node(rapidxml::node_element, "book");
    root->append_node(book);

    name = doc.allocate_node(rapidxml::node_element, "name", "Head First Java");
    book->append_node(name);

    author = doc.allocate_node(rapidxml::node_element, "author", "Kathy Sierra");
    book->append_node(author);

    price = doc.allocate_node(rapidxml::node_element, "price", "35.99");
    book->append_node(price);

    // 输出XML到文件
    std::ofstream file("created.xml");
    file << doc;
    file.close();

    return 0;
}

运行结果

 

 

相关文章:

  • 百度Apollo自动驾驶
  • 【算法|前缀和系列No.2】牛客网 DP35 【模板】二维前缀和
  • QCustomPlot实现曲线拖拽
  • 浅谈大数据之Flink
  • python:从Excel或者CSV中读取因变量与多个自变量,用于训练机器学习回归模型,并输出预测结果
  • 管理系统搭建一般步骤(会话跟踪 路由导航守卫 响应拦截器)
  • NoVNC(Client)+TigerVNC(Server)搭建流程
  • 上位机在自动化中有何作用和优势?
  • Adobe发布Firefly 2,提升图像质量和用户体验
  • Android---Android 是如何通过 Activity 进行交互的
  • 使用解构赋值简化axios返回对象属性元素的提取
  • root赋权
  • nodejs+vue水浒鉴赏平台系统
  • linux下文件存储系统(inode/目录项/硬链接)
  • MySQLJDBC入门与SQL注入
  • 至强服务器BIOS/UEFI驱动开发笔记
  • 【MySQL】表的查询与连接
  • C# 图解教程 第5版 —— 第5章 类的基本概念
  • 智能油烟机 优化烹饪体验
  • python树状打印项目路径
  • 4月外汇储备增加410亿美元,黄金储备连续6个月增加
  • 解读|降准叠加政策利率、公积金贷款利率、结构性政策工具利率全线下调,影响有多大?
  • 福特汽车撤回业绩指引,警告关税或造成15亿美元利润损失
  • 上海黄浦区拟73.2654亿元协议出让余庆里7宗组合地块
  • 于东来再次回应玉石质疑:邀请前往胖东来深入考察,随时欢迎各方调查
  • 五一假期上海边检查验出入境人员超61万人次,同比增长23%