前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]

g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-13 13:19:05
7760
发布2022-09-13 13:19:05
举报
文章被收录于专栏:全栈程序员必看

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

共四个文件需要引用

代码语言:javascript
复制
#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_iterators.hpp"

1:修改rapidxml_iterators.hpp文件 第20 和 102 行

// typedef typename xml_node<Ch> value_type; // typedef typename xml_node<Ch> &reference; // typedef typename xml_node<Ch> *pointer; // typedef std::ptrdiff_t difference_type; // typedef std::bidirectional_iterator_tag iterator_category;

为下面的内容

typedef xml_node<Ch> value_type; typedef xml_node<Ch> &reference; typedef xml_node<Ch> *pointer; typedef typename std::ptrdiff_t difference_type; typedef typename std::bidirectional_iterator_tag iterator_category;

// typedef typename xml_attribute<Ch> value_type; // typedef typename xml_attribute<Ch> &reference; // typedef typename xml_attribute<Ch> *pointer; // typedef std::ptrdiff_t difference_type; // typedef std::bidirectional_iterator_tag iterator_category; 为下面的内容 typedef xml_node<Ch> value_type; typedef xml_node<Ch> &reference; typedef xml_node<Ch> *pointer; typedef typename std::ptrdiff_t difference_type; typedef typename std::bidirectional_iterator_tag iterator_category;

2:rapidxml_print.hpp 文件 在文件的:124行处插入如下代码

代码语言:javascript
复制
template<class OutIt, class Ch>
inline OutIt print_children(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch>* node, int flags);

template<class OutIt, class Ch>
inline OutIt print_data_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_element_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_comment_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);

template<class OutIt, class Ch>
inline OutIt print_pi_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);
g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]
g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]

更改完毕即可使用了

1.写文件

代码语言:javascript
复制
#include <iostream>
#include "../rapidxml/rapidxml.hpp"
#include "../rapidxml/rapidxml_utils.hpp"
#include "../rapidxml/rapidxml_print.hpp"
#include "../rapidxml/rapidxml_iterators.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);  
	//建议使用如下方法,否则临时变量的指针出了作用域,容易造成xml节点问题
	//std::string s = "color";
	//char* pname = doc.allocate_string(s.c_str());
	//doc.allocate_node(node_element,pname,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;
}

2.读文件 :

代码语言:javascript
复制
#include <iostream>
#include "../rapidxml/rapidxml.hpp"
#include "../rapidxml/rapidxml_utils.hpp"
#include "../rapidxml/rapidxml_print.hpp"
#include "../rapidxml/rapidxml_iterators.hpp"
using namespace rapidxml;

int main()
{
    file<> fdoc("config.xml");
    std::cout << fdoc.data() << std::endl;
    xml_document<> doc;
    doc.parse<parse_full>(fdoc.data());

    std::cout << doc.name() << std::endl;

    //! 获取根节点
    xml_node<> *root = doc.first_node("config");
    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;

    //! 修改之后再次保存
    xml_node<> *size = root->first_node("size");

    // rapidxml::xml_attribute<>* nameAttr = child->first_attribute("name");

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

运行结果 config.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> <w>0</w> <h>0</h> </size> <mode fullscreen=”false”>screen mode</mode> </config>

3.读xml 格式数据

代码语言:javascript
复制
#include <iostream>
#include "../rapidxml/rapidxml.hpp"
#include "../rapidxml/rapidxml_utils.hpp"
#include "../rapidxml/rapidxml_print.hpp"
#include "../rapidxml/rapidxml_iterators.hpp"

using namespace rapidxml;

void readFile(char *strc)
{
    rapidxml::xml_document<> doc;
    doc.parse<0>(strc);
    //获取根节点 
    rapidxml::xml_node<> *root = doc.first_node("Package");
    int nSize = 0;

    std::cout << "config=" << root->name() << std::endl;

    // rapidxml::xml_node<> *child = root->first_node("LtdInfo")->first_node(); //找到 LtdInfo 节点

    // std::cout << "LtdInfo=" << child->name() << std::endl;
    // std::cout << "LtdInfo=" << child->value() << std::endl;

    for (rapidxml::xml_node<> *child = root->first_node("LtdInfo")->first_node(); child; child = child->next_sibling())
    {

        std::cout << "" << child->name() << ":=" << child->value() << std::endl;
       
    }

    for (rapidxml::xml_node<> *child = root->first_node("Data")->first_node(); child; child = child->next_sibling())
    {

        std::cout << "" << child->name() << ":=" << child->value() << std::endl;
       
    }

    strc = NULL;
}

int main()
{  
    char strbuf[] =     

        "<Package>"
        "<LtdInfo>"
        "<Code>[41574100001454]</Code>"
        "<Pwd>[111111]</Pwd>"
        "<Class>[N010]</Class>"
        "<Flag>[20220408210546445]</Flag>"
        "</LtdInfo>"
        "<Data>"
        "<Name>[Datatype,DateTime,millisecond,Data]</Name>"
        "<Value>[0,2022-04-08 21:05:46,445,21.6,20.3,18.6,17.6,16.7,16.6,15.6,14.4,14.2,14.2,12.5,10.6,8.8,9.3,8.2,6.3,7.1,4.6,4.9,3.9,0.1,11.8,1.4,-0.8,-1.7,-0.7,13.8,-1.5,-2.6,-0.8,-4.3,-2.1,-2.5,1.9]</Value>"
        "</Data>"
        "</Package>";
    readFile(strbuf);
}
g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]
g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档