How to parse an XML file with RapidXml How to parse an XML file with RapidXml xml xml

How to parse an XML file with RapidXml


RapidXml comes with a class to do this for you, rapidxml::file in the rapidxml_utils.hpp file.Something like:

#include "rapidxml_utils.hpp"int main() {    rapidxml::file<> xmlFile("somefile.xml"); // Default template is char    rapidxml::xml_document<> doc;    doc.parse<0>(xmlFile.data());...}

Note that the xmlFile object now contains all of the data for the XML, which means that once it goes out of scope and is destroyed the doc variable is no longer safely usable. If you call parse inside of a function, you must somehow retain the xmlFile object in memory (global variable, new, etc) so that the doc remains valid.


New to C++ myself... but I wanted to share a solution.

YMMV!

Shout Out to SiCrane on this thread: -- and just replacing 'string' with a vector --- (thanks anno)

Please comment and help me learn also! I'm very new to this

Anyway, this seems to work for a good start:

#include <iostream>#include <fstream>#include <vector>#include "../../rapidxml/rapidxml.hpp"using namespace std;int main(){   ifstream myfile("sampleconfig.xml");   rapidxml::xml_document<> doc;   /* "Read file into vector<char>"  See linked thread above*/   vector<char> buffer((istreambuf_iterator<char>(myfile)), istreambuf_iterator<char>( ));   buffer.push_back('\0');   cout<<&buffer[0]<<endl; /*test the buffer */   doc.parse<0>(&buffer[0]);    cout << "Name of my first node is: " << doc.first_node()->name() << "\n";  /*test the xml_document */}


We usually read the XML from the disk into a std::string, then make a safe copy of it into a std::vector<char> as demonstrated below:

string input_xml;string line;ifstream in("demo.xml");// read file into input_xmlwhile(getline(in,line))    input_xml += line;// make a safe-to-modify copy of input_xml// (you should never modify the contents of an std::string directly)vector<char> xml_copy(input_xml.begin(), input_xml.end());xml_copy.push_back('\0');// only use xml_copy from here on!xml_document<> doc;// we are choosing to parse the XML declaration// parse_no_data_nodes prevents RapidXML from using the somewhat surprising// behavior of having both values and data nodes, and having data nodes take// precedence over values when printing// >>> note that this will skip parsing of CDATA nodes <<<doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

For a complete source code check:

Read a line from xml file using C++