rapidxml 文件读写、增加、删除、编辑节点

本文旨在提供RapidXml文件读写操作,以及对节点的增加、删除、编译提供一个Demo。测试的代码如下:

#include <tchar.h>
#include <string>
#include <iostream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"//rapidxml::file
#include "rapidxml/rapidxml_print.hpp"//rapidxml::print
using namespace rapidxml;

//
void WriteFile1()
{
	xml_document<> doc;
	xml_node<>* rot = doc.allocate_node(rapidxml::node_pi, doc.allocate_string("xml version='1.0' encoding='utf-8'"));
	doc.append_node(rot);

	xml_node<>* config = doc.allocate_node(node_element, "config","information");
	doc.append_node(config);

	xml_node<>* color = doc.allocate_node(node_element, "color",NULL);
	color->append_node(doc.allocate_node(node_element, "red", "88"));
	color->append_node(doc.allocate_node(node_element, "green", "108"));
	color->append_node(doc.allocate_node(node_element, "blue", "128"));
	color->append_node(doc.allocate_node(node_element, "alpha", "255"));
	config->append_node(color);

	xml_node<>* size = doc.allocate_node(node_element, "size", NULL);
	size->append_node(doc.allocate_node(node_element, "x", "1024"));
	size->append_node(doc.allocate_node(node_element, "y", "768"));
	config->append_node(size);

	xml_node<>* mode = doc.allocate_node(rapidxml::node_element, "mode", "screen mode");
	mode->append_attribute(doc.allocate_attribute("fullscreen", "false"));
	config->append_node(mode);

	//打印整个XML内容
	std::string text;
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//写入文件
	std::ofstream out("write_file1.xml");
	out << doc;
	out.close();

	/*<?xml version="1.0" encoding="utf-8" ?>
	<config>
		<color>
			<red>88</red>
			<green>108</green>
			<blue>128</blue>
			<alpha>255</alpha>
		</color>
		<size>
			<x>1024</x>
			<y>768</y>
		</size>
		<mode fullscreen="false">screen mode</mode>
	</config>*/
}
//
void WriteFile2()
{
	xml_document<> doc;
	char strbuf[] = 
		/*"<?xml version=\'1.0\' encoding=\'utf-8\' ?>"*/
		"<root>"
		"<Devices>"
		"<Monitor>LG</Monitor>"
		"<MotherBoard>Gigabyte</MotherBoard>"
		"<MemoryBar>Kingston</MemoryBar>"
		"<Graphics>MSI</Graphics>"
		"<Hardisk>WD</Hardisk>"
		"</Devices>"

		"<job>"
		"<name>CSDN</name>"
		"<website>http://blog.csdn.net/hellokandy</website>"
		"<addr>Guangzhou China</addr>"
		"</job>"
		"</root>";
	doc.parse<0>( strbuf );

	//打印整个XML内容
	std::string text;
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//写入文件
	std::ofstream out("write_file2.xml");//ofstream默认时,如果文件存在则覆盖原来的内容,不存在则新建
	out << doc;
	out.close();
}
//
void ModifyFile()
{
	//
	file<> fdoc("write_file2.xml");
	xml_document<> doc;
	doc.parse<0>(fdoc.data());

	std::string text;
	rapidxml::print(std::back_inserter(text), doc, 0);//doc内容输出到text尾处
	std::cout << text << std::endl;

	xml_node<>* root = doc.first_node();
	xml_node<>* Devices = root->first_node();
	//xml_node<>* job = root->first_node("job");

	//移除根节点下的Devices结点下的MotherBoard节点
	xml_node<>* MotherBoard = Devices->first_node("MotherBoard");
	Devices->remove_node(MotherBoard);

	//
	text = "移除根节点下的Devices结点下的MotherBoard节点\r\n";
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//在Devices的Graphics节点处插入一个KeyBorad节点
	xml_node<>* Graphics = Devices->first_node("Graphics");//找到Graphics节点
	xml_node<>* new_node = doc.allocate_node(node_element, "KeyBorad", "Logitech");
	new_node->append_attribute(doc.allocate_attribute("Interface", "USB"));
	Devices->insert_node(Graphics, new_node);

	text = "在Devices下面插入一个KeyBorad节点\r\n";
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//移除根节点下的Devices结点(包括该结点下所有结点)
	root->remove_node(Devices);
	text = "移除根节点下的Devices结点(包括该结点下所有结点)\r\n";
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//移除根节点下所有结点
	root->remove_all_nodes();
	text = "移除根节点下所有结点\r\n";
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;

	//写入文件
	std::ofstream out("write_file2_delete.xml");
	out << doc;
	out.close();
}
//
int _tmain(int argc, _TCHAR* argv[])
{
	//
	WriteFile1();
	
	//
	WriteFile2();

	//
	ModifyFile();

	system("pause");
	return 0;
}
值得一提的是:RapidXml是没有提供编辑节点的,但可以通过先删除节点,然后再插入的方式来解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值