Hi,

If you REALLY want an efficient and fast way to create an XML document, then
just use:

 sprintf(buffer,"<my xml tags>",parameters)!!
 or
 fprintf(fptr,"<my XML tags>,parameters) to print to a stream.


Sid



-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: Monday, 7 October 2002 6:28 PM
To: [EMAIL PROTECTED]
Subject: XML Generation efficiency




Hi,
My need is to generate XML on the fly and then to store it in a memory
buffer.
Only restriction is that I would like extremely efficient generation of XML.
I
followed the example CreateDOMDocument and generated a XML file. For the XML
file I need  took about 20 seconds for the generation process (file size 10
MB).
I also used the Class XStr mentioned in the example, which the author
mentions
is not the most efficient way to do what is being done.
A similar generation of XML file using other libraries (other than
Xerces-C++)
take 2 seconds. But I am not sure where I am going wrong. Could anyone
suggest
ways on improving the efficiency. Or could anyone suggest alternate ways for
creation of XML so that the generation time can be brought down. I have used
loops and hence the same variable names are used to create multiple brances
of
the tree.

Many thanks in advance.

Below is the code I used to create the XML.


#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMWriter.hpp>
#include <xercesc/framework/StdOutFormatTarget.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLUni.hpp>
#include <iostream.h>
#include <time.h>
//
---------------------------------------------------------------------------
//  This is a simple class that lets us do easy (though not terribly
efficient)
//  trancoding of char* data to XMLCh data.
//
---------------------------------------------------------------------------
class XStr
{
public :
    //
-----------------------------------------------------------------------
    //  Constructors and Destructor
    //
-----------------------------------------------------------------------
    XStr(const char* const toTranscode)
    {
        // Call the private transcoding method
        fUnicodeForm = XMLString::transcode(toTranscode);
    }

    ~XStr()
    {
        delete [] fUnicodeForm;
    }


    //
-----------------------------------------------------------------------

    //
-----------------------------------------------------------------------
    //  Getter methods
    //
-----------------------------------------------------------------------
    const XMLCh* unicodeForm() const
    {
        return fUnicodeForm;
    }

private :
    //
-----------------------------------------------------------------------
    //  Private data members
    //
    //  fUnicodeForm
    //      This is the Unicode XMLCh format of the string.
    //
-----------------------------------------------------------------------
    XMLCh*   fUnicodeForm;
};

#define X(str) XStr(str).unicodeForm()
#define MY_NAME_SPACE "http://my-company.com/namespace";
#define XMLNS_XSI "http://www.w3.org.2003/XMLSchema-instance";
#define XSI_NO_NAME_SPACE_SCHEMA_LOCATION "DDF_Schema\\3GPPdatatype.xsd"
#define IMPI "[EMAIL PROTECTED]"


#define MAX_NUM_SERVICE_PROFILE_PER_IMPI 20
#define MAX_NUM_IMPU_PER_SERVICE_PROFILE 20
#define MAX_NUM_IFC_PER_SERVICE_PROFILE 10
                #define MAX_NUM_SPI_PER_TRIGGER_POINT 25
                       #define MAX_NUM_GROUP_PER_SPI 25
#define MAX_STR_EXM "it is a 256 character string. All junk data. Just to
fill
up space.\
it is a 256 character string. All junk data. Just to fill up space.\
it is a 256 character string. All junk data. Just to fill up space.\
it is a 256 character string. All junk data. repeat"


//
---------------------------------------------------------------------------
//  main
//
---------------------------------------------------------------------------

int main(int argC, char* argV[])
{
    // Initialize the XML4C2 system.
    try
    {
        XMLPlatformUtils::Initialize();
    }

    catch(const XMLException& toCatch)
    {
        char *pMsg = XMLString::transcode(toCatch.getMessage());
        cerr << "Error during Xerces-c Initialization.\n"
             << "  Exception message:"
             << pMsg;
        delete [] pMsg;
        return 1;
    }
        struct timeval timevalP;
        long startUSec, endUSec;
        long startSec, endSec, startuptimeinusec, endtimeinusec;
        int i,j,k,x;

        gettimeofday(&timevalP, NULL);
        startUSec = timevalP.tv_usec;
        startSec = timevalP.tv_sec;
        startuptimeinusec = startSec * 1000000 + startUSec;
        cout << "Start Sec:" <<  startSec << endl;
        cout << "Start uSec:" << startUSec << endl;
        cout << "startuptimeinusec:" << startuptimeinusec << endl;

        DOMImplementation* impl =
DOMImplementationRegistry::getDOMImplementation(X("Core"));

        DOMDocument* doc = impl->createDocument(
                    0,                    // root element namespace URI.
                    X("testdocument"),    // root element name
                    0);                   // document type object (DTD).

        doc->setEncoding(X("UTF-8"));
        doc->setVersion(X("1.0"));
        DOMElement* rootElem = doc->getDocumentElement();

        /* IMS Subscription */
        DOMElement*  IMSElem = doc->createElement(X("IMSSubscription"));
        rootElem->appendChild(IMSElem);

        /* PrivateID */
        DOMElement*  PriIDElem = doc->createElement(X("PrivateID"));
        IMSElem->appendChild(PriIDElem );
        PriIDElem->setAttribute(X("index"),X("0"));
        DOMText*    PriIDdataval = doc->createTextNode(X(MAX_STR_EXM));
        PriIDElem->appendChild(PriIDdataval );

        /* ServiceProfile  1..20 */
        for (i=0; i<MAX_NUM_SERVICE_PROFILE_PER_IMPI ; i++){

        DOMElement*  ServProElem = doc->createElement(X("ServiceProfile"));
        IMSElem->appendChild(ServProElem);
        ServProElem->setAttribute(X("index"),X("0"));
                /*Public Identity */
                DOMElement*  PubIDElem =
doc->createElement(X("PublicIdentity"));
                ServProElem->appendChild(PubIDElem);
                PubIDElem->setAttribute(X("index"),X("0"));
                        /* Identity */
                        DOMElement*  IDElem =
doc->createElement(X("Identity"));
                        PubIDElem->appendChild(IDElem);
                        IDElem->setAttribute(X("index"),X("0"));
                        DOMText*    IDDataval =
doc->createTextNode(X(MAX_STR_EXM));
                        IDElem->appendChild(IDDataval);

                        /* Barring Indication */
                        DOMElement*  BarrIndElem =
doc->createElement(X("BarringIndication"));
                        PubIDElem->appendChild(BarrIndElem);
                        BarrIndElem->setAttribute(X("index"),X("0"));
                        DOMText*    BarrIndDataval =
doc->createTextNode(X(MAX_STR_EXM));
                        BarrIndElem->appendChild(BarrIndDataval );



        /* Initial filter Criteria 1..10
---------------------------------------------------*/
        for (x=0; x<MAX_NUM_IFC_PER_SERVICE_PROFILE; x++){

        DOMElement*  IFCElem =
doc->createElement(X("InitialFilterCriteria"));
        ServProElem->appendChild(IFCElem );
                /* Priority */
                DOMElement*  PrioElem = doc->createElement(X("Priority"));
                IFCElem->appendChild(PrioElem );
                PrioElem->setAttribute(X("index"),X("0"));
                DOMText*    PrioDataval = doc->createTextNode(X("0"));
                PrioElem->appendChild(PrioDataval);

                /* Trigger Point */
                DOMElement*  TrigPntElem =
doc->createElement(X("TriggerPoint"));
                IFCElem->appendChild(TrigPntElem );
                TrigPntElem->setAttribute(X("index"),X("0"));

                        /* ConditionTypeCNF*/
                        DOMElement*  CondTCNFElem =
doc->createElement(X("ConditionTypeCNF"));
                        TrigPntElem->appendChild(CondTCNFElem );
                        CondTCNFElem->setAttribute(X("index"),X("0"));
                        DOMText*    CondTCNFDataval =
doc->createTextNode(X("0"));
                        CondTCNFElem->appendChild(CondTCNFDataval );

                        /* SPI -----------------*/
                        for (j=0; j<MAX_NUM_SPI_PER_TRIGGER_POINT; j++){
                        DOMElement*  SPIElem = doc->createElement(X("SPI"));
                        TrigPntElem->appendChild(SPIElem );
                        SPIElem->setAttribute(X("index"),X("0"));

                                /* Condition Negated */
                                DOMElement*  CondNegElem=
doc->createElement(X("ConditionNegated"));
                                SPIElem->appendChild(CondNegElem);
 
CondNegElem->setAttribute(X("index"),X("0"));
                                DOMText*    CondNegDataval =
doc->createTextNode(X("0"));
                                CondNegElem->appendChild(CondNegDataval );

                                /* Group -------*/
                                for (k=0; k<MAX_NUM_GROUP_PER_SPI; k++){
                                        DOMElement*  GroupElem=
doc->createElement(X("Group"));
                                        SPIElem->appendChild(GroupElem);

GroupElem->setAttribute(X("index"),X("0"));
                                        DOMText*    GroupDataval =
doc->createTextNode(X("0"));
 
GroupElem->appendChild(GroupDataval);
                                } // Group iterations end here

                                /* Method */
                                DOMElement*  MethodElem=
doc->createElement(X("Method"));
                                SPIElem->appendChild(MethodElem);
                                MethodElem->setAttribute(X("index"),X("0"));
                                DOMText*    MethodDataval =
doc->createTextNode(X(MAX_STR_EXM));
                                MethodElem->appendChild(MethodDataval);


                                /* SIP Header*/
                                DOMElement*  SIPHeadElem=
doc->createElement(X("SIPHeader"));
                                SPIElem->appendChild(SIPHeadElem);
 
SIPHeadElem->setAttribute(X("index"),X("0"));

                                        /* Header*/
                                        DOMElement*  HeadElem=
doc->createElement(X("Header"));
                                        SIPHeadElem->appendChild(HeadElem);

HeadElem->setAttribute(X("index"),X("0"));
                                        DOMText*    HeadDataval =
doc->createTextNode(X(MAX_STR_EXM));
                                        HeadElem->appendChild(HeadDataval);

                                        /* Content */
                                        DOMElement*  ContentElem=
doc->createElement(X("Content"));
 
SIPHeadElem->appendChild(ContentElem);

ContentElem->setAttribute(X("index"),X("0"));
                                        DOMText*    ContentDataval =
doc->createTextNode(X(MAX_STR_EXM));

ContentElem->appendChild(ContentDataval);


                                /* Session Case*/
                                DOMElement*  SessionCaseElem=
doc->createElement(X("SessionCase"));
                                SPIElem->appendChild(SessionCaseElem);

SessionCaseElem->setAttribute(X("index"),X("0"));
                                DOMText*    SessionCaseDataval =
doc->createTextNode(X("0"));

SessionCaseElem->appendChild(SessionCaseDataval);


                                /* Session Description*/
                                DOMElement*  SessDescElem=
doc->createElement(X("SesssionDescription"));
                                SPIElem->appendChild(SessDescElem);
 
SessDescElem->setAttribute(X("index"),X("0"));


                                        /* Line */
                                        DOMElement*  LineElem=
doc->createElement(X("Line"));
                                        SessDescElem->appendChild(LineElem);

LineElem->setAttribute(X("index"),X("0"));
                                        DOMText*    LineDataval =
doc->createTextNode(X(MAX_STR_EXM));
                                        LineElem->appendChild(LineDataval);

                                        /* Content */
                                        DOMElement*  SDContentElem=
doc->createElement(X("Content"));

SessDescElem->appendChild(SDContentElem);

SDContentElem->setAttribute(X("index"),X("0"));
                                        DOMText*    SDContentDataval =
doc->createTextNode(X(MAX_STR_EXM));

SDContentElem->appendChild(SDContentDataval);

                }//SPI iterations end here


                /* Application Server */
                DOMElement*  AppServerElem=
doc->createElement(X("ApplicationServer"));
                IFCElem->appendChild(AppServerElem);
                AppServerElem->setAttribute(X("index"),X("0"));


                        /*Server Name */
                        DOMElement*  ServerNameElem=
doc->createElement(X("ServerName"));
                        AppServerElem->appendChild(ServerNameElem);
                        ServerNameElem->setAttribute(X("index"),X("0"));
                        DOMText*    ServerNameDataval =
doc->createTextNode(X(MAX_STR_EXM));
                        ServerNameElem->appendChild(ServerNameDataval);

                        /* Default Handling*/
                        DOMElement*  DefaultHElem =
doc->createElement(X("DefaultHandling"));
                        AppServerElem->appendChild(DefaultHElem );
                        DefaultHElem->setAttribute(X("index"),X("0"));
                        DOMText*    DefaultHDataval =
doc->createTextNode(X("0"));
                        DefaultHElem->appendChild(DefaultHDataval);


                        /*Service Info */
                        DOMElement*  ServiceInfoElem =
doc->createElement(X("ServiceInfo"));
                        AppServerElem->appendChild(ServiceInfoElem );
                        ServiceInfoElem->setAttribute(X("index"),X("0"));
                        DOMText*    ServiceInfoDataval =
doc->createTextNode(X(MAX_STR_EXM));
                        ServiceInfoElem->appendChild(ServiceInfoDataval);
        }//IFC iterations end here
        } //Service Profile Iteration ends here


        /* Serialize */


                        // get a serializer, an instance of DOMWriter
                        XMLCh tempStr[100];
                        XMLString::transcode("LS", tempStr, 99);
                        DOMImplementation *implw          =
DOMImplementationRegistry::getDOMImplementation(tempStr);
                        DOMWriter         *theSerializer =
((DOMImplementationLS*)implw)->createDOMWriter();


                        XMLFormatTarget *myFormTarget = new
StdOutFormatTarget();


                        // do the serialization through
DOMWriter::writeNode();
                        //
                        theSerializer->writeNode(myFormTarget, *doc);

                        delete theSerializer;


        doc->release();
        XMLPlatformUtils::Terminate();

        gettimeofday(&timevalP, NULL);
        endSec = timevalP.tv_sec;
        endUSec = timevalP.tv_usec;
        endtimeinusec = endSec * 1000000 + endUSec;
        cout << "\nEnd Sec:"<< endSec << endl;
        cout << "End uSec:" <<  endUSec << endl;
        cout << " endtimeinusec:" << endtimeinusec << endl;

        cout << "\nTime Taken:secs "<< endSec-startSec << endl;
        cout << "Time Taken:microsecs "<< endUSec-startUSec << endl;
        cout << "Diff of start & end Time:microsecs "<< endtimeinusec -
startuptimeinusec << endl;
    return 0;
}


DISCLAIMER: This message is proprietary to Hughes Software Systems
Limited (HSS) and is intended solely for the use of the individual
to whom it is addressed. It may contain  privileged or confidential
information  and should not be circulated or used for any purpose other
than for what it is intended. If you have received this message in error,
please notify the originator immediately. If you are not the intended
recipient, you are notified that you are strictly prohibited from using,
copying, altering, or disclosing the contents of this message. HSS accepts
no responsibility for loss or damage arising from the use of the information
transmitted by this email including damage from virus.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to