Sunday, 14 October 2012

Xerces: Reading an XML file and printing it out

As I mentioned in the Xerces introductory post, here is the first program:

I have created an XML file called books.xml located in the XML directory.

All the operations will be done in the DomReader class.


//Program tested on Microsoft Visual Studio 2010 - Zahid Ghadialy
//Example demonstrates reading an XML file and printing it out

#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include "DomReader.h"

using namespace std;
int main()
  string xmlFileName="..\\..\\XML\\books.xml";
  DomReader myDomReader;
  catch (runtime_error e)
    cout << e.what() <<endl;
    cout << "Unexpected error occurred" << endl;
  return 0;


#include <string>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>

using namespace std;
class DomReader
  void readDomFile(std::string&) throw(std::runtime_error);
  void convertDomToXmlString(DOMNode* domNode, std::string &) throw(std::runtime_error);
  string narrow( const wstring& str );
  xercesc::XercesDOMParser *domFileParser;


#include <iostream>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "DomReader.h"

  domFileParser = new XercesDOMParser;
  domFileParser->setDoNamespaces(false);    // optional
    delete domFileParser;
void DomReader::readDomFile(string& domFileName) throw(std::runtime_error)
  //Check if filename / file is good
  struct _stat fileStatus;
  int returnStat = _stat(domFileName.c_str(), &fileStatus);
  if ( returnStat == ENOENT )
    throw ( runtime_error("Path file_name does not exist, or path is an empty string.") );
  else if ( returnStat == ENOTDIR )
    throw ( std::runtime_error("A component of the path is not a directory."));
  else if( returnStat == ELOOP )
    throw ( std::runtime_error("Too many symbolic links encountered while traversing the path."));
  else if( returnStat == EACCES )
    throw ( std::runtime_error("Permission denied."));
  else if( returnStat == ENAMETOOLONG )
    throw ( std::runtime_error("File can not be read\n"));
  else if( returnStat == -1)
    throw ( std::runtime_error("Other Unknown Error\n"));
  //Parse the file
  //No need to free this pointer - owned by the parent parser object
  DOMDocument* xmlDoc = domFileParser->getDocument();
  if( !xmlDoc ) throw(std::runtime_error( "DOM document could not be opened" ));
  //Get the top-level element: Name is "root". No attributes for "root"
  DOMElement* elementRoot = xmlDoc->getDocumentElement();
  if( !elementRoot ) throw(std::runtime_error( "empty XML document" ));
  string xmlString;
    convertDomToXmlString(elementRoot, xmlString);
  catch(runtime_error e)
  cout << "DOM File: "<< domFileName << " output is as follows "<<endl;
  cout << xmlString;
  cout << endl;
void DomReader::convertDomToXmlString(DOMNode* domNode, string &xmlString) throw(std::runtime_error)
    DOMImplementation *domImpl = DOMImplementationRegistry::getDOMImplementation(L"LS");
    DOMLSSerializer   *domSerializer = ((DOMImplementationLS*)domImpl)->createLSSerializer();
    XMLCh *xmlBuffer = domSerializer->writeToString(domNode);
    xmlString = narrow(xmlBuffer);
    XMLString::release (&xmlBuffer);
    delete domSerializer;
  catch(XMLException& e)
    char *xmlErrMessage = XMLString::transcode(e.getMessage());
    throw runtime_error(xmlErrMessage);
    throw runtime_error("Unknown error in convertDomToXmlString\n");
string DomReader::narrow( const wstring& str )
  ostringstream stm ;    
  const ctype<char>& ctfacet = use_facet< ctype<char> >( stm.getloc() ) ;    
  for( size_t i=0 ; i<str.size() ; ++i )
    stm << ctfacet.narrow( str[i], 0 ) ;    
  return stm.str() ;

The output is as follows:

Saturday, 13 October 2012

Xerces for C++ Using Visual Studio 2010

It has been long since the last updates to this blog. I am in process of using Xerces-C++ for doing some coding and am going to write some posts on that. Clearly I have to say that this is my attempt to learn and I will be making lots of mistakes as a result. Having said that I am hoping that some of the people who are experts will correct me and provide good suggestions, better solutions.

I am also happy if someone else wants to write some blog posts on this topic or general C++ as long as there are enough examples to get your point across.

My Configuration:

Visual Studio 2010

Xerces is xerces-c-3.1.1-x86-windows-vc-10.0 that I have installed (copied) at: C:\Program Files. Downloaded from

The following will need to be added in the properties
In Include Directories add - C:\Program Files\xerces-c-3.1.1-x86-windows-vc-10.0\include;
In Library Directories add - C:\Program Files\xerces-c-3.1.1-x86-windows-vc-10.0\lib;
In Additional dependancies add - xerces-c_3D.lib; --> Note that this is for Debug configuration, for Release configuration you will need the release .lib

I also use Notepad++ to write XML files manually, available at:

The directory structure for the code is as follows

I will be using the xml files in XML directory and if needed will write output there  
These programs will use XML and DOM so its a good idea to learn a bit about it. Use the link for XML and DOM.

Here are some of the other sites (working list) I am following for this topic and will be referring to examples from here.