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

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android Log日志

    Android Log日志

    2021年6月18日
    94
  • 那些强悍的PHP一句话后门

    那些强悍的PHP一句话后门以一个学习的心态来对待PHP后门程序,很多PHP后门代码让我们看到程序员们是多么的用心良苦。强悍的PHP一句话后门这类后门让网站、服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的。今天我们细数一些有意思的PHP一句话木马。利用404页面隐藏PHP小马 PHP  1 2 3 4…

    2022年5月11日
    45
  • 笛卡尔积简单介绍「建议收藏」

    笛卡尔积简单介绍「建议收藏」title:简单介绍笛卡尔积date:2020-10-1320:26:18tags:“离散数学????”categories:“2020/10”简介这个博客参考左孝陵先生的《离散数学》,会尽量简单的讲讲笛卡尔积,能够给大家一个更加具体的认识。什么是序偶要知道什么是序偶,先得弄明白序偶的作用,我觉得序偶就是带顺序的集合,用来表示一些集合表示不了的东西。比如在小学学的直角坐标系上,有两个点,(2,3)和(3,2),点的坐标就是序偶,因为它自带顺序,为什么每次一个点都先读x坐标再读y坐标

    2022年7月11日
    19
  • navicat premium mac激活码【2021最新】

    (navicat premium mac激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~70YZ…

    2022年3月26日
    165
  • 使用RSS实现自动动漫更新提醒及下载(追番)

    使用RSS实现自动动漫更新提醒及下载(追番)喜欢追动漫番并且喜欢下载下来看和收藏的各位应该都有个觉得不方便的地方,那就是每天都得跑去下载的网站进行查看追的剧是否更新。而这并不是难受的地方,更麻烦的是还要记每部剧上个星期放到了第几集,有时候忘记看了,下个星期跳过了一集下载下来,打开看了才发现,然后还得回去下,这真是gay得一批。。好吧闲话有点多了。进入正题吧。作为程序狗的各位对这种需求自然有自己的解决办法,自己写程序进行定时检查是最直接

    2022年8月23日
    3
  • HackBar安装

    HackBar安装最新版的hackbar是收费的。所以还是安装旧版本就行了。1、HackBar2.1.3版本下载地址:github下载地址:https://github.com/Mr-xn/hackbar2.1.32、安装HackBar2.1.3如下图,在firefox打开附加组件,点“从文件安装附加组件”;最后再打开“{4c98c9c7-fc13-4622-b08a-a18923469c1c}.xpi”添加扩展即可!3、关闭HackBar自动更新(重要)找到HackBar插件,点管理,然后将允许自动更新关掉

    2022年6月9日
    506

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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