RapidXML:段错误; first_node() returns 空

RapidXML: Segfault; first_node() returns NULL

我已经尝试了一些事情并且到达了同一个地方。基本上在调用 first_node() 之后我得到 NULL 或无意义的二进制文件,它弄乱了 xterm 然后我需要关闭并重新打开。

首先获取数据。我这样做有两种方式

1.快速XMLfile<>

#include <xml/rapidxml.hpp> //--XML Parser for configuration files
#include <xml/rapidxml_utils.hpp>

//....

file<> xml_l(name_layout.c_str());
class xml_document<> doc_l;
class xml_node<> * node;

//....

doc_l.parse<parse_full>(xml_l.data());

//....

node = doc_l.first_node("window");

if(!node) cerr << "F F F F" << endl;

2。静态变量 可能不是最好的方法。但这似乎是等价的,是我遇到rapidxml::file<>之前的原始方法。几乎一样,只是在函数中获取文件。返回的指针传递给 xml_document::parse().

char * file_get_contents (const string &file) {
    ifstream ifile;
    static vector< vector<char> > xml;
    vector<char> data;


    ifile.exceptions( ifstream::failbit | ifstream::badbit );

    try {
        ifile.open(file.c_str(),ios::in | ios::binary);
        ifile.seekg(0, ios::end);

        data.resize(((int)ifile.tellg())+1);

        ifile.seekg(0, ios::beg);
        ifile.read(&data[0], data.size()-1);
        ifile.close();

        data.back() = '[=13=]';
        xml.push_back(data);

        return const_cast<char *>(&((xml.back())[0]));
    } catch (ifstream::failure e) {
        cerr << "Could not open file: " << file.c_str() << endl;
    }
}

我可以使用任一方法返回的指针并使用 cout 显示整个文件。在这两种情况下,我都从 first_node("window") 返回了 NULL。我得到了我的 censored cerr 打印,我的提示被缩进并且 xterm 无法工作,如下所述。如果我不带参数调用它,我会得到一个元素节点。如果我尝试显示名称或值,我可以看到一个字符(从 name() 永远不会到 value())。看起来有点像白色椭圆形的黑色问号,xterm 停止运行。下一行包含我缩进的提示。按键什么都不做。

尝试在 xml_document/node<> 之前删除 class,但没有任何改变。

样本来自 XML 文件

<!-- language: lang-xml -->
<layout>
<window id="app_header">
    <head>
        <title value="Script Manager" />
        <color
            fgcolor="yellow"
            bgcolor="blue"
            intensity="high"
        />
    </head>
    <height min="1" max="1" value="1" />
    <width value="*" />
    <color
        fgcolor="default"
        bgcolor="default"
    />
</window>
<!--Few more window sections described. Same format. Different height values and colors -->
</layout>

window 不是您的 xml 文件的根节点,layout 是。您需要先获取该节点,然后获取 window 作为它的子节点。

xml_node<> rootNode = doc_l.first_node("layout", 6);
xml_node<> windowNode = rootNode.first_node("window", 6);

Rapidxml 将 xml 解析为层次结构,因此您需要将其作为树遍历。