Question

    #include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/util/XMLString.hpp>
#include <conio.h>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;


class ErnstSax2Handler : public DefaultHandler 
{
public:
ErnstSax2Handler(void);
virtual ~ErnstSax2Handler(void);

void startElement(
    const   XMLCh* const    uri,
    const   XMLCh* const    localname,
    const   XMLCh* const    qname,
    const   Attributes&     attrs
);
void endElement(
    const   XMLCh* const    uri,
    const   XMLCh* const    localname,
    const   XMLCh* const    qname
);
void characters(
    const   XMLCh* const    chars,
    const   XMLSize_t       length
);

void fatalError(const SAXParseException&);

protected:
// define variables to save the state
};

void ErnstSax2Handler::startElement(const   XMLCh* const    uri,
                        const   XMLCh* const    localname,
                        const   XMLCh* const    qname,
                        const   Attributes&     attrs)
{
char* name = XMLString::transcode(localname);
cout<<name;
// ...
XMLString::release(&name);
}
void ErnstSax2Handler::endElement(
                const   XMLCh* const    uri,
                const   XMLCh* const    localname,
                const   XMLCh* const    qname)
{
char* name = XMLString::transcode(localname);

//...
XMLString::release(&name);
}
void ErnstSax2Handler::fatalError(const SAXParseException& exception)
{
char* message = XMLString::transcode(exception.getMessage());
cout << "Fatal Error: " << message
     << " at line: " << exception.getLineNumber()
     << endl;
XMLString::release(&message);
}
void ErnstSax2Handler::characters(
const   XMLCh* const    chars,
const   XMLSize_t       length
)
{
 // This is called when the parser is reading text.
 // You will need to save what state you are in via
 // startElement / endElement.
 }


int main () {

    try {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Error during initialization! :\n";
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return 1;
    }

    char* xmlFile = "test.xml";
    SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
    parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
    parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional

    DefaultHandler* defaultHandler = new DefaultHandler();
    xercesc::ContentHandler* h  = new DefaultHandler();

    parser->setContentHandler(h);
    parser->setErrorHandler(defaultHandler);

    try {
        parser->parse(xmlFile);
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (const SAXParseException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (...) {
        cout << "Unexpected Exception \n" ;
        return -1;
    }


    getch();
    delete parser;
    delete defaultHandler;
    return 0;
}

When I run above code in visual studio 2010, it won't print any element name and their content on the screen. Can anybody help me how to call any handler and how to get content from elements(nodes)? Thanx in advance.

Was it helpful?

Solution

you are creating the default handlers and pass those to the parser which is not what you want to do as I guess:

DefaultHandler* defaultHandler = new DefaultHandler();
xercesc::ContentHandler* h  = new DefaultHandler();

parser->setContentHandler(h);
parser->setErrorHandler(defaultHandler);

Instead you need to create your own classes:

DefaultHandler* defaultHandler = new ErnstSax2Handler();
xercesc::ContentHandler* h  = new ErnstSax2Handler();

Hope this helps.

OTHER TIPS

If someone would like to compile this code: you must remove the declaration of the default constructor from the class, or you must provide an implementation.

eg.

public:
//ErnstSax2Handler(void);
//virtual ~ErnstSax2Handler(void);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top