主页 > 开源代码  > 

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

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

2023年10月11日,周三下午


目录

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

RapidXML的官网

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 stackoverflow /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; } 运行结果  

 

标签:

【C++】如何使用RapidXML读取和创建XML文件由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】如何使用RapidXML读取和创建XML文件