我正在尝试将一些xml字符串解析为xml_document,并将xml_document保存为变量以供进一步使用。 解析xml_document之后直接可用,但是我无法从其他方法访问它。
这里是示例代码: XML.h
//
// Created by artur on 18.07.18.
//
#ifndef PLSMONITOR_XML_H
#define PLSMONITOR_XML_H
#include <rapidxml/rapidxml.hpp>
class XML {
public:
XML();
void print();
private:
rapidxml::xml_document<> _store_xml;
};
#endif //PLSMONITOR_XML_H
XML.cpp
//
// Created by artur on 18.07.18.
//
#include "XML.h"
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
XML::XML() {
std::string str{"<Store>"
" <Field1>1</Field1>"
"</Store>"
""};
char* cstr = new char[str.size() + 1];
strcpy (cstr, str.c_str());
_store_xml.parse<0>(cstr);
// this prints the 1
cout <<_store_xml.first_node("Store")->first_node("Field1")->value() << endl;
delete [] cstr;
}
void XML::print() {
// this exits with Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
cout <<_store_xml.first_node("Store")->first_node("Field1")->value() << endl;
}
int main(int argc, char *argv[]) {
cout << "Test of XML" << endl;
XML xml{};
xml.print();
}
在构造函数中使用xml_document很好,但是在print方法中使用它会崩溃。这是控制台输出:
XML测试 1
以退出代码139(被信号11中断)完成的过程: SIGSEGV)
有人知道如何正确使用RapidXML文档并保存xml结构以备将来使用吗?
谢谢
答案 0 :(得分:0)
问题在于,您在处置文档之前将xml字符串处置为stated in the documentation,这违反了xml_document::parse
方法的约定
字符串必须在文档的整个生命周期内都保持不变。
xml_document
不会复制字符串内容,以避免额外的内存分配,因此必须使字符串保持活动状态。您可能可以将字符串作为类字段。还要注意,在C ++ 17中,字符串类中有一个非常量限定的data
方法,因此不需要分配另一个临时缓冲区。