c++ - 使用 RapidXML 写入 XML
问题描述
我正在尝试使用元组读取我的向量并将其解析为 xml 文件。写入 XML 文件有效,但他只写入最后一个节点的值。所以我一直只得到相同的值。我发现在 for 循环之后他丢失了所有现有节点。也许我对 doc.append_node(root) 的想法是错误的?!
#include "XmlHandle.h"
#include <rapidxml/rapidxml.hpp>
#include "rapidxml/rapidxml_print.hpp"
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <sstream>
using namespace rapidxml;
XmlHandle::WriteToXml(std::vector<std::tuple<Key, Tone>> vector)
{
xml_document<> doc;
xml_node<>* decl = doc.allocate_node(node_declaration);
//adding attributes at the top of our xml
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
doc.append_node(decl);
//creating a pointer for the root note "NoteList"
xml_node<> *root = doc.allocate_node(node_element, "NoteList");
//iterating through our vector
for (std::tuple<Key, Tone> tuple : vector)
{
//creating the nodes tuple and key
xml_node<> *tuple1 = doc.allocate_node(node_element, "Tuple");
xml_node<> *key = doc.allocate_node(node_element, "Key");
//getting the char of key saving in d
char d = std::get<0>(tuple).key;
//creating a pointer on d
key->value(&d, 1);
const char *name = std::string("test").c_str();
//creating a new node element Tone
xml_node<> *ToneNode = doc.allocate_node(node_element, "Tone");
//adding the element to tuple1
tuple1->append_node(ToneNode);
//adding the note element Frequency
xml_node<> *Frequency = doc.allocate_node(node_element, "Frequency");
float FrequencyFloat = std::get<1>(tuple).frequency;
std::string FrequencyString = std::to_string(FrequencyFloat);
//setting the value from frequency
Frequency->value(FrequencyString.c_str());
tuple1->append_node(Frequency);
xml_node<> *Node = doc.allocate_node(node_element, "Node");
char * NodeValuePinter = (char*)&std::get<1>(tuple).tone;
char *charPinter = &std::get<1>(tuple).tone;
Node->value(charPinter, 1);
ToneNode->append_node(Node);
tuple1->append_node(key);
//adding tuple to our root
root->append_node(tuple1);
}
doc.append_node(root);
std::string xml_as_string;
rapidxml::print(std::back_inserter(xml_as_string), doc);
std::ofstream fileStored("file_stored.xml");
fileStored << xml_as_string;
fileStored.close();
doc.clear();
}
解决方案
你的问题可能就在这里。
char d = std::get<0>(tuple).key;
key->value(&d, 1);
RapidXML 存储您传递给 value() 的指针,而不是它指向的字符串。所以每次循环你的“价值”都指向同一个东西 - 'd'。
您应该使用key->value(doc.allocate_string(&d, 1))
将字符数据的副本添加到密钥。同理,以后换node->value
。
这绝对是#1 RapidXML 问题。
推荐阅读
- multidimensional-array - 在 3D numpy ndarray 中平均轴 1 的每个 n 元素
- java - 逗号之间的正则表达式单词
- android - 未调用 onDateSet()
- c# - 滑动移动到定义的坐标
- reactjs - 反应,将功能作为道具传递给不同的组件
- javascript - 在 discord.js 中为禁令/踢球添加“原因”
- python - 用于比较多个数据列的循环 T 检验
- javascript - 不同项目的 React js 安装
- javascript - Datepicker jquery如何在今天之后的2个未来天禁用
- elasticsearch - 如何搜索多个字段并汇总分数?