1、寫xml 文件node
#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; }
生成的xml例如如下:ios
<?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:api
#include <string> #include <iostream> #include <fstream> #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils.hpp" #include "rapidxml/rapidxml_print.hpp" using namespace rapidxml; using namespace std; int main(int argc, char* argv[]) { xml_document<> doc; //是解析器 char a[] = "<top>"//假設單獨傳, 就不能加上xml的頭部信息, //不然會報錯 "<name>tangqiang</name>" "<age>22</age>" "</top>"; char* p = a; doc.parse<0>(p); xml_node<>* node = doc.first_node();//去頂級結點 cout << (node->name())<< endl; node = node->first_node(); while (node) { cout << node->name() << node->value() << endl;//name() value()返回的字符串不會去掉首尾的空白字符 node = node->next_sibling(); } ofstream out("test.xml");//ofstream 默認時,假設文件存在則會覆蓋原來的內容,不存在則會新建 out << doc;//doc 這樣輸出時在目標文件裏不會有xml 頭信息---<?xml version='1.0' encoding='utf-8' > out.close(); system("pause"); return 0; }
生成的xml例如如下:app
<top>
<name>tangqiang</name>
<age>22</age>
</top>
2、讀取xml文件post
#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; //! 加入以後再次保存 //需要說明的是rapidxml明顯有一個bug //那就是append_node(doc.allocate_node(node_element,"h","0"));的時候並不考慮該對象是否存在! 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爲:spa
<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> <w>0</w> <h>0</h> </size> <mode fullscreen="false">screen mode</mode> </config>
3、刪除節點code
#include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils.hpp" #include "rapidxml/rapidxml_print.hpp" #include<iostream> using namespace rapidxml; int main() { file<> fdoc("config.xml"); xml_document<> doc; doc.parse<0>(fdoc.data()); std::string text; rapidxml::print(std::back_inserter(text), doc, 0); std::cout<<text<<std::endl; xml_node<>* root = doc.first_node(); xml_node<>* sec = root->first_node(); root->remove_node(sec); //移除根節點下的sec結點(包含該結點下所有結點) text="刪除一個節點\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("test.xml"); out<<doc; system("pause"); return 0; }
輸出信息例如如下:orm
<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> <w>0</w> <h>0</h> </size> <mode fullscreen="false">screen mode</mode> </config> 刪除一個節點 <config> <size> <x>640</x> <y>480</y> <w>0</w> <h>0</h> </size> <mode fullscreen="false">screen mode</mode> </config> 刪除所有節點 <config/>
4、編輯節點信息xml
臨時找到的編輯方法就是先刪除再添加對象
#include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils.hpp" #include "rapidxml/rapidxml_print.hpp" #include<iostream> 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(); xml_node<>* delnode = root->first_node("color"); root->remove_node(delnode);//先刪除address節點 // xml_node<>* lnode = root->first_node("size");//找到post節點 xml_node<>* mynode=doc.allocate_node(node_element,"address","河北"); root->insert_node(lnode,mynode); std::string text; rapidxml::print(std::back_inserter(text),doc,0); std::cout<<text<<std::endl; std::ofstream out("version.xml"); out << doc; system("pause"); return 0; }
輸出例如如下: <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> <w>0</w> <h>0</h> </size> <mode fullscreen="false">screen mode</mode> </config> <config> <address>河北</address> <size> <x>640</x> <y>480</y> <w>0</w> <h>0</h> </size> <mode fullscreen="false">screen mode</mode> </config>
5、遍歷所有節點
for(rapidxml::xml_node<char> * node = parent_node->first_node("node name"); node != NULL; node = node->next_sibling()) { //TO DO }
6、遍歷所有屬性
for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name"); attr != NULL; attr = attr->next_attribute()) { char * value = attr->value(); }