RapidXml用法[通俗易懂]

发布时间:2025-12-09 13:58:47 浏览次数:5

一、写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;}

生成的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:

#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例如以下:

<top>    <name>tangqiang</name>    <age>22</age></top>

二、读取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;    //! 加入之后再次保存    //须要说明的是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为:

<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>

三、删除节点

#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;}

输出信息例如以下:

<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/>

四、编辑节点信息

临时找到的编辑方法就是先删除再添加

#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>

五、遍历全部节点

for(rapidxml::xml_node<char> * node = parent_node->first_node("node name");    node != NULL;    node = node->next_sibling()){    //TO DO}

六、遍历全部属性

for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name");    attr != NULL;    attr = attr->next_attribute()){    char * value = attr->value();}
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477