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.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>
2、读xml文件
基本的步骤为
首先获取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为:
<?
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
那就是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 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
>
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
本文详细介绍了如何使用rapidxml库生成和读取XML文件,包括创建节点、属性、元素以及如何修改和保存XML文件。此外,文章还指出rapidxml存在一个明显的bug,即在追加节点时可能不考虑该对象是否已存在。
3308

被折叠的 条评论
为什么被折叠?



