RapidXML:Segfault; first_node()返回NULL

时间:2016-03-01 16:14:59

标签: c++ rapidxml

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

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

1。 RapidXML file<>

#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() = '\0';
        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显示整个文件。这两种情况我从NULL返回first_node("window")。我得到了我的审查cerr打印,我的提示缩进,xterm无法正常工作,如下所述。如果我没有参数调用它,我会得到一个元素节点。如果我尝试显示名称或值,我可以看到一个字符(来自name()从未进入value())。看起来有点像白色椭圆形的黑色问号,xterm停止运作。下一行包含我的提示缩进。按键无效。

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

来自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>

1 个答案:

答案 0 :(得分:2)

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

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

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