• RapidXml用法


    一、写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="删除一个节点
    ";  
        rapidxml::print(std::back_inserter(text), doc, 0);  
        std::cout<<text<<std::endl; 
    
        root->remove_all_nodes(); //移除根节点下全部结点
        text="删除全部节点
    ";  
        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();
    }
  • 相关阅读:
    lvs+keepalived+nginx
    linux配置静态ip
    nginx+keepalived
    nginx反向代理+负载均衡
    win10 安装虚拟机问题
    zlib-1.2.8用VS2010编译生成动态静态库
    mysql 创建库时指定编码
    mysql 升级遇到的问题 (本次由5.1.1X到5.6.28)
    android的SDK包下载
    node-webkit 使用笔记
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/10386131.html
Copyright © 2020-2023  润新知