pugixml使用示例及注意点

一.简介

pugixml的官方主页为:http://pugixml.org/

pugixml个人觉得目前是C++处理xml里最方便,速度也最快的,在生成xml方面,300个xml文件,pugixml只用6s,对比rapidxml用时60+s,效率高了10倍,很nice;
然后它的通用优点,列举下:
它很轻量,只有三个文件(pugiconfig.hpp pugixml.cpp pugixml.hpp )
支持Unicode
支持XPATH解析
跨平台(windows/linux)

二.宽字符注意点

pugixml 使用宽字符写入xml需要将pugiconifg.hpp 的宽字符模式注释放开,如下图所示:
在这里插入图片描述

三.中文方式注意点

建议:如果你用的是char*,然后节点包含中文,使用<?xml version="1.0" encoding="gbk"?>这个声明;
当然最好的,是用wchar_t *,节点包含中文,就可以使用<?xml version="1.0" encoding="utf-8"?>声明,不用担心编码解析问题;

四.生成xml的示例
#include <iostream>
#include <sstream>

#include "pugixml.hpp"

#pragma comment(lib, "pugixml.lib")

// using namespace std;
int main(int argc, char const *argv[])
{
	int count = 10;

	// 多字节字符
	//pugi::xml_document xml_doc;
	//pugi::xml_node xml_pre_node = xml_doc.prepend_child(pugi::node_declaration);
	//xml_pre_node.append_attribute("version") = "1.0";
	//xml_pre_node.append_attribute("encoding") = "gbk";
	//pugi::xml_node root_node = xml_doc.append_child("book");
	//root_node.append_attribute("PageNumber").set_value(count);
	//pugi::xml_node name_node = root_node.append_child("name");
	//name_node.append_child(pugi::node_pcdata).set_value("小王子");
	//xml_doc.save_file("pugixml_Example.xml");
	
	// 宽字节字符
	pugi::xml_document xml_doc;
	pugi::xml_node xml_pre_node = xml_doc.prepend_child(pugi::node_declaration);
	xml_pre_node.append_attribute(L"version") = L"1.0";
	xml_pre_node.append_attribute(L"encoding") = L"utf-8";
	pugi::xml_node root_node = xml_doc.append_child(L"book");
	root_node.append_attribute(L"PageNumber").set_value(count);
	pugi::xml_node name_node = root_node.append_child(L"name");
	name_node.append_child(pugi::node_pcdata).set_value(L"小王子");
	xml_doc.save_file("pugixml_Example_wchar.xml");
	// 读取指定节点的value值  node_value 为小王子
	std::wstring node_value = name_node.first_child().value();
	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是将Pugi XML解析库读取的XML文档存储到结构体数据中的示例代码: ```c++ #include "pugixml.hpp" #include <iostream> #include <string> #include <vector> using namespace std; struct Person { string name; int age; string address; }; int main() { pugi::xml_document doc; if (!doc.load_file("example.xml")) { // 加载XML文档 cout << "Failed to load XML file." << endl; return 1; } vector<Person> persons; // 存储Person结构体数据的vector pugi::xml_node root = doc.child("root"); // 获取根节 for (pugi::xml_node person_node : root.children("person")) { // 遍历person节 Person person; person.name = person_node.attribute("name").value(); // 读取name属性 person.age = atoi(person_node.attribute("age").value()); // 读取age属性并转换为整数 person.address = person_node.child_value("address"); // 读取address子节的值 persons.push_back(person); // 将Person结构体数据添加到vector中 } // 输出vector中的Person结构体数据 for (const auto& person : persons) { cout << "Name: " << person.name << endl; cout << "Age: " << person.age << endl; cout << "Address: " << person.address << endl; } return 0; } ``` 在上面的示例代码中,我们定义了一个Person结构体来存储每个person节的数据。我们使用Pugi XML解析库读取XML文档,并使用for循环遍历每个person节。在循环中,我们读取每个person节的name、age和address数据,并将这些数据存储到Person结构体中。然后,我们将每个Person结构体添加到vector中。最后,我们输出vector中的所有Person结构体数据。 需要注意的是,上面的示例代码中使用了atoi函数来将字符串转换为整数。如果你使用的是C++11或更高版本的C++标准,则可以使用stoi函数来完成相同的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值