XML的创建和读取
创始人
2024-02-17 17:04:06
0

rapidxml是一个快速的xml库,由C++模板实现的高效率xml解析库,同时也是boost库的property_tree的内置解析库。

当使用rapidxml时,只需要把rapidxml.hpp 、 rapidxml_print.hpp 和
rapidxml_utils.hpp 三个文件拷贝到你的工程目录下,就可以了。

一、xml的创建

1.xml创建并打印

代码执行时发现的错误:
bool Create(std::string filename)
{//DOMrapidxml::xml_document<>doc;2.node_declarationrapidxml::xml_node<>* declaration = doc.allocate_node(rapidxml::node_declaration);declaration->append_attribute(doc.allocate_attribute("version", "1.0"));declaration->append_attribute(doc.allocate_attribute("encoding", "utf-8"));doc.append_node(declaration);下面代码出问题:有如下图片显示的错误std::cout << doc;// 无法编译通过,为什么?std::ofstream outfile(filename, std::ios::out);if (outfile){下面代码出问题:有如下图片显示的错误char* end = rapidxml::print(buff, doc, 0);//无法编译通过//std::cout << buff << std::endl;return true;}return false;}

创建时遇到的问题:
1.打印DOM的一个节点到缓冲区失败
2.打印DOM的一个节点到buff失败
在这里插入图片描述
解决办法:
在用这些函数的函数前 加个此函数的声明:

下面的注释都是后加的,解决了找不到的问题。
/*templateinline OutIt print_children(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_element_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_data_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_cdata_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_declaration_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_comment_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_doctype_node(OutIt out, const xml_node* node, int flags, int indent);templateinline OutIt print_pi_node(OutIt out, const xml_node* node, int flags, int indent);*/templateinline OutIt print_node(OutIt out, const xml_node *node, int flags, int indent){// Print proper node typeswitch (node->type()){// Documentcase node_document:out = print_children(out, node, flags, indent);break;// Elementcase node_element:out = print_element_node(out, node, flags, indent);break;// Datacase node_data:out = print_data_node(out, node, flags, indent);break;// CDATAcase node_cdata:out = print_cdata_node(out, node, flags, indent);break;// Declarationcase node_declaration:out = print_declaration_node(out, node, flags, indent);break;// Commentcase node_comment:out = print_comment_node(out, node, flags, indent);break;// Doctypecase node_doctype:out = print_doctype_node(out, node, flags, indent);break;// Picase node_pi:out = print_pi_node(out, node, flags, indent);break;// Unknowndefault:assert(0);break;}// If indenting not disabled, add line break after nodeif (!(flags & print_no_indenting))*out = Ch('\n'), ++out;// Return modified iteratorreturn out;}

2.创建自己的数据输出到xml文件

步骤:
1.创建各个节点,并设置属性,注意控制节点之间的父子关系;
2.创建输出流ofstream,用rapidxml::print方法将doc数据输入到buff中;
3.用outfile将buff数据导入到文件中。

bool Create(std::string filename)
{//DOMstd:: vector::iterator it;rapidxml::xml_document<>doc;std::vectortmp;tmp.push_back("Count");tmp.push_back("Step");tmp.push_back("Record");tmp.push_back("Record");std::vectortmp1;tmp1.push_back("10");tmp1.push_back("100");tmp1.push_back("1000");tmp1.push_back("10000");2.node_declarationrapidxml::xml_node<>* declaration = doc.allocate_node(rapidxml::node_declaration);declaration->append_attribute(doc.allocate_attribute("version", "1.0"));declaration->append_attribute(doc.allocate_attribute("encoding", "utf-8"));doc.append_node(declaration);rapidxml::xml_node<>* Info = doc.allocate_node(rapidxml::node_element, "Info");doc.append_node(Info);rapidxml::xml_node<>* Settings = doc.allocate_node(rapidxml::node_element, "Settings");Info->append_node(Settings);std::vector::iterator it1 = tmp1.begin();for (it = tmp.begin(); it != tmp.end(); it++) {rapidxml::xml_node<>* Count = doc.allocate_node(rapidxml::node_element,it->c_str());Count->append_attribute(doc.allocate_attribute("value", it1->c_str()));Settings->append_node(Count);it1++;}//analysis->append_node()rapidxml::xml_node<>* InstanceInfo = doc.allocate_node(rapidxml::node_element,"InstanceInfo");Info->append_node(InstanceInfo);for (int i = 0; i < 3; i++){rapidxml::xml_node<>* Instance = doc.allocate_node(rapidxml::node_element,"Instance");InstanceInfo->append_node(Instance);Instance->append_attribute(doc.allocate_attribute("id","1"));Instance->append_attribute(doc.allocate_attribute("name", "xxx"));Instance->append_attribute(doc.allocate_attribute("fun", "sin"));for (int j = 0; j < 2; j++){rapidxml::xml_node<>* Parameter = doc.allocate_node(rapidxml::node_element, "Parameter");Instance->append_node(Parameter);Parameter->append_attribute(doc.allocate_attribute("name", "own"));Parameter->append_attribute(doc.allocate_attribute("init", "1"));}}std::cout << doc;// error  为什么?std::ofstream outfile(filename, std::ios::out);if (outfile){char* end = rapidxml::print(buff, doc, 0);*end = 0;outfile << buff; //outfile.close();}return true;}
int main(){const char* file_name = "xxx.xml";bool res = Create(file_name);if (!res){return -1;}return 0;
}

成功输出数据到文件中
在这里插入图片描述

二、读取xml格式到buff

/*这几个文件都要在项目文件夹中,才可以调用库文件*/
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"
//#include "rapidxml_iterators.hpp"
//#include "rapidxml_iterators.hpp"
using namespace rapidxml;
static const int buff_len = 2048;
static char buff[buff_len] = { 0 };
bool Read()
{memset(buff, 0,buff_len);std::string filename = "demo.xml";//实例化文件读取流std::ifstream infile(filename, std::ios::in);if (!infile){std::cout << "file stream instance error!" << std::endl;return false;}//从流中读到buffinfile.read(buff, buff_len);std::cout << buff << std::endl;
}int main()
{bool res = Read();if (!res){return -1;}return 0;
}

在这里插入图片描述

注意此时的xml文件是否在工作目录下,通过右键项目->属性->调试,查看工作路径是否存在xml文件,路径对修改
例如:projectDir 改为OutDir 查看路径是否正确。
在这里插入图片描述

相关内容

热门资讯

思想政治工作条例最新修订内容,... 思想政治工作条例最新修订内容,思想政治工作条例全文下载 思想政治工作条例最新修订,全文下载与深度解读...
CBA潜力赛为何打成“老将赛”... 计时钟归零,双方教练握手致意,观众开始退场,CBA联赛的正赛宣告结束。然而球场并未就此沉寂,替补席上...
“手术钻头断裂遗留患者体内”,... 12月21日,湖南祁阳市卫生健康局发布情况通报称,近日,有媒体报道祁阳市中医医院发生骨科手术钻头断裂...
代驾纠纷 代驾时撞伤行人、车辆发生故障…… 这些都和车主无关,应由代驾赔偿? 观点: 使用代驾服务并非将所有...
公司股东与妻子分居期间出轨女下... 近日据报道,宁夏永宁县人民法院一审查明公司股东李某乙在与妻子李某甲分居期间,与公司女员工马某某存在不...
动物学家、律师和创作者,Thi... 12月21日,以“一起·了不起”为主题的2025 ThinkPad黑FUN礼在京举办。活动现场,律师...
徐奇渊:扩内需与对外政策紧密相... 近日,中国海关总署发布了一组数据令人关注:2025年前11个月,我国货物贸易顺差达到1.08万亿美元...
46岁上海独居女子不幸离世,官... 居住在上海虹口区46岁的蒋女士因突发脑溢血于今年10月入院,远亲吴先生与其公司共同垫付了医药费,但她...
威海市汽车以旧换新补贴政策调整... 根据稳妥有序开展消费品以旧换新工作统一部署,经研究决定,对我市汽车以旧换新补贴政策进行调整。现将有关...