
I've been looking at a bunch of C++ libraries for parsing XML and RapidXML
looks very interesting to me. They have some very impressive benchmarks on
their site due to it being a in-situ parser:
http://rapidxml.sourceforge.net/ (way faster than most other XML parsers).
I think that this is something that can be most useful for many of us. I
know that existing boost libs can get this done but probably more complex
than an exclusive lib for XML parsing.
Anyway, I cannot find samples anywhere and I am not experienced enough to
know how to use the lib. This is working code that I have so far (important
comments include):
#include "../test_utils.hpp"
#include "../../rapidxml.hpp"
#include "../../rapidxml_utils.hpp"
#include "../../rapidxml_print.hpp"
#include <string>
#include <vector>
#include <fstream>
#include <stdexcept>
#include <cstring>
#include <sstream>
using namespace std;
void test()
{
char xml[] = "<?xml version=\"1.0\" encoding=\"latin-1\"?>"
"<book>"
"</book>";
//Parse the original document
rapidxml::xml_document<> doc; // character type defaults to char
doc.parse<0>(xml); // 0 means default parse flags
// doc object is now a root of DOM tree containing representation of the
parsed XML.
// Because all RapidXml interface is contained inside namespace rapidxml,
users must either bring contents of this namespace into scope, or fully
qualify all the names.
// Class xml_document represents a root of the DOM hierarchy. By means of
public inheritance, it is also an xml_node and a memory_pool.
// Template parameter of xml_document::parse() function is used to specify
parsing flags, with which you can fine-tune behaviour of the parser.
// Note that flags must be a compile-time constant.
// To access the DOM tree, use methods of xml_node and xml_attribute
classes:
std::cout << "Name of my first node is: " << doc.first_node()->name() <<
"\n"; // Name of my first node is: book
// This works but is less descriptive than 'Create proper node type' below
//rapidxml::xml_node<> *node;
// Create proper node type
rapidxml::xml_node<char> *node = 0;
node = doc.allocate_node(/*rapidxml::node_declaration*/
rapidxml::node_element, "author", "John Doe");
doc.first_node()->append_node(node);
node = doc.allocate_node(rapidxml::node_element, "author", "Jane Doe");
doc.first_node()->append_node(node);
node = doc.allocate_node(rapidxml::node_element, "author", "Bob Doe");
doc.first_node()->append_node(node);
std::stringstream ss;
ss << *doc.first_node();
std::string result_xml = ss.str();
std::cout <