我尝试了一些事情,并到达了同一个地方。基本上在调用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>
答案 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解析为层次结构,因此您需要将其作为树遍历。