RapidXml用法[通俗易懂]

RapidXml用法[通俗易懂]一、写xml文件生成的xml例如以下:写文件样例2:生成的xml例如以下:二、读取xml文件生成的xml为:三、删除节点输出信息例如以下:四、编辑节点信息临时找到的编辑方法就是先删

大家好,又见面了,我是你们的朋友全栈君。

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154778.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • setproperty java_Java中System.setProperty()的用法

    setproperty java_Java中System.setProperty()的用法该方法的作用是:设置指定键指示的系统属性在实际项目中发现,如果一个服务器下放置了多个web项目的话,在一个项目中通过调用System.setProperty设置了某个值,再另一个项目中也能获取到该值,所以如果想在一个项目中设置全局变量时尽量避免使用这个方法,应该调用相应的appContext。/**设置指定键对值的系统属性*setProperty(Stringprop,Stringva…

  • Pycharm配置Pyqt5(精细版)[通俗易懂]

    Pycharm配置Pyqt5(精细版)[通俗易懂]Pycharm配置Pyqt5(精细版)前言最近入手了一些关于Qt的项目开发,需要用到Pycharm与Pyqt5的一个结合,当然在安装时也是有一些小坑的,下面我来为大家分享一下在Pycharm中配置Pyqt5的过程。环境配置1、创建虚拟环境:condacreate-nmy_pyqtpython=x.x命令创建python版本为x.x(本人用的3.7)、名字为my_pyqt的虚拟环境。my_pyqt文件可以在Anaconda安装目录envs文件下找到。2、切换/激活虚拟环境:conda

  • awk变量

    awk变量一、awk字段变量变量名属性$0当前记录$1~$n当前记录的第n个字段二、awk内置变量变量名属性FS输入字段分割符,默认是空格RS输入记录分割符,默认是换行符NR已经读处的记录数,就是行号,从1开始NF当前记录的字段个数,就…

  • setContentView剖析[通俗易懂]

    setContentView剖析[通俗易懂]1、setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。3、setContentView最本质的作用是为要显示的view分配内存。4、act

  • Html5 拖放上传图片

    Html5 拖放上传图片

  • 柴油发电机发电机组_柴油发电机配置规范

    柴油发电机发电机组_柴油发电机配置规范应急柴油发电机主要用于重要场所,在紧急情况或事故停电后瞬间停电,通过应急发电机组迅速恢复 并延长一段供电时间。这类用电负荷称为一级负荷。对断电时间有严格要求的设备、仪表及计算机系统,除配备发电机外还应设电池或UPS供电。应急柴油发电机的工作有两个特点:(1)第一个特点是作应急用,连续工作的时间不长,一般只需要持续运行几小时(≤12H);(2)第二个特点是作备用,应急发电机组平时处于停机等待状态,只…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号