When I run this it prints x: 400 Next: y continuously. Why doesn't it go to the next sibling when it repeats? I'm following an example from the RapidXML manual so it should work.
data.xml
<?xml version="1.0"?>
<dimensions>
<x>400</x>
<y>400</y>
<z>1</z>
</dimensions>
map.h
#ifndef MAP_H_
#define MAP_H_
class map{
public:
std::vector<int> get_xml();
};
#endif
map.cpp
#include <vector>
#include <iostream>
#include "../lib/rapidxml.hpp"
#include "../lib/rapidxml_print.hpp"
#include "../lib/rapidxml_utils.hpp"
using std::vector;
using std::cout;
using std::endl;
using namespace rapidxml;
vector<int> map::get_xml(){
file<> xmlFile("res/data.xml");
cout<<"XML loaded"<<endl;
xml_document<> doc;
xml_node<> *dims=doc.first_node("dimensions");
vector<int> values;
cout<<"Dimensions loaded"<<endl;
for(xml_node<> *dim=dims->first_node();dim;dim->next_sibling()){
cout<<dim->name()<<": "<<dim->value()<<endl
<<"Next: "<<dim->next_sibling()->name()<<endl;
values.push_back(atoi(dim->value()));
}
cout<<"All values loaded"<<endl;
return values;
}
main.cpp
#include <vector>
#include "map.h"
map Map;
int main(int argc, char** argv){
std::vector<int> dims=Map.get_xml();
...
}
RapidXML Docs say:
function xml_node::next_sibling
Synopsis
xml_node<Ch>* next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;
Description
Gets next sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use parent() to test if node has a parent.
Parameters
name
Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
Returns
Pointer to found sibling, or 0 if not found.
So dim->next_sibling()
does not modify dim itself. You have to type dim = dim->next_sibling()
as the final parameter of the for
loop.