rapidxml~网上很容易下,下面介绍使用方法:
1、xml写文件
如下:
#include
<
iostream
>
#include < rapidxml / rapidxml.hpp >
#include < rapidxml / rapidxml_utils.hpp >
#include < rapidxml / rapidxml_print.hpp >
using namespace rapidxml;
int main()
{
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 <>* node = doc.allocate_node(node_element, " config " , " information " );
xml_node <>* color = doc.allocate_node(node_element, " color " ,NULL);
doc.append_node(node);
node -> append_node(color);
color -> append_node(doc.allocate_node(node_element, " red " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " green " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " blue " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " alpha " , " 1.0 " ));
xml_node <>* size = doc.allocate_node(node_element, " size " ,NULL);
size -> append_node(doc.allocate_node(node_element, " x " , " 640 " ));
size -> append_node(doc.allocate_node(node_element, " y " , " 480 " ));
node -> append_node(size);
xml_node <>* mode = doc.allocate_node(rapidxml::node_element, " mode " , " screen mode " );
mode -> append_attribute(doc.allocate_attribute( " fullscreen " , " false " ));
node -> append_node(mode);
std:: string text;
rapidxml::print(std::back_inserter(text), doc, 0 );
std::cout << text << std::endl;
std::ofstream out ( " config.xml " );
out << doc;
system( " PAUSE " );
return EXIT_SUCCESS;
}
#include < rapidxml / rapidxml.hpp >
#include < rapidxml / rapidxml_utils.hpp >
#include < rapidxml / rapidxml_print.hpp >
using namespace rapidxml;
int main()
{
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 <>* node = doc.allocate_node(node_element, " config " , " information " );
xml_node <>* color = doc.allocate_node(node_element, " color " ,NULL);
doc.append_node(node);
node -> append_node(color);
color -> append_node(doc.allocate_node(node_element, " red " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " green " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " blue " , " 0.1 " ));
color -> append_node(doc.allocate_node(node_element, " alpha " , " 1.0 " ));
xml_node <>* size = doc.allocate_node(node_element, " size " ,NULL);
size -> append_node(doc.allocate_node(node_element, " x " , " 640 " ));
size -> append_node(doc.allocate_node(node_element, " y " , " 480 " ));
node -> append_node(size);
xml_node <>* mode = doc.allocate_node(rapidxml::node_element, " mode " , " screen mode " );
mode -> append_attribute(doc.allocate_attribute( " fullscreen " , " false " ));
node -> append_node(mode);
std:: string text;
rapidxml::print(std::back_inserter(text), doc, 0 );
std::cout << text << std::endl;
std::ofstream out ( " config.xml " );
out << doc;
system( " PAUSE " );
return EXIT_SUCCESS;
}
生成的xml文件为:
xml version='1.0' encoding='utf-8' ?>
<config>
<color>
<red>0.1red>
<green>0.1green>
<blue>0.1blue>
<alpha>1.0alpha>
color>
<size>
<x>640x>
<y>480y>
size>
<mode fullscreen="false">screen modemode>
config>
<config>
<color>
<red>0.1red>
<green>0.1green>
<blue>0.1blue>
<alpha>1.0alpha>
color>
<size>
<x>640x>
<y>480y>
size>
<mode fullscreen="false">screen modemode>
config>
2、读xml文件
基本的步骤为
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...
代码如下:
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...
代码如下:
#include
<
iostream
>
#include < rapidxml / rapidxml.hpp >
#include < rapidxml / rapidxml_utils.hpp >
#include < rapidxml / rapidxml_print.hpp >
using namespace rapidxml;
int main()
{
file<> fdoc("config.xml");
std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<0>(fdoc.data());
std::cout<<doc.name()<<std::endl;
//! 获取根节点
xml_node<>* root = doc.first_node();
std::cout<<root->name()<<std::endl;
//! 获取根节点第一个节点
xml_node<>* node1 = root->first_node();
std::cout<<node1->name()<<std::endl;
xml_node<>* node11 = node1->first_node();
std::cout<<node11->name()<<std::endl;
std::cout<<node11->value()<<std::endl;
//! 修改之后再次保存
xml_node<>* size = root->first_node("size");
size->append_node(doc.allocate_node(node_element,"w","0"));
size->append_node(doc.allocate_node(node_element,"h","0"));
std::string text;
rapidxml::print(std::back_inserter(text),doc,0);
std::cout<<text<<std::endl;
std::ofstream out("config.xml");
out << doc;
system("PAUSE");
return EXIT_SUCCESS;
}
生成的xml为:#include < rapidxml / rapidxml.hpp >
#include < rapidxml / rapidxml_utils.hpp >
#include < rapidxml / rapidxml_print.hpp >
using namespace rapidxml;
int main()
{
file<> fdoc("config.xml");
std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<0>(fdoc.data());
std::cout<<doc.name()<<std::endl;
//! 获取根节点
xml_node<>* root = doc.first_node();
std::cout<<root->name()<<std::endl;
//! 获取根节点第一个节点
xml_node<>* node1 = root->first_node();
std::cout<<node1->name()<<std::endl;
xml_node<>* node11 = node1->first_node();
std::cout<<node11->name()<<std::endl;
std::cout<<node11->value()<<std::endl;
//! 修改之后再次保存
xml_node<>* size = root->first_node("size");
size->append_node(doc.allocate_node(node_element,"w","0"));
size->append_node(doc.allocate_node(node_element,"h","0"));
std::string text;
rapidxml::print(std::back_inserter(text),doc,0);
std::cout<<text<<std::endl;
std::ofstream out("config.xml");
out << doc;
system("PAUSE");
return EXIT_SUCCESS;
}
xml version='1.0' encoding='utf-8'
?>
< config >
< color >
< red > 0.1 red >
< green > 0.1 green >
< blue > 0.1 blue >
< alpha > 1.0 alpha >
color >
< size >
< x > 640 x >
< y > 480 y >
size >
< mode fullscreen ="false" > screen mode mode >
config >
需要说明的是rapidxml明显有一个bug< config >
< color >
< red > 0.1 red >
< green > 0.1 green >
< blue > 0.1 blue >
< alpha > 1.0 alpha >
color >
< size >
< x > 640 x >
< y > 480 y >
size >
< mode fullscreen ="false" > screen mode mode >
config >
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!